<?php

namespace App\Http\Controllers;

use App\Mail\ContratoGeradoMail;
use App\Models\AuditLog;
use App\Models\Contrato;
use App\Services\WebhookService;
use App\Models\ModeloContrato;
use App\Models\Notificacao;
use Barryvdh\DomPDF\Facade\Pdf;
use Illuminate\Support\Facades\Mail;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;

class ContratoController extends Controller
{
    public function index()
    {
        $contratos = Contrato::orderBy('updated_at', 'desc')->get();

        $stats = [
            'total'     => $contratos->count(),
            'ativos'    => $contratos->where('status_workflow', 'Ativo')->count(),
            'pendentes' => $contratos->whereNotIn('status_workflow', ['Ativo', 'Encerrado', 'Cancelado', 'Rascunho'])->count(),
            'rascunhos' => $contratos->where('status_workflow', 'Rascunho')->count(),
        ];

        return view('pages.contratos.index', [
            'contratos' => $contratos,
            'stats'     => $stats,
        ]);
    }

    public function create()
    {
        $modelos = ModeloContrato::where('ativo', true)->get();
        $regimes = Contrato::regimes();

        return view('pages.contratos.create', compact('modelos', 'regimes'));
    }

    public function store(Request $request): JsonResponse
    {
        $validated = $request->validate([
            'razao_social'        => 'required|string|max:255',
            'nome_fantasia'       => 'nullable|string|max:255',
            'cnpj'                => 'nullable|string|max:18',
            'regime_tributario'   => 'required|string',
            'codigo_regime'       => 'required|string',
            'cnae_principal'      => 'nullable|string|max:20',
            'qtd_funcionarios'    => 'required|integer|min:0',
            'qtd_prolabore'       => 'nullable|integer|min:0',
            'faturamento_medio'   => 'nullable|numeric|min:0',
            'qtd_bancos'          => 'nullable|integer|min:0',
            'qtd_nf_mes'          => 'nullable|integer|min:0',
            'cidade_uf'           => 'nullable|string|max:100',
            'responsavel_legal'   => 'nullable|string|max:255',
            'cpf_responsavel'     => 'nullable|string|max:14',
            'email'               => 'nullable|email|max:255',
            'telefone'            => 'nullable|string|max:20',
            'honorario'           => 'nullable|numeric|min:0',
            'honorario_detalhes'  => 'nullable|array',
            'responsavel_comercial' => 'nullable|string|max:255',
            'observacoes'         => 'nullable|string',
        ]);

        // Find matching model
        $modelo = ModeloContrato::where('codigo_regime', $validated['codigo_regime'])
            ->where('ativo', true)
            ->first();

        if ($modelo) {
            $validated['modelo_id'] = $modelo->id;
            $validated['clausulas_customizadas'] = $modelo->clausulas;
            $validated['documentos_recebidos'] = array_fill_keys(
                array_column($modelo->documentos_obrigatorios ?? [], 'nome'),
                false
            );
        }

        $validated['status_workflow'] = 'Rascunho';
        $contrato = Contrato::create($validated);

        // Generate content from template
        if ($modelo) {
            $this->gerarConteudo($contrato, $modelo);
        }

        AuditLog::record('contrato.criado', "Contrato criado para {$contrato->razao_social}", $contrato, ['honorario' => $contrato->honorario, 'regime' => $contrato->regime_tributario]);

        if ($contrato->email) {
            try {
                Mail::to($contrato->email)->send(new ContratoGeradoMail($contrato));
            } catch (\Throwable) {}
        }

        WebhookService::fire('contrato.criado', [
            'id'           => $contrato->id,
            'razao_social' => $contrato->razao_social,
            'regime'       => $contrato->regime_tributario,
            'honorario'    => $contrato->honorario,
        ]);

        return response()->json([
            'success'   => true,
            'contrato'  => $contrato,
            'redirect'  => route('contratos.show', $contrato),
        ]);
    }

    public function show(Contrato $contrato)
    {
        $contrato->load('modelo', 'uploads');
        $steps   = Contrato::workflowSteps();
        $regimes = Contrato::regimes();

        return view('pages.contratos.show', compact('contrato', 'steps', 'regimes'));
    }

    public function updateStatus(Request $request, Contrato $contrato): JsonResponse
    {
        $next = $contrato->getNextStatus();
        if (! $next) {
            return response()->json(['success' => false, 'message' => 'Contrato já está no estado final.'], 422);
        }

        $updates = ['status_workflow' => $next];

        match ($next) {
            'Ativo'                          => $updates['ativo_em'] = now(),
            'Aguardando assinatura cliente'  => $updates['aprovado_diretoria_em'] = now(),
            'Aguardando aprovação diretoria' => $updates['aprovado_financeiro_em'] = now(),
            default                          => null,
        };

        $anterior = $contrato->status_workflow;
        $contrato->update($updates);

        AuditLog::record('contrato.status', "Status alterado: {$anterior} → {$next}", $contrato);

        Notificacao::notificarPermissao(
            'acessar_contratos',
            "Contrato: {$next}",
            $contrato->razao_social,
            route('contratos.show', $contrato),
            'info'
        );

        return response()->json(['success' => true, 'status' => $next]);
    }

    public function solicitarAssinatura(Contrato $contrato): JsonResponse
    {
        if (! $contrato->isAguardandoAssinatura()) {
            return response()->json(['success' => false, 'message' => 'Contrato não está aguardando assinatura.'], 422);
        }

        $contrato->solicitarAssinatura();

        return response()->json([
            'success' => true,
            'url'     => $contrato->getSigningUrl(),
        ]);
    }

    public function pdf(Contrato $contrato)
    {
        $html = view('pdf.contrato', ['contrato' => $contrato])->render();

        $pdf = Pdf::loadHTML($html)
            ->setPaper('a4', 'portrait')
            ->setOption('margin_top', 25)
            ->setOption('margin_bottom', 20)
            ->setOption('margin_left', 20)
            ->setOption('margin_right', 20);

        $filename = 'Contrato_' . str_replace(['/', '\\', ' '], '_', $contrato->cnpj ?? $contrato->razao_social) . '.pdf';

        return $pdf->download($filename);
    }

    private function gerarConteudo(Contrato $contrato, ModeloContrato $modelo): void
    {
        $clausulas = $modelo->clausulas ?? [];
        $corpo = '';
        foreach ($clausulas as $i => $clausula) {
            $num = $i + 1;
            $titulo = $clausula['titulo'] ?? "Cláusula {$num}ª";
            $texto  = $clausula['texto']  ?? '';
            $corpo .= "<h3>Cláusula {$num}ª — {$titulo}</h3>\n<p>{$texto}</p>\n\n";
        }

        $template = <<<HTML
<div class="contrato-body">
{$corpo}
</div>
HTML;

        $contrato->update(['conteudo_gerado' => $template]);
    }
}
