#!/bin/bash

# Script de deploy unificado - detecta automaticamente o ambiente
# Windows (local) ou Linux (production)

# Detecta o sistema operacional
detect_os() {
    case "$(uname -s)" in
        MINGW*|MSYS*|CYGWIN*|Windows_NT)
            echo "windows"
            ;;
        Linux*)
            echo "linux"
            ;;
        Darwin*)
            echo "mac"
            ;;
        *)
            echo "unknown"
            ;;
    esac
}

OS=$(detect_os)
echo "Sistema detectado: $OS"
echo "=========================================="

# Diretórios de upload em storage/app/public (migração e link simbólico)
# legislacoes-pdf: symlink em public/downloads/legislacoes-pdf (config/filesystems.php)
STORAGE_PUBLIC_DIRS=(
    arquivos arte_sacra atas banners boletins centros chamados comprovantes conselhos contas
    escolas noticias parques repositorios secretarias unidades documentos projetos-programas
    themes editais-ptmar-imagens editais-ptmar-documentos decretos-leis-ptmar
    parque-tecnologico-areas startups-ptmar-logos startups-ptmar-backgrounds contratos
    legislacoes-pdf observatorio cronogramas
)

# Migra PDFs de legislação do diretório físico legado (public/downloads/legislacoes-pdf)
# para storage/app/public/legislacoes-pdf, removendo a pasta real antes do storage:link.
migrate_legislacao_pdf_legacy_directory() {
    local legacy_dir="public/downloads/legislacoes-pdf"
    local storage_dir="storage/app/public/legislacoes-pdf"

    mkdir -p public/downloads || exit 1

    if [ ! -d "$storage_dir" ]; then
        mkdir -p "$storage_dir" || exit 1
    fi

    if [ -d "$legacy_dir" ] && [ ! -L "$legacy_dir" ]; then
        echo "Migrando PDFs legados de legislação para storage..."
        shopt -s nullglob
        local file
        for file in "$legacy_dir"/*; do
            [ -f "$file" ] || continue
            local base
            base=$(basename "$file")
            if [ ! -f "$storage_dir/$base" ]; then
                mv "$file" "$storage_dir/" || exit 1
            else
                rm -f "$file" || exit 1
            fi
        done
        shopt -u nullglob
        rm -rf "$legacy_dir"
    fi
}

# Cria pastas do storage ausentes (evita falha no link simbólico e em uploads)
ensure_storage_directories() {
    echo "Garantindo estrutura de diretórios do storage..."

    local laravel_dirs=(
        storage/app
        storage/app/public
        storage/framework/cache
        storage/framework/cache/data
        storage/framework/sessions
        storage/framework/testing
        storage/framework/views
        storage/logs
        bootstrap/cache
    )

    local dir
    for dir in "${laravel_dirs[@]}"; do
        if [ ! -d "$dir" ]; then
            echo "  Criando $dir"
            mkdir -p "$dir" || exit 1
        fi
    done

    for dir in "${STORAGE_PUBLIC_DIRS[@]}"; do
        if [ ! -d "storage/app/public/$dir" ]; then
            echo "  Criando storage/app/public/$dir"
            mkdir -p "storage/app/public/$dir" || exit 1
        fi
    done
}

# Remove links do config/filesystems.php (storage:unlink falha no Windows: PHP is_link() = false)
remove_configured_storage_links() {
    echo "Removendo links simbólicos existentes..."

    local link
    while IFS= read -r link; do
        link="${link%$'\r'}"
        [ -z "$link" ] && continue
        if [ -L "$link" ]; then
            rm -f "$link"
        elif [ "$OS" = "windows" ] && [ -e "$link" ]; then
            rm -rf "$link"
        fi
    done < <(php -r '
        require "vendor/autoload.php";
        $app = require "bootstrap/app.php";
        $app->make(Illuminate\Contracts\Console\Kernel::class)->bootstrap();
        $base = rtrim(str_replace("\\", "/", base_path()), "/");
        foreach (array_keys(config("filesystems.links")) as $link) {
            $normalized = str_replace("\\", "/", $link);
            if (str_starts_with($normalized, $base)) {
                echo ltrim(substr($normalized, strlen($base)), "/"), PHP_EOL;
            }
        }
    ')
}

# Limpa caches do Laravel
echo "Limpando caches do Laravel..."
php artisan cache:clear
php artisan config:clear
php artisan view:clear
php artisan view:cache

ensure_storage_directories

remove_configured_storage_links

# Move diretórios para fora do public (ordem personalizada)
echo "Movendo diretórios do storage..."
cd storage/app/public || exit

# Move cada diretório se existir
for dir in "${STORAGE_PUBLIC_DIRS[@]}"; do
    if [ -d "$dir" ]; then
        mv "$dir" ..
    fi
done
cd - || exit

# Remove arquivos antigos da pasta public (ordem correspondente)
echo "Removendo arquivos antigos da pasta public..."
rm -rf public/pmar/assets/img/arquivos
rm -rf public/pmar/assets/img/arte_sacra
rm -rf public/pmar/assets/img/banners
rm -rf public/pmar/assets/files/atas
rm -rf public/pmar/assets/files/boletins
rm -rf public/pmar/assets/img/documentos
rm -rf public/pmar/assets/img/centros
rm -rf public/pmar/assets/img/chamados
rm -rf public/pmar/assets/img/comprovantes
rm -rf public/pmar/assets/img/conselhos
rm -rf public/pmar/assets/img/contas
rm -rf public/pmar/assets/img/escolas
rm -rf public/pmar/assets/img/noticias
rm -rf public/pmar/assets/img/parques
rm -rf public/pmar/assets/files/repositorios
rm -rf public/pmar/assets/img/secretarias
rm -rf public/pmar/assets/img/unidades
rm -rf public/pmar/assets/files/projetos-programas
rm -rf public/pmar/assets/img/themes
rm -rf public/pmar/assets/img/editais-ptmar-imagens
rm -rf public/pmar/assets/img/licitacoes_procedimentos
rm -rf public/pmar/assets/files/editais-ptmar-documentos
rm -rf public/pmar/assets/files/decretos-leis-ptmar
rm -rf public/pmar/assets/img/parque-tecnologico-areas
rm -rf public/pmar/assets/img/startups-ptmar-logos
rm -rf public/pmar/assets/img/startups-ptmar-backgrounds
rm -rf public/pmar/assets/files/contratos

# Move diretórios de volta para o storage público (na mesma ordem)
echo "Movendo diretórios de volta para storage/app/public..."
cd storage/app || exit

for dir in "${STORAGE_PUBLIC_DIRS[@]}"; do
    if [ -d "$dir" ]; then
        mv "$dir" public
    fi
done
cd ../../ || exit  # Volta para a raiz do portal

# Corrige estrutura de diretórios (case-sensitive em Linux)
echo "Corrigindo estrutura de diretórios..."
if [ -d "app/Http/Requests/Saude/Fibromialgia/chamados" ]; then
    echo "Renomeando diretório chamados para Chamados..."
    mv "app/Http/Requests/Saude/Fibromialgia/chamados" "app/Http/Requests/Saude/Fibromialgia/Chamados"
fi

# Otimiza o Laravel
echo "Otimizando Laravel..."
php artisan optimize:clear

# Garante execução das migrations em produção
echo "Executando migrations..."
php artisan migrate --force

# Recria os links simbólicos do storage
echo "Recriando links simbólicos do storage..."
migrate_legislacao_pdf_legacy_directory
remove_configured_storage_links
php artisan storage:link

if [ -L public/downloads/legislacoes-pdf ]; then
    echo "Link de legislação OK: public/downloads/legislacoes-pdf -> $(readlink public/downloads/legislacoes-pdf)"
else
    echo "AVISO: public/downloads/legislacoes-pdf não é um symlink. Verifique php artisan storage:link."
fi

# Ajusta permissões apenas no Linux/Production
if [ "$OS" = "linux" ]; then

    echo "Padronizando proprietários..."

    chown -R angra-admin:www-data .

    echo "Padronizando diretórios graváveis do Laravel..."

    chmod -R 775 storage
    chmod -R 775 bootstrap

    if [ -L public/storage ] || [ -d public/storage ]; then
        chmod -R 775 public/storage 2>/dev/null || true
    fi

    if [ -L public/downloads/legislacoes-pdf ] || [ -d public/downloads/legislacoes-pdf ]; then
        chmod -R 775 public/downloads/legislacoes-pdf 2>/dev/null || true
    fi

    echo "Padronizando diretório público..."

    chmod -R 755 public

    echo "Garantindo executáveis..."

    chmod 755 artisan

    if [ -f deploy.sh ]; then
        chmod 755 deploy.sh
    fi

    echo ""
    echo "================ AUDITORIA ================="

    echo ""
    echo "ROOT:"
    find . -user root

    echo ""
    echo "DIRS 777:"
    find . -type d -perm 0777

    echo ""
    echo "FILES 777:"
    find . -type f -perm 0777

    echo ""
    echo "PERMISSÕES:"
    ls -ld .git public storage bootstrap bootstrap/cache public/downloads/legislacoes-pdf 2>/dev/null

    echo ""
    echo "EXECUTÁVEIS:"
    ls -l artisan deploy.sh 2>/dev/null

    echo ""
    echo "================ FIM DA AUDITORIA ================="

else
    echo "Pulando ajuste de permissões e auditoria (ambiente Windows/local)"
fi

echo "=========================================="
echo "Rotina pós-deploy realizada com sucesso!"
