<?php

namespace App\Http\Controllers;

use App\Mail\DemandaStatusMail;
use App\Models\AuditLog;
use App\Models\Demanda;
use App\Services\WebhookService;
use App\Models\Notificacao;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;

class KanbanController extends Controller
{
    private const COLUNAS = [
        'Novo', 'Em análise', 'Em execução',
        'Aguardando cliente', 'Aguardando interno',
        'Revisão/Supervisão', 'Concluído', 'Cancelado',
    ];

    public function index()
    {
        $demandas = Demanda::with('uploads')
            ->orderBy('prioridade_ordem')
            ->orderBy('sla_vencimento')
            ->orderBy('created_at', 'desc')
            ->get()
            ->groupBy('status');

        $stats = [
            'total_abertas'       => Demanda::whereNotIn('status', ['Concluído', 'Cancelado'])->count(),
            'vencidas'            => Demanda::whereNotIn('status', ['Concluído', 'Cancelado'])
                                        ->whereNotNull('sla_vencimento')
                                        ->where('sla_vencimento', '<', now())->count(),
            'vencem_hoje'         => Demanda::whereNotIn('status', ['Concluído', 'Cancelado'])
                                        ->whereDate('sla_vencimento', today())->count(),
            'concluidas_semana'   => Demanda::where('status', 'Concluído')
                                        ->where('updated_at', '>=', now()->startOfWeek())->count(),
        ];

        return view('pages.kanban', [
            'colunas'  => self::COLUNAS,
            'demandas' => $demandas,
            'stats'    => $stats,
        ]);
    }

    public function store(Request $request): JsonResponse
    {
        $validated = $request->validate([
            'titulo'          => 'required|string|max:255',
            'cliente'         => 'required|string|max:255',
            'empresa_cnpj'    => 'nullable|string|max:20',
            'setor'           => 'required|in:Fiscal,Contábil,DP,Financeiro,Legalização',
            'responsavel'     => 'nullable|string|max:255',
            'tipo'            => 'required|in:Abertura,Alteração,Fechamento,Obrigação,Documento,Contrato,Suporte interno',
            'prioridade'      => 'required|in:Baixa,Média,Alta,Crítica',
            'sla_vencimento'  => 'nullable|date',
            'descricao'       => 'nullable|string',
        ]);

        $validated['status'] = 'Novo';
        $demanda = Demanda::create($validated);

        Notificacao::notificarPermissao(
            'acessar_kanban',
            'Nova demanda: ' . $demanda->titulo,
            $demanda->cliente . ' · ' . $demanda->setor,
            route('kanban.index'),
            'info'
        );

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

    public function update(Request $request, Demanda $demanda): JsonResponse
    {
        $validated = $request->validate([
            'status'               => 'sometimes|in:' . implode(',', self::COLUNAS),
            'prioridade'           => 'sometimes|in:Baixa,Média,Alta,Crítica',
            'responsavel'          => 'sometimes|nullable|string|max:255',
            'observacoes_internas' => 'sometimes|nullable|string',
        ]);

        if (isset($validated['status']) && $validated['status'] === 'Concluído') {
            $validated['concluido_em'] = now();
        }

        $demanda->update($validated);

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

    public function updateStatus(Request $request, Demanda $demanda): JsonResponse
    {
        $request->validate(['status' => 'required|in:' . implode(',', self::COLUNAS)]);

        $anterior = $demanda->status;
        $novo     = $request->status;

        $updates = ['status' => $novo];
        if ($novo === 'Concluído') {
            $updates['concluido_em'] = now();
        }

        $demanda->update($updates);

        AuditLog::record('kanban.status', "Demanda '{$demanda->titulo}': {$anterior} → {$novo}", $demanda);

        $slaEmail = config('opcon.sla_email');
        if ($slaEmail) {
            try {
                Mail::to($slaEmail)->send(new DemandaStatusMail($demanda, $novo, $anterior));
            } catch (\Throwable) {}
        }

        WebhookService::fire('demanda.status', [
            'id'       => $demanda->id,
            'titulo'   => $demanda->titulo,
            'anterior' => $anterior,
            'novo'     => $novo,
        ]);

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

    public function destroy(Demanda $demanda): JsonResponse
    {
        $demanda->delete();

        return response()->json(['success' => true]);
    }
}
