<?php
/**
 * API para análise de URLs
 * 
 * Este arquivo implementa um endpoint REST que recebe URLs via GET
 * e retorna resultados processados em formato JSON.
 * 
 * Funcionalidades:
 * - Validação de URLs
 * - Análise de conteúdo
 * - Tratamento de erros
 * - Suporte a CORS
 */

require_once 'config.php';
require_once 'inc/URLAnalyzer.php';

// Define o tipo de conteúdo como JSON
header('Content-Type: application/json');

// Habilita CORS (Cross-Origin Resource Sharing)
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET');

// Obtém a URL da requisição a partir do path
$path = $_SERVER['REQUEST_URI'];
$prefix = '/api/';

if (strpos($path, $prefix) === 0) {
    $url = urldecode(substr($path, strlen($prefix)));
    
    /**
     * Função para enviar resposta JSON padronizada
     * 
     * @param array $data Dados a serem enviados na resposta
     * @param int $statusCode Código de status HTTP
     */
    function sendResponse($data, $statusCode = 200) {
        http_response_code($statusCode);
        $response = [
            'status' => $statusCode
        ];
        
        if (isset($data['error'])) {
            $response['error'] = $data['error'];
        } else if (isset($data['url'])) {
            $response['url'] = $data['url'];
        }
        
        echo json_encode($response);
        exit;
    }

    // Validação básica da URL
    if (!$url || !filter_var($url, FILTER_VALIDATE_URL)) {
        sendResponse([
            'error' => [
                'code' => 'INVALID_URL',
                'message' => MESSAGES['INVALID_URL']['message']
            ]
        ], 400);
    }

    try {
        // Instancia o analisador de URLs
        $analyzer = new URLAnalyzer();
        
        // Tenta analisar a URL fornecida
        $analyzer->analyze($url);
        
        // Se a análise for bem-sucedida, retorna a URL processada
        sendResponse([
            'url' => SITE_URL . '/p/' . $url
        ], 200);

    } catch (Exception $e) {
        // Tratamento de erros com mapeamento para códigos HTTP apropriados
        $message = $e->getMessage();
        $statusCode = 400;
        $errorCode = 'GENERIC_ERROR';
        
        // Mapeia a mensagem de erro para o código e status apropriados
        foreach (MESSAGES as $key => $value) {
            if (strpos($message, $value['message']) !== false) {
                $statusCode = ($value['type'] === 'error') ? 400 : 503;
                $errorCode = $key;
                break;
            }
        }
        
        // Adiciona header de erro para melhor tratamento no cliente
        header('X-Error-Message: ' . $message);
        
        sendResponse([
            'error' => [
                'code' => $errorCode,
                'message' => $message
            ]
        ], $statusCode);
    }
} else {
    // Retorna erro 404 para endpoints não encontrados
    sendResponse([
        'error' => [
            'code' => 'NOT_FOUND',
            'message' => MESSAGES['NOT_FOUND']['message']
        ]
    ], 404);
}