<?php

namespace App\Models;

use App\Traits\Auditable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Hash;

class JefeOperativoPeaje extends Model
{
    use Auditable;

    /**
     * Tabla asociada
     */
    protected $table = 'jefe_operativo_peajes';

    /**
     * Clave primaria
     */
    protected $primaryKey = 'asignacion_id';

    /**
     * Sin timestamps automáticos
     */
    public $timestamps = false;

    /**
     * Campos asignables
     */
    protected $fillable = [
        'jefe_id',
        'id_centro',
        'pin_hash',
        'pin_intentos_fallidos',
        'pin_bloqueado_hasta',
        'estado',
        'usuario_asigna',
    ];

    /**
     * Campos ocultos
     */
    protected $hidden = [
        'pin_hash',
    ];

    /**
     * Casting de atributos
     */
    protected function casts(): array
    {
        return [
            'pin_intentos_fallidos' => 'integer',
            'pin_bloqueado_hasta' => 'datetime',
            'estado' => 'integer',
            'fecha_asigna' => 'datetime',
            'fecha_modifica' => 'datetime',
        ];
    }

    /**
     * Relación con Jefe (Usuario)
     */
    public function jefe()
    {
        return $this->belongsTo(Usuario::class, 'jefe_id', 'usu_id');
    }

    /**
     * Relación con Peaje/Centro
     */
    public function centro()
    {
        return $this->belongsTo(PeajeCentro::class, 'id_centro', 'id_centro');
    }

    /**
     * Relación con Usuario que asignó
     */
    public function usuarioAsigna()
    {
        return $this->belongsTo(Usuario::class, 'usuario_asigna', 'usu_id');
    }

    /**
     * Scope activos
     */
    public function scopeActivos($query)
    {
        return $query->where('estado', 1);
    }

    /**
     * Scope por jefe
     */
    public function scopePorJefe($query, int $jefeId)
    {
        return $query->where('jefe_id', $jefeId);
    }

    /**
     * Scope por centro
     */
    public function scopePorCentro($query, int $centroId)
    {
        return $query->where('id_centro', $centroId);
    }

    /**
     * Establecer PIN (encriptado con SHA256 para coincidir con SP)
     */
    public function establecerPin(string $pin): bool
    {
        // El SP usa SHA2(pin, 256), así que usamos el mismo método
        $this->pin_hash = hash('sha256', $pin);
        $this->pin_intentos_fallidos = 0;
        $this->pin_bloqueado_hasta = null;
        return $this->save();
    }

    /**
     * Validar PIN
     */
    public function validarPin(string $pin): bool
    {
        return $this->pin_hash === hash('sha256', $pin);
    }

    /**
     * Verificar si está bloqueado
     */
    public function estaBloqueado(): bool
    {
        if ($this->pin_bloqueado_hasta === null) {
            return false;
        }
        return now()->lt($this->pin_bloqueado_hasta);
    }

    /**
     * Incrementar intentos fallidos
     */
    public function incrementarIntentosFallidos(): void
    {
        $this->pin_intentos_fallidos++;

        // Bloquear después de 3 intentos
        if ($this->pin_intentos_fallidos >= 3) {
            $this->pin_bloqueado_hasta = now()->addMinutes(15);
        }

        $this->save();
    }

    /**
     * Resetear intentos fallidos
     */
    public function resetearIntentos(): void
    {
        $this->pin_intentos_fallidos = 0;
        $this->pin_bloqueado_hasta = null;
        $this->save();
    }

    /**
     * Obtener intentos restantes
     */
    public function getIntentosRestantesAttribute(): int
    {
        return max(0, 3 - $this->pin_intentos_fallidos);
    }
}
