<?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;
use App\Traits\BelongsToSucursal;

class OrdenCompra extends Model
{
    use HasFactory, BelongsToSucursal;

    /**
     * Nombre de la tabla asociada al modelo.
     * Se define manualmente para evitar el plural automático "orden_compras".
     */
    protected $table = 'ordenes_compra';

    protected $fillable = [
        'sucursal_id',
        'numero',
        'proveedor_id',
        'estado',
        'total_estimado',
        'total_real',
        'solicitado_por',
        'aprobado_por',
        'aprobado_at',
        'recibido_por',
        'recibido_at',
        'en_camino_por',
        'en_camino_at',
        'cancelado_por',
        'cancelado_at',
        'notas',
    ];

    protected $casts = [
        'aprobado_at' => 'datetime',
        'recibido_at' => 'datetime',
        'en_camino_at' => 'datetime',
        'cancelado_at' => 'datetime',
        'total_estimado' => 'decimal:2',
        'total_real' => 'decimal:2',
    ];

    // ── RELACIONES ───────────────────────────────────────────────────

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

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

    public function solicitadoPor(): BelongsTo
    {
        return $this->belongsTo(User::class, 'solicitado_por');
    }

    public function aprobadoPor(): BelongsTo
    {
        return $this->belongsTo(User::class, 'aprobado_por');
    }

    public function recibidoPor(): BelongsTo
    {
        return $this->belongsTo(User::class, 'recibido_por');
    }

    public function enCaminoPor(): BelongsTo
    {
        return $this->belongsTo(User::class, 'en_camino_por');
    }

    public function canceladoPor(): BelongsTo
    {
        return $this->belongsTo(User::class, 'cancelado_por');
    }

    /**
     * Relación con los detalles de la orden (Insumos pedidos)
     */
    public function items(): HasMany
    {
        return $this->hasMany(OrdenCompraItem::class, 'orden_compra_id');
    }

    // ── SCOPES (PARA FILTROS) ────────────────────────────────────────

    public function scopeDeSucursal($query, $sucursalId)
    {
        return $query->where('sucursal_id', $sucursalId);
    }

    public function scopePendientes($query)
    {
        return $query->whereIn('estado', ['pre_compra', 'aprobada', 'en_camino']);
    }

    // ── MÉTODOS DE ESTADO ─────────────────────────────────────────────

    public function esRecibida(): bool
    {
        return $this->estado === 'recibida';
    }

    public function esAprobada(): bool
    {
        return $this->estado === 'aprobada';
    }
}