<?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;

class Caja extends Model
{
    use HasFactory;

    protected $table = 'cajas';

    protected $fillable = [
        'nombre',
        'estatus',
        'saldo_inicial',
        'saldo_final',
        'usuario_id',
        'cerrado_por_user_id',
        'esperado_efectivo',
        'efectivo_contado',
        'diferencia_arqueo',
        'notas_cierre',
        'abierto_at',
        'cerrado_at',
    ];

    protected $casts = [
        'saldo_inicial' => 'decimal:2',
        'saldo_final' => 'decimal:2',
        'esperado_efectivo' => 'decimal:2',
        'efectivo_contado' => 'decimal:2',
        'diferencia_arqueo' => 'decimal:2',
        'abierto_at' => 'datetime',
        'cerrado_at' => 'datetime',
    ];

    public const ESTATUS_ABIERTA = 'abierta';

    public const ESTATUS_CERRADA = 'cerrada';

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

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

    public function movimientos(): HasMany
    {
        return $this->hasMany(CajaMovimiento::class, 'caja_id');
    }

    public function ventas(): HasMany
    {
        return $this->hasMany(OrdenLavanderia::class, 'caja_id');
    }

    public function scopeAbierta($query)
    {
        return $query->where('estatus', self::ESTATUS_ABIERTA);
    }

    public function scopeDelUsuario($query, int $userId)
    {
        return $query->where('usuario_id', $userId);
    }

    public static function cajaAbiertaDelUsuario(int $userId): ?self
    {
        return self::abierta()->delUsuario($userId)->first();
    }
}
