<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Model;

class Envio extends Model
{
    protected $table = 'envios';

    const ESTADOS = [
        'pendiente'            => ['label' => 'Pendiente',            'color' => 'secondary'],
        'en_preparacion'       => ['label' => 'En preparación',       'color' => 'warning'],
        'listo_para_despacho'  => ['label' => 'Listo para despacho',  'color' => 'info'],
        'despachado'           => ['label' => 'Despachado',           'color' => 'primary'],
        'en_transito'          => ['label' => 'En tránsito',          'color' => 'primary'],
        'entregado'            => ['label' => 'Entregado',            'color' => 'success'],
        'devuelto'             => ['label' => 'Devuelto',             'color' => 'danger'],
    ];

    protected $fillable = [
        'empresa_id',
        'numero_envio',
        'cliente_id',
        'pedido_manychat_id',
        'venta_id',
        'remitente_nombre',
        'remitente_telefono',
        'remitente_direccion',
        'remitente_ciudad',
        'destinatario_nombre',
        'destinatario_telefono',
        'destinatario_direccion',
        'destinatario_ciudad',
        'destinatario_departamento',
        'destinatario_pais',
        'descripcion_contenido',
        'peso_kg',
        'dimensiones',
        'valor_declarado',
        'transportadora',
        'numero_guia',
        'estado',
        'observaciones',
        'created_by',
    ];

    protected function casts(): array
    {
        return [
            'peso_kg'         => 'decimal:3',
            'valor_declarado' => 'decimal:2',
            'dimensiones'     => 'array',
            'created_at'      => 'datetime',
            'updated_at'      => 'datetime',
        ];
    }

    public function empresa(): BelongsTo
    {
        return $this->belongsTo(Empresa::class, 'empresa_id');
    }

    public function cliente(): BelongsTo
    {
        return $this->belongsTo(Cliente::class, 'cliente_id');
    }

    public function pedidoManychat(): BelongsTo
    {
        return $this->belongsTo(ManyChatPedido::class, 'pedido_manychat_id');
    }

    public function venta(): BelongsTo
    {
        return $this->belongsTo(Venta::class, 'venta_id');
    }

    public function rotulos(): HasMany
    {
        return $this->hasMany(RotuloEnvio::class, 'envio_id');
    }

    public function historial(): HasMany
    {
        return $this->hasMany(EnvioHistorial::class, 'envio_id')->orderByDesc('created_at');
    }

    public function estadoLabel(): string
    {
        return self::ESTADOS[$this->estado]['label'] ?? $this->estado;
    }

    public function estadoColor(): string
    {
        return self::ESTADOS[$this->estado]['color'] ?? 'secondary';
    }

    public static function nextNumero(int $empresaId): string
    {
        $year = now()->format('Y');
        $prefix = 'ENV-' . $year . '-';
        $last = self::where('empresa_id', $empresaId)
            ->where('numero_envio', 'like', $prefix . '%')
            ->orderByDesc('id')
            ->value('numero_envio');

        $seq = $last ? ((int) substr($last, strlen($prefix))) + 1 : 1;

        return $prefix . str_pad($seq, 5, '0', STR_PAD_LEFT);
    }
}
