<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use App\Services\TwoFactorService;
use Illuminate\Http\Request;

class TwoFactorEnrollController extends Controller
{
    public function __construct(
        protected TwoFactorService $twoFactor
    ) {}

    public function show(Request $request)
    {
        $user = $this->pendingUser($request);
        if (! $user) {
            return redirect()->route('login');
        }

        if (! $this->twoFactor->mustEnroll($user)) {
            return redirect()->route('two-factor.challenge');
        }

        return view('auth.two-factor-enroll', [
            'userName' => $user->name,
            'defaultMethod' => $this->twoFactor->companyDefaultMethod($user),
        ]);
    }

    public function enableEmail(Request $request)
    {
        $user = $this->pendingUser($request);
        if (! $user) {
            return redirect()->route('login');
        }

        $this->twoFactor->enableEmail($user);
        $this->twoFactor->sendLoginCode($user);

        return redirect()->route('two-factor.challenge')
            ->with('success', 'Email verification enabled. Enter the code we sent you.');
    }

    public function enableTotp(Request $request)
    {
        $user = $this->pendingUser($request);
        if (! $user) {
            return redirect()->route('login');
        }

        $secret = $this->twoFactor->enableTotp($user);

        return redirect()->route('two-factor.challenge')->with([
            'success' => 'Authenticator enabled. Enter the 6-digit code from your app.',
            'totp_secret' => $secret,
        ]);
    }

    protected function pendingUser(Request $request): ?\App\Models\User
    {
        if (! $request->session()->has('login.id')) {
            return null;
        }

        return \App\Models\User::find($request->session()->get('login.id'));
    }
}
