<?php

namespace App\Http\Controllers\Painel;

use App\Http\Controllers\Controller;
use App\Jobs\SincronizarEmpresaJob;
use App\Models\DfePendente;
use App\Models\SyncLog;
use App\Services\Sefaz\DistribuicaoDfeService;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;

class MonitorController extends Controller
{
    public function edit(Request $request): View
    {
        return view('painel.monitor', [
            'company' => $request->user()->company,
            'logs' => SyncLog::query()->latest()->paginate(15),
            'pendentes' => DfePendente::query()->abertos()->latest('nsu')->limit(20)->get(),
        ]);
    }

    public function update(Request $request): RedirectResponse
    {
        abort_unless($request->user()->isAdmin() || $request->user()->isMaster(), 403);

        $dados = $request->validate([
            'monitor_enabled' => ['boolean'],
            'manifestacao_automatica' => ['boolean'],
            'monitor_intervalo_min' => ['required', 'integer', 'min:60', 'max:1440'],
            'ambiente' => ['required', 'in:1,2'],
        ], [
            'monitor_intervalo_min.min' => 'A SEFAZ recomenda no mínimo 60 minutos entre consultas.',
        ]);

        $company = $request->user()->company;

        if ($dados['monitor_enabled'] ?? false) {
            if (! $company->hasCertificate()) {
                return back()->withErrors(['monitor_enabled' => 'Instale o certificado digital antes de ativar o monitor.']);
            }

            if ($company->certificateExpired()) {
                return back()->withErrors(['monitor_enabled' => 'O certificado digital está vencido.']);
            }
        }

        $company->forceFill([
            'monitor_enabled' => $request->boolean('monitor_enabled'),
            'manifestacao_automatica' => $request->boolean('manifestacao_automatica'),
            'monitor_intervalo_min' => $dados['monitor_intervalo_min'],
            'ambiente' => (int) $dados['ambiente'],
        ])->save();

        return back()->with('status', 'Configurações do monitor salvas.');
    }

    /**
     * Sincronização sob demanda. Roda na hora para dar retorno imediato ao
     * usuário, respeitando o intervalo mínimo exigido pela SEFAZ.
     */
    public function sincronizar(Request $request, DistribuicaoDfeService $dfe): RedirectResponse
    {
        $company = $request->user()->company;

        if (! $company->hasCertificate()) {
            return back()->withErrors(['monitor' => 'Instale o certificado digital A1 para sincronizar.']);
        }

        if ($company->certificateExpired()) {
            return back()->withErrors(['monitor' => 'O certificado digital está vencido.']);
        }

        if ($company->last_sync_at && $company->last_sync_at->addMinutes($company->monitor_intervalo_min)->isFuture()) {
            $proxima = $company->last_sync_at->addMinutes($company->monitor_intervalo_min);

            return back()->withErrors([
                'monitor' => 'A SEFAZ limita a frequência de consultas. Próxima sincronização liberada '.$proxima->diffForHumans().'.',
            ]);
        }

        $log = $dfe->sync($company, 'manual');

        return $log->status === 'error'
            ? back()->withErrors(['monitor' => $log->mensagem])
            : back()->with('status', sprintf(
                'Sincronização concluída: %d nota(s) e %d evento(s) novos.',
                $log->docs_novos,
                $log->eventos_novos,
            ));
    }

    /** Enfileira em vez de rodar na hora — útil para catálogos grandes. */
    public function enfileirar(Request $request): RedirectResponse
    {
        SincronizarEmpresaJob::dispatch($request->user()->company_id, 'manual');

        return back()->with('status', 'Sincronização enfileirada. O resultado aparece aqui em instantes.');
    }
}
