<?php

// app/Models/FiscalMarketAssignment.php

namespace App\Models;

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

class FiscalMarketAssignment extends Model
{
    use HasFactory;

    protected $table = 'fiscal_market_assignments';

    protected $fillable = [
        'fiscal_id',
        'market_id',
        'assigned_zones',
        'primary_fiscal',
        'start_date',
        'end_date',
        'notes',
        'status',
        'assigned_by',
    ];

    protected $casts = [
        'assigned_zones' => 'array',
        'primary_fiscal' => 'boolean',
        'start_date' => 'date',
        'end_date' => 'date',
        'created_at' => 'datetime',
        'updated_at' => 'datetime',
    ];

    /**
     * Relacionamento com o fiscal
     */
    public function fiscal(): BelongsTo
    {
        return $this->belongsTo(Fiscal::class);
    }

    /**
     * Relacionamento com o mercado
     */
    public function market(): BelongsTo
    {
        return $this->belongsTo(Market::class);
    }

    /**
     * Relacionamento com o usuário que fez a atribuição
     */
    public function assignedBy(): BelongsTo
    {
        return $this->belongsTo(User::class, 'assigned_by');
    }

    /**
     * Histórico da atribuição
     */
    public function history()
    {
        return $this->hasMany(FiscalAssignmentHistory::class, 'assignment_id');
    }

    /**
     * Scope para atribuições ativas
     */
    public function scopeActive($query)
    {
        return $query->where('status', 'active')
            ->where('start_date', '<=', now())
            ->where(function ($q) {
                $q->whereNull('end_date')
                    ->orWhere('end_date', '>=', now());
            });
    }

    /**
     * Scope para atribuições por período
     */
    public function scopeForDate($query, $date)
    {
        return $query->where('start_date', '<=', $date)
            ->where(function ($q) use ($date) {
                $q->whereNull('end_date')
                    ->orWhere('end_date', '>=', $date);
            });
    }

    /**
     * Scope para fiscais principais
     */
    public function scopePrimary($query)
    {
        return $query->where('primary_fiscal', true);
    }

    /**
     * Verificar se a atribuição está ativa
     */
    public function isActive(): bool
    {
        return $this->status === 'active'
            && $this->start_date <= now()
            && ($this->end_date === null || $this->end_date >= now());
    }

    /**
     * Obter zonas formatadas
     */
    public function getZonesAsString(): string
    {
        return $this->assigned_zones
            ? implode(', ', $this->assigned_zones)
            : 'Todas as zonas';
    }

    /**
     * Obter período da atribuição
     */
    public function getPeriodAttribute(): string
    {
        $start = $this->start_date->format('d/m/Y');

        if ($this->end_date) {
            $end = $this->end_date->format('d/m/Y');

            return "{$start} até {$end}";
        }

        return "Desde {$start} (sem previsão de término)";
    }

    /**
     * Finalizar atribuição
     */
    public function endAssignment(?string $reason = null): bool
    {
        $this->update([
            'status' => 'inactive',
            'end_date' => now()->toDateString(),
            'notes' => $reason ? ($this->notes.' | Fim: '.$reason) : $this->notes,
        ]);

        // Registrar no histórico
        $this->history()->create([
            'action' => 'expired',
            'old_data' => $this->getOriginal(),
            'new_data' => $this->toArray(),
            'performed_by' => auth()->id(),
        ]);

        return true;
    }
}
