<?php

namespace App\Models;

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

/**
 * Catálogo legacy de lavandería (`productos`): filas usadas por órdenes antiguas
 * que referencian `producto_id` y por reportes históricos.
 *
 * C7 / C0: las ventas en recepción se modelan con service_type + garment_type +
 * load_type (TIBU); no usar esta tabla para nuevas líneas de venta. El POS ya no
 * lista estos ítems; altas nuevas pueden estar deshabilitadas vía
 * `config('lavanderia.productos_legacy_frozen')`. No confundir con
 * `inventory_products` (almacén de insumos).
 */
class Producto extends Model
{
    use HasFactory;

    protected $table = 'productos';

    protected $fillable = [
        'nombre',
        'descripcion',
        'precio',
        'stock',
        'es_servicio',
        'tipo_cobro',
    ];

    protected $casts = [
        'precio' => 'decimal:2',
        'stock' => 'integer',
        'es_servicio' => 'boolean',
    ];

    public const TIPO_COBRO_PESO = 'peso';

    public const TIPO_COBRO_PIEZA = 'pieza';

    public function detallesOrden(): HasMany
    {
        return $this->hasMany(OrdenLavanderiaDetalle::class, 'producto_id');
    }

    public function scopeServicios($query)
    {
        return $query->where('es_servicio', true);
    }

    public function scopeProductos($query)
    {
        return $query->where('es_servicio', false);
    }

    public function tieneStockSuficiente(int $cantidad): bool
    {
        if ($this->es_servicio) {
            return true;
        }

        return $this->stock >= $cantidad;
    }

    public function descontarStock(int $cantidad): void
    {
        if ($this->es_servicio) {
            return;
        }

        $this->decrement('stock', $cantidad);
    }

    /**
     * Devuelve stock al cancelar una venta (reversión). Solo aplica a productos físicos.
     */
    public function devolverStock(int $cantidad): void
    {
        if ($this->es_servicio) {
            return;
        }

        $this->increment('stock', $cantidad);
    }
}
