<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use App\Models\LicitacoesProcedimentos\Processo;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;

class Ata extends Model
{
    use HasFactory;

    protected $table = 'atas';
    protected $primaryKey = 'id_ata';
    public $incrementing = true;
    protected $keyType = 'int';

    protected $fillable = [
        'nr_ata',
        'ds_objeto',
        'id_secretaria',
        'nr_processo',
        'ds_link_bo',
        'nr_bo',
        'id_bo',
        'ds_sigla',
        'id_secretaria_ata',
        'dt_data_ata',
        'dt_vigencia_ata',
        'dt_bo',
        'nm_arquivo_ata',
        'licitacao_procedimento_id',
    ];

    public function bo()
    {
        return $this->belongsTo(\App\Models\Comunicacao\Boletim::class, 'id_bo', 'id');
    }

    public function secretaria()
    {
        return $this->belongsTo(Structure::class, 'id_secretaria_ata', 'id');
    }

    public function licitacao()
    {
        return $this->belongsTo(Processo::class, 'licitacao_procedimento_id', 'id');
    }

    public function secretariasAtas(): BelongsToMany
    {
        return $this->belongsToMany(Structure::class, 'ata_secretarias', 'id_ata', 'id_secretaria');
    }

    /**
     * URL pública do PDF do boletim vinculado à ata (novo sistema de arquivos).
     */
    public function getPublicBoLinkUrlAttribute(): ?string
    {
        $boletim = $this->bo;
        if ($boletim) {
            $url = $boletim->public_bo_pdf_url;
            if ($url) {
                return $this->normalizeBoLinkUrl($url) ?? $url;
            }
        }

        return $this->normalizeBoLinkUrl($this->ds_link_bo);
    }

    private function normalizeBoLinkUrl(?string $link): ?string
    {
        $link = trim((string) $link);
        if ($link === '') {
            return null;
        }

        $path = str_replace('\\', '/', $link);

        if (preg_match('~/downloads/bo/([^?#]+)~i', $path, $matches)) {
            $file = basename($matches[1]);

            return $this->boletimAssetUrl($file);
        }

        if (preg_match('~pmar/assets/files/boletins/([^?#]+)~i', $path, $matches)) {
            $file = basename($matches[1]);

            return $this->boletimAssetUrl($file);
        }

        if (preg_match('~^https?://~i', $path)) {
            return $path;
        }

        return asset(ltrim($path, '/'));
    }

    private function boletimAssetUrl(string $file): ?string
    {
        $file = trim($file);
        if ($file === '' || $file === '.' || $file === '..') {
            return null;
        }

        return asset('pmar/assets/files/boletins/' . rawurlencode($file));
    }

    /**
     * URL pública do PDF da ata (storage, symlink legado ou URL absoluta importada).
     */
    public function getPublicArquivoAtaUrlAttribute(): ?string
    {
        $path = trim((string) $this->nm_arquivo_ata);
        if ($path === '') {
            return null;
        }

        if (preg_match('~^https?://~i', $path)) {
            return $path;
        }

        $normalized = str_replace('\\', '/', ltrim($path, '/'));

        if (str_starts_with($normalized, 'pmar/assets/files/atas/')) {
            return asset($normalized);
        }

        if (str_starts_with($normalized, 'atas/')) {
            return asset('pmar/assets/files/' . $normalized);
        }

        if (str_starts_with($normalized, 'storage/')) {
            return asset($normalized);
        }

        return asset('storage/' . $normalized);
    }
}

