<?php

namespace App\Support;

/**
 * Resolução da pasta e nomes dos CSVs de importação de legislação (legado PMAR).
 */
class LegislacaoImportPaths
{
    public const FOLDER_CURRENT = 'Legislacao-27052026';

    public const FOLDER_LEGACY = 'Legislacao';

    /** @var array<string, list<string>> nome canônico => alternativas (export SQL Server) */
    private const CSV_ALIASES = [
        'LEGISLACAO_AUTOR_CARGO.csv' => ['TB_PMAR_LEGISLACAO_AUTOR_CARGO.csv'],
        'LEGISLACAO_AUTOR.csv' => ['TB_PMAR_LEGISLACAO_AUTOR.csv'],
        'LEGISLACAO_TIPO.csv' => ['TB_PMAR_LEGISLACAO_TIPO.csv'],
        'LEGISLACAO_CATEGORIA.csv' => ['TB_PMAR_LEGISLACAO_CATEGORIA.csv'],
        'LEGISLACAO_CATEGORIA_ASSOCIADA.csv' => ['TB_PMAR_LEGISLACAO_CATEGORIA_ASSOCIADA.csv'],
        'LEGISLACAO_ACAO.csv' => ['TB_PMAR_LEGISLACAO_ACAO.csv'],
        'LEGISLACAO_RETIFICACAO.csv' => ['TB_PMAR_LEGISLACAO_RETIFICACAO.csv'],
        'LEGISLACAO_PORTARIA.csv' => ['TB_PMAR_LEGISLACAO_PORTARIA.csv'],
        'LEGISLACAO_PORTARIA_ACAO.csv' => ['TB_PMAR_LEGISLACAO_PORTARIA_ACAO.csv'],
        'LEGISLACAO_PORTARIA_RETIFICACAO.csv' => ['TB_PMAR_LEGISLACAO_PORTARIA_RETIFICACAO.csv'],
    ];

    public static function resolveBasePath(?string $override = null): string
    {
        if ($override !== null && $override !== '') {
            return self::normalizePath($override);
        }

        foreach ([self::FOLDER_CURRENT, self::FOLDER_LEGACY] as $folder) {
            $path = base_path('temp'.DIRECTORY_SEPARATOR.$folder);
            if (is_dir($path) && self::hasMinimumCsvSet($path)) {
                return $path;
            }
        }

        return base_path('temp'.DIRECTORY_SEPARATOR.self::FOLDER_CURRENT);
    }

    public static function resolveCsvPath(string $basePath, string $canonicalFilename): string
    {
        $candidates = array_merge(
            [$canonicalFilename],
            self::CSV_ALIASES[$canonicalFilename] ?? []
        );

        foreach ($candidates as $name) {
            $path = $basePath.DIRECTORY_SEPARATOR.$name;
            if (is_file($path)) {
                return $path;
            }
        }

        throw new \RuntimeException(
            'Arquivo CSV nao encontrado: '.$basePath.DIRECTORY_SEPARATOR.$canonicalFilename
        );
    }

    private static function normalizePath(string $path): string
    {
        if (str_starts_with($path, DIRECTORY_SEPARATOR) || preg_match('/^[A-Za-z]:[\\\\\\/]/', $path)) {
            return $path;
        }

        return base_path($path);
    }

    private static function hasMinimumCsvSet(string $basePath): bool
    {
        try {
            self::resolveCsvPath($basePath, 'LEGISLACAO.csv');
            self::resolveCsvPath($basePath, 'LEGISLACAO_TIPO.csv');

            return true;
        } catch (\RuntimeException) {
            return false;
        }
    }
}
