<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class ProcesoAcabado extends Model
{
    protected $fillable = [
        'orden_produccion_id',
        'tipo_proceso',
        'proveedor_id',
        'responsable_interno',
        'cantidad_enviada',
        'cantidad_recibida',
        'fecha_envio',
        'fecha_recepcion',
        'observaciones',
    ];

    /* Relaciones */
    public function ordenProduccion()
    {
        return $this->belongsTo(OrdenProduccion::class);
    }

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

    /* Lógica de negocio */
    protected static function booted()
    {
        static::saving(function ($acabado) {
            // Fecha de envío por defecto
            if (! $acabado->fecha_envio) {
                $acabado->fecha_envio = now();
            }

            // Validación: cantidad_enviada no puede exceder lo enviado desde Tintorería (cantidad recibida allí)
            if ($acabado->cantidad_enviada !== null && $acabado->orden_produccion_id) {
                $sumTint = \App\Models\Tintoreria::where('orden_produccion_id', $acabado->orden_produccion_id)->sum('cantidad_recibida');
                if ($sumTint && $acabado->cantidad_enviada > $sumTint) {
                    throw \Illuminate\Validation\ValidationException::withMessages([
                        'cantidad_enviada' => 'La cantidad enviada no puede exceder lo recibido en Tintorería (' . $sumTint . ').',
                    ]);
                }
            }
        });

        $createTrasladoFn = function ($acabado) {
            if ($acabado->cantidad_recibida !== null) {
                // Evitar duplicados
                $exists = \App\Models\TrasladoPrenda::where('referencia_type', self::class)
                    ->where('referencia_id', $acabado->id)
                    ->exists();

                if (! $exists) {
                    $destino = 'bodega';

                    \App\Models\TrasladoPrenda::crearDesdeReferencia(
                        $acabado,
                        'acabados',
                        $destino
                    );

                    // Avanzar la OP al cerrar este proceso
                    $acabado->ordenProduccion?->avanzarEstado();
                }
            }

            if (
                $acabado->fecha_recepcion &&
                $acabado->cantidad_recibida !== null
            ) {
                // Validar si ya no quedan procesos pendientes
                $pendientes = self::where('orden_produccion_id', $acabado->orden_produccion_id)
                    ->whereNull('fecha_recepcion')
                    ->exists();

                if (!$pendientes) {
                    // Intentar finalizar la OP solo si está completada según la lógica centralizada
                    $acabado->ordenProduccion?->tryFinalize();
                }
            }
        };

        static::updated($createTrasladoFn);
        static::saved($createTrasladoFn);
    }
}
