<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use App\Models\Company;
use App\Models\User;
use App\Rules\Cnpj;
use App\Support\SiteSettings;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\Rule;
use Illuminate\Validation\Rules\Password;
use Illuminate\View\View;

class RegisterController extends Controller
{
    public function __construct(private readonly SiteSettings $site) {}

    public function create(): View
    {
        $this->garantirCadastroAberto();

        return view('auth.register', ['ufs' => self::UFS]);
    }

    public function store(Request $request): RedirectResponse
    {
        $this->garantirCadastroAberto();

        $dados = $request->validate([
            'razao_social' => ['required', 'string', 'max:180'],
            'nome_fantasia' => ['nullable', 'string', 'max:180'],
            'cnpj' => ['required', 'string', new Cnpj],
            'ie' => ['nullable', 'string', 'max:20'],
            'uf' => ['required', 'string', Rule::in(self::UFS)],
            'telefone' => ['nullable', 'string', 'max:20'],
            'name' => ['required', 'string', 'max:120'],
            'email' => ['required', 'string', 'email', 'max:180', Rule::unique('users', 'email')],
            'password' => ['required', 'confirmed', Password::min(8)->letters()->numbers()],
            'termos' => ['accepted'],
        ], [], [
            'razao_social' => 'razão social',
            'name' => 'nome',
            'email' => 'e-mail',
            'password' => 'senha',
            'termos' => 'termos de uso',
        ]);

        $cnpj = preg_replace('/\D/', '', $dados['cnpj']);

        if (Company::withTrashed()->where('cnpj', $cnpj)->exists()) {
            return back()
                ->withInput()
                ->withErrors(['cnpj' => 'Este CNPJ já possui cadastro. Faça login ou peça acesso ao administrador da conta.']);
        }

        $user = DB::transaction(function () use ($dados, $cnpj) {
            $company = Company::create([
                'cnpj' => $cnpj,
                'razao_social' => $dados['razao_social'],
                'nome_fantasia' => $dados['nome_fantasia'] ?? null,
                'ie' => $dados['ie'] ?? null,
                'uf' => $dados['uf'],
                'email' => $dados['email'],
                'telefone' => $dados['telefone'] ?? null,
                'plano' => 'trial',
                'assinatura_expira_em' => now()->addDays(14),
            ]);

            return User::create([
                'company_id' => $company->id,
                'name' => $dados['name'],
                'email' => $dados['email'],
                'password' => $dados['password'],
                'role' => User::ROLE_ADMIN,
                'telefone' => $dados['telefone'] ?? null,
            ]);
        });

        Auth::login($user);
        $request->session()->regenerate();

        return redirect()
            ->route('painel.certificado')
            ->with('status', 'Conta criada. Envie o certificado digital A1 para ativar o monitor de XML.');
    }

    /**
     * O master pode fechar o autoatendimento: nesse caso só ele cadastra
     * empresas, pelo painel. Bloqueamos aqui, e não só na navegação.
     */
    private function garantirCadastroAberto(): void
    {
        abort_unless(
            $this->site->bool('login_permitir_cadastro'),
            404,
            'O cadastro de novas empresas está fechado. Fale com o administrador.',
        );
    }

    public const UFS = [
        'AC', 'AL', 'AM', 'AP', 'BA', 'CE', 'DF', 'ES', 'GO', 'MA', 'MG', 'MS', 'MT',
        'PA', 'PB', 'PE', 'PI', 'PR', 'RJ', 'RN', 'RO', 'RR', 'RS', 'SC', 'SE', 'SP', 'TO',
    ];
}
