<?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\BelongsToMany;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\SoftDeletes;

class OrdenTrabajo extends Model
{
    use HasFactory, SoftDeletes;

    protected $table = 'ordenes_trabajo';
    protected $fillable = [
        'codigo', 'clase', 'pm_tipo', 'plan_id', 'frecuencia_id', 'area_id', 'sistema_id', 'equipo_id',
        'estado_id', 'prioridad_id', 'responsable_id', 'creado_por',
        'aprobado_por', 'cerrado_por',
        'fecha_programada', 'fecha_inicio', 'fecha_cierre', 'fecha_aprobacion', 'fecha_vencimiento',
        'horometro_inicio', 'horometro_fin', 'horometro_disparo',
        'costo_mano_obra', 'costo_repuestos', 'costo_otros', 'costo_total',
        'descripcion', 'observaciones', 'observaciones_cierre',
        'firma_responsable', 'firma_supervisor',
    ];
    protected $casts = [
        'fecha_programada' => 'date',
        'fecha_inicio' => 'datetime',
        'fecha_cierre' => 'datetime',
        'fecha_aprobacion' => 'datetime',
        'fecha_vencimiento' => 'datetime',
        'horometro_inicio' => 'decimal:2',
        'horometro_fin' => 'decimal:2',
        'costo_mano_obra' => 'decimal:2',
        'costo_repuestos' => 'decimal:2',
        'costo_otros' => 'decimal:2',
        'costo_total' => 'decimal:2',
    ];

    public function plan(): BelongsTo { return $this->belongsTo(PlanMantenimiento::class, 'plan_id'); }
    public function frecuencia(): BelongsTo { return $this->belongsTo(Frecuencia::class); }
    public function area(): BelongsTo { return $this->belongsTo(Area::class); }
    public function sistema(): BelongsTo { return $this->belongsTo(Sistema::class); }
    public function equipo(): BelongsTo { return $this->belongsTo(Equipo::class); }
    public function estado(): BelongsTo { return $this->belongsTo(EstadoOrden::class, 'estado_id'); }
    public function prioridad(): BelongsTo { return $this->belongsTo(Prioridad::class); }
    public function responsable(): BelongsTo { return $this->belongsTo(User::class, 'responsable_id'); }
    public function creador(): BelongsTo { return $this->belongsTo(User::class, 'creado_por'); }
    public function aprobador(): BelongsTo { return $this->belongsTo(User::class, 'aprobado_por'); }
    public function cerrador(): BelongsTo { return $this->belongsTo(User::class, 'cerrado_por'); }

    public function items(): HasMany { return $this->hasMany(OrdenItem::class, 'orden_id'); }
    public function fotos(): HasMany { return $this->hasMany(OrdenFoto::class, 'orden_id'); }
    public function logs(): HasMany { return $this->hasMany(OrdenLog::class, 'orden_id'); }
    public function costos(): HasMany { return $this->hasMany(OrdenCosto::class, 'orden_id'); }
    public function archivos(): HasMany { return $this->hasMany(OrdenArchivo::class, 'orden_id'); }
    public function responsables(): BelongsToMany
    {
        return $this->belongsToMany(User::class, 'ordenes_responsables', 'orden_id', 'usuario_id')
            ->withPivot('rol')->withTimestamps();
    }

    public function recalcularCostoTotal(): void
    {
        $this->costo_total = (float) $this->costo_mano_obra + (float) $this->costo_repuestos + (float) $this->costo_otros;
        $this->save();
    }
}
