<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;

class HojaTiempo extends Model
{
    use HasFactory;

    protected $table = 'hojas_tiempo';

    protected $fillable = [
        'empleado_id', 'periodo_id', 'estado',
        'enviado_at', 'aprobado_at', 'aprobado_por',
    ];

    protected $casts = [
        'enviado_at' => 'datetime',
        'aprobado_at' => 'datetime',
    ];

    public function empleado(): BelongsTo
    {
        return $this->belongsTo(Empleado::class);
    }

    public function periodo(): BelongsTo
    {
        return $this->belongsTo(Periodo::class);
    }

    public function entradas(): HasMany
    {
        return $this->hasMany(EntradaTiempo::class);
    }

    // -------------------------------------------------------
    // CÁLCULOS (lógica equivalente a las fórmulas del Excel)
    // -------------------------------------------------------

    /**
     * Total de horas ingresadas (todas las categorías)
     */
    public function getTotalHorasAttribute(): float
    {
        return (float) $this->entradas()->sum('horas');
    }

    /**
     * Total horas en categorías EXENTAS (vacaciones, incapacidades, etc.)
     */
    public function getHorasExentasAttribute(): float
    {
        return (float) $this->entradas()
            ->whereHas('centroCosto', fn ($q) => $q->where('es_exento', true))
            ->sum('horas');
    }

    /**
     * Horas productivas = total - exentas
     */
    public function getHorasProductivasAttribute(): float
    {
        return max(0, $this->total_horas - $this->horas_exentas);
    }

    /**
     * Horas por día (suma de todos los CC en una fecha)
     */
    public function horasPorDia(): \Illuminate\Support\Collection
    {
        return $this->entradas()
            ->selectRaw('fecha, SUM(horas) as total_dia')
            ->groupBy('fecha')
            ->orderBy('fecha')
            ->get()
            ->keyBy('fecha');
    }

    /**
     * Distribución por centro de costo con totales, % y equivalente monetario
     * Equivale a las columnas TOTAL / % / Equivalente del Excel
     */
    public function distribucionPorCC(): \Illuminate\Support\Collection
    {
        $totalProductivas = $this->horas_productivas;
        $valorHora = $this->empleado->valor_hora;

        return $this->entradas()
            ->with('centroCosto')
            ->selectRaw('centro_costo_id, SUM(horas) as total_horas')
            ->whereHas('centroCosto', fn ($q) => $q->where('es_exento', false))
            ->groupBy('centro_costo_id')
            ->get()
            ->map(function ($entry) use ($totalProductivas, $valorHora) {
                $pct = $totalProductivas > 0
                    ? round(($entry->total_horas / $totalProductivas) * 100, 7)
                    : 0;
                return [
                    'centro_costo' => $entry->centroCosto,
                    'horas' => (float) $entry->total_horas,
                    'porcentaje' => $pct,
                    'equivalente' => round($entry->total_horas * $valorHora, 2),
                ];
            });
    }

    /**
     * Observaciones de uso por centro de costo en esta hoja
     */
    public function observacionesCC(): HasMany
    {
        return $this->hasMany(ObservacionCentroCosto::class, 'hoja_tiempo_id');
    }

    public function getEstadoBadgeAttribute(): string
    {
        return match ($this->estado) {
            'borrador' => 'secondary',
            'enviado' => 'warning',
            'aprobado' => 'success',
            default => 'secondary',
        };
    }
}
