<?php
// app/Models/Processo.php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\HasOne;

class Processo extends Model
{
    use HasFactory;

    protected $fillable = [
        'numero',
        'ano',
        'objeto',
        'paginas',
        'arquivo_pdf',
        'arquivo_hash',
        'tipo_fiscalizacao',
        'data_entrada',
        'estado_id',
        'especie_processual_id',
        'natureza_processo_id',
        'users_id',
        'decisao_aplicavel',
        'tipo_decisao',
        'descricao_decisao',
        'data_decisao_do_ato',
        'relator_decisao_id',
        'cobranca_aplicavel',
        'valor_cobranca',
        'status_cobranca',
        'data_emissao_cobranca',
        'observacoes_cobranca',
        'entidade_cobranca_id',
        'caixa_id',
        'localizacao_observacao'
    ];

    protected $casts = [
        'data_entrada' => 'date',
        'data_decisao_do_ato' => 'date',
        'data_emissao_cobranca' => 'date',
        'valor_cobranca' => 'decimal:2',
    ];

    // Relacionamentos

    // Entidades
    public function entidades(): BelongsToMany
    {
        return $this->belongsToMany(Entidade::class, 'processo_entidade')
                    ->withPivot('papel')
                    ->withTimestamps();
    }

    public function entidadePrincipal()
    {
        return $this->belongsTo(Entidade::class, 'entidade_principal_id');
    }

    public function entidadesCocontratantes()
    {
        return $this->belongsToMany(Entidade::class, 'processo_entidade')
                    ->wherePivot('papel', 'cocontratante')
                    ->withPivot('papel')
                    ->withTimestamps();
    }

    public function entidadeCobranca()
    {
        return $this->belongsTo(Entidade::class, 'entidade_cobranca_id');
    }

    // Relatores
    public function relatores(): BelongsToMany
    {
        return $this->belongsToMany(Relator::class, 'processo_relator')
                    ->withPivot(['papel', 'data_inicio', 'data_fim'])
                    ->withTimestamps();
    }

    public function relatorPrincipal()
    {
        return $this->belongsTo(Relator::class, 'relator_principal_id');
    }

    public function relatoresAdjuntos()
    {
        return $this->belongsToMany(Relator::class, 'processo_relator')
                    ->wherePivot('papel', 'adjunto')
                    ->withPivot('papel')
                    ->withTimestamps();
    }

    public function relatorDecisao()
    {
        return $this->belongsTo(Relator::class, 'relator_decisao_id');
    }

    // Categorias
    public function especie()
    {
        return $this->belongsTo(EspecieProcessual::class, 'especie_processual_id');
    }

    public function estado()
    {
        return $this->belongsTo(EstadoProcesso::class, 'estado_id');
    }

    public function natureza()
    {
        return $this->belongsTo(NaturezaProcesso::class, 'natureza_processo_id');
    }

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

    // Localização
    public function caixa()
    {
        return $this->belongsTo(Caixa::class, 'caixa_id');
    }

    public function localizacao()
    {
        return $this->hasOne(LocalizacaoProcesso::class);
    }

    // Decisão
    public function decisoes(): HasMany
    {
        return $this->hasMany(Decisao::class);
    }

    // Cobrança
    public function cobrancas(): HasMany
    {
        return $this->hasMany(Cobranca::class);
    }

    // Documentos
    public function documentos(): HasMany
    {
        return $this->hasMany(Documento::class);
    }

    // OCR
    public function textoOcr(): HasOne
    {
        return $this->hasOne(TextoOcr::class);
    }

    // Acessores para propriedades dinâmicas
    public function getEntidadePrincipalAttribute()
    {
        // Se existir campo entidade_principal_id, use ele
        if ($this->entidade_principal_id) {
            return $this->belongsTo(Entidade::class, 'entidade_principal_id')->first();
        }
        
        // Caso contrário, tente encontrar via pivot
        return $this->entidades()->wherePivot('papel', 'principal')->first();
    }

    public function getEntidadesCocontratantesAttribute()
    {
        return $this->entidades()->wherePivot('papel', 'cocontratante')->get();
    }

    public function getRelatorPrincipalAttribute()
    {
        // Se existir campo relator_principal_id, use ele
        if ($this->relator_principal_id) {
            return $this->belongsTo(Relator::class, 'relator_principal_id')->first();
        }
        
        // Caso contrário, tente encontrar via pivot
        return $this->relatores()->wherePivot('papel', 'principal')->first();
    }

    public function getRelatoresAdjuntosAttribute()
    {
        return $this->relatores()->wherePivot('papel', 'adjunto')->get();
    }

    // Acessores
    public function getArquivoPathAttribute()
    {
        return $this->arquivo_pdf ? asset('storage/' . $this->arquivo_pdf) : null;
    }

    public function getArquivoNomeAttribute()
    {
        return $this->arquivo_pdf ? basename($this->arquivo_pdf) : null;
    }

    public function getStatusCobrancaFormatadoAttribute()
    {
        $status = [
            'pendente' => 'Pendente',
            'pago' => 'Pago',
            'em_contestacao' => 'Em Contestação'
        ];

        return $status[$this->status_cobranca] ?? $this->status_cobranca;
    }

    public function getTipoFiscalizacaoFormatadoAttribute()
    {
        return ucfirst($this->tipo_fiscalizacao);
    }
}