<?php

namespace App\Console\Commands;

use App\Jobs\SincronizarEmpresaJob;
use App\Models\Company;
use Illuminate\Console\Command;

class MonitorarXmlCommand extends Command
{
    protected $signature = 'xml:monitor
                            {--company= : Sincroniza apenas o ID ou CNPJ informado}
                            {--force : Ignora o intervalo mínimo entre sincronizações}
                            {--sync : Executa na hora, sem passar pela fila}';

    protected $description = 'Consulta a SEFAZ e baixa os XMLs das notas emitidas contra as empresas cadastradas';

    public function handle(): int
    {
        $empresas = $this->empresas();

        if ($empresas->isEmpty()) {
            $this->components->info('Nenhuma empresa elegível para sincronização.');

            return self::SUCCESS;
        }

        foreach ($empresas as $company) {
            $job = new SincronizarEmpresaJob($company->id, $this->option('sync') ? 'manual' : 'cron');

            if ($this->option('sync')) {
                dispatch_sync($job);
                $company->refresh();
                $this->components->twoColumnDetail(
                    $company->razao_social,
                    sprintf('%s — NSU %d/%d', $company->last_sync_status, $company->ult_nsu, $company->max_nsu),
                );

                continue;
            }

            dispatch($job);
            $this->components->twoColumnDetail($company->razao_social, '<fg=gray>enfileirada</>');
        }

        return self::SUCCESS;
    }

    private function empresas()
    {
        $query = Company::comMonitor()->whereNotNull('cert_path');

        if ($filtro = $this->option('company')) {
            $digits = preg_replace('/\D/', '', $filtro);

            return $query->where(fn ($q) => $q->where('id', $filtro)->orWhere('cnpj', $digits))->get();
        }

        return $query->get()->filter(
            fn (Company $c) => $this->option('force') || $c->podeSincronizar()
        );
    }
}
