<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use App\Models\User;

class MantEstadoHistorial extends Model
{
    /**
     * Tabla asociada
     */
    protected $table = 'mant_estado_historial';

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

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

    /**
     * Campos asignables
     */
    protected $fillable = [
        'prog_id',
        'estado_anterior_id',
        'estado_nuevo_id',
        'latitud',
        'longitud',
        'precision_gps',
        'observaciones',
        'usuario_ejecuta',
    ];

    /**
     * Casting de atributos
     */
    protected function casts(): array
    {
        return [
            'latitud' => 'decimal:8',
            'longitud' => 'decimal:8',
            'precision_gps' => 'decimal:2',
            'fecha_cambio' => 'datetime',
        ];
    }

    /**
     * Relación con Programación
     */
    public function programacion()
    {
        return $this->belongsTo(MantProgramacion::class, 'prog_id', 'prog_id');
    }

    /**
     * Relación con Estado Anterior
     */
    public function estadoAnterior()
    {
        return $this->belongsTo(MantEstado::class, 'estado_anterior_id', 'estado_id');
    }

    /**
     * Relación con Estado Nuevo
     */
    public function estadoNuevo()
    {
        return $this->belongsTo(MantEstado::class, 'estado_nuevo_id', 'estado_id');
    }

    /**
     * Relación con Usuario que ejecutó
     */
    public function usuarioEjecuta()
    {
        return $this->belongsTo(User::class, 'usuario_ejecuta', 'id');
    }

    /**
     * Scope por programación
     */
    public function scopePorProgramacion($query, int $progId)
    {
        return $query->where('prog_id', $progId);
    }

    /**
     * Verificar si tiene coordenadas GPS
     */
    public function tieneGps(): bool
    {
        return $this->latitud !== null && $this->longitud !== null;
    }

    /**
     * Obtener coordenadas formateadas
     */
    public function getCoordenadasAttribute(): ?array
    {
        if (!$this->tieneGps()) {
            return null;
        }
        return [
            'lat' => (float) $this->latitud,
            'lng' => (float) $this->longitud,
            'precision' => $this->precision_gps,
        ];
    }
}
