<?php

namespace App\Console\Commands;

use App\Mail\RecordatorioDiarioMail;
use App\Mail\RecordatorioEmpleadoMail;
use App\Models\Calendario;
use App\Models\Empleado;
use App\Models\EntradaTiempo;
use App\Models\HojaTiempo;
use App\Models\Periodo;
use App\Models\User;
use Carbon\Carbon;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Mail;

class RecordatorioDiario extends Command
{
    protected $signature   = 'hojas:recordatorio-diario {--force : Ejecutar aunque sea fin de semana o festivo}';
    protected $description = 'Envía recordatorio a empleados sin horas hoy y reporte al supervisor';

    public function handle(): int
    {
        $hoy    = Carbon::today();
        $fecha  = $hoy->format('Y-m-d');
        $diaSem = $hoy->dayOfWeek;

        if (!$this->option('force')) {
            if ($diaSem === 0 || $diaSem === 6) {
                $this->info("Hoy es fin de semana ({$fecha}), no se envía recordatorio.");
                return 0;
            }
            $esFestivo = Calendario::where('fecha', $fecha)->where('es_festivo', true)->exists();
            if ($esFestivo) {
                $this->info("Hoy es festivo ({$fecha}), no se envía recordatorio.");
                return 0;
            }
        }

        $periodo = Periodo::activo()->first();
        if (!$periodo) {
            $this->info('No hay período activo.');
            return 0;
        }

        if ($hoy->lt($periodo->fecha_inicio) || $hoy->gt($periodo->fecha_fin)) {
            $this->info("Hoy ({$fecha}) no está dentro del período activo.");
            return 0;
        }

        // Empleados activos con usuario activo
        $empleados = Empleado::activos()
            ->whereHas('user', fn($q) => $q->where('activo', true))
            ->with('user')
            ->orderBy('nombre')
            ->get();

        // Empleados que SÍ registraron horas hoy
        $conHoras = EntradaTiempo::whereHas('hojaTiempo', fn($q) =>
                $q->where('periodo_id', $periodo->id))
            ->where('fecha', $fecha)
            ->where('horas', '>', 0)
            ->pluck('hoja_tiempo_id')
            ->map(fn($id) => HojaTiempo::find($id)?->empleado_id)
            ->filter()->unique();

        $sinHoras = $empleados->filter(fn($emp) => !$conHoras->contains($emp->id));

        $this->info("Período: {$periodo->nombre_completo}");
        $this->info("Total: {$empleados->count()} | Con horas: {$conHoras->count()} | Sin horas: {$sinHoras->count()}");

        if ($sinHoras->isEmpty()) {
            $this->info('Todos los empleados registraron horas hoy. ¡Excelente!');
            return 0;
        }

        // ── 1. Email individual a cada empleado sin horas ──────────────
        $emailsEmpleados = 0;
        foreach ($sinHoras as $emp) {
            if (!$emp->user?->email) continue;
            try {
                Mail::to($emp->user->email)
                    ->send(new RecordatorioEmpleadoMail($emp, $periodo, $hoy));
                $this->info("  ✓ Recordatorio enviado a empleado: {$emp->nombre} <{$emp->user->email}>");
                $emailsEmpleados++;
            } catch (\Exception $e) {
                $this->error("  ✗ Error enviando a {$emp->user->email}: " . $e->getMessage());
                Log::error("RecordatorioDiario empleado [{$emp->nombre}]: " . $e->getMessage());
            }
        }

        // ── 2. Resumen a supervisores y admins ─────────────────────────
        $supervisores = User::where('activo', true)
            ->whereIn('rol', ['supervisor', 'admin'])
            ->get();

        $emailsSup = 0;
        foreach ($supervisores as $sup) {
            try {
                Mail::to($sup->email)->send(new RecordatorioDiarioMail(
                    sinHoras: $sinHoras,
                    periodo:  $periodo,
                    fecha:    $hoy,
                    total:    $empleados->count(),
                    conHoras: $conHoras->count(),
                ));
                $this->info("  ✓ Resumen enviado al supervisor: {$sup->email}");
                $emailsSup++;
            } catch (\Exception $e) {
                $this->error("  ✗ Error enviando a {$sup->email}: " . $e->getMessage());
                Log::error("RecordatorioDiario supervisor [{$sup->email}]: " . $e->getMessage());
            }
        }

        $this->info("Completado: {$emailsEmpleados} recordatorio(s) a empleados, {$emailsSup} resumen(es) a supervisores.");
        return 0;
    }
}
