<?php

namespace ControleFrotas\Utils;

/**
 * Classe para padronizar respostas da API
 */
class Response
{
    /**
     * Envia uma resposta de sucesso
     */
    public static function success(array $data = [], int $statusCode = 200): void
    {
        http_response_code($statusCode);
        
        $response = [
            'success' => true,
            'timestamp' => date('Y-m-d H:i:s'),
            'data' => $data
        ];

        echo json_encode($response, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
        exit();
    }

    /**
     * Envia uma resposta de erro
     */
    public static function error(string $message, int $statusCode = 400, array $details = []): void
    {
        http_response_code($statusCode);
        
        $response = [
            'success' => false,
            'timestamp' => date('Y-m-d H:i:s'),
            'error' => [
                'message' => $message,
                'code' => $statusCode
            ]
        ];

        if (!empty($details)) {
            $response['error']['details'] = $details;
        }

        echo json_encode($response, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
        exit();
    }

    /**
     * Envia uma resposta de validação com erros específicos
     */
    public static function validationError(array $errors, string $message = 'Dados inválidos'): void
    {
        self::error($message, 422, ['validation_errors' => $errors]);
    }

    /**
     * Envia uma resposta com paginação
     */
    public static function paginated(array $data, int $total, int $page, int $perPage, int $statusCode = 200): void
    {
        $totalPages = ceil($total / $perPage);
        
        $response = [
            'success' => true,
            'timestamp' => date('Y-m-d H:i:s'),
            'data' => $data,
            'pagination' => [
                'current_page' => $page,
                'per_page' => $perPage,
                'total' => $total,
                'total_pages' => $totalPages,
                'has_next' => $page < $totalPages,
                'has_prev' => $page > 1
            ]
        ];

        http_response_code($statusCode);
        echo json_encode($response, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
        exit();
    }

    /**
     * Envia resposta de não autorizado
     */
    public static function unauthorized(string $message = 'Não autorizado'): void
    {
        self::error($message, 401);
    }

    /**
     * Envia resposta de acesso negado
     */
    public static function forbidden(string $message = 'Acesso negado'): void
    {
        self::error($message, 403);
    }

    /**
     * Envia resposta de não encontrado
     */
    public static function notFound(string $message = 'Recurso não encontrado'): void
    {
        self::error($message, 404);
    }

    /**
     * Envia resposta de conflito
     */
    public static function conflict(string $message = 'Conflito de dados'): void
    {
        self::error($message, 409);
    }

    /**
     * Envia resposta de servidor interno
     */
    public static function internalError(string $message = 'Erro interno do servidor'): void
    {
        self::error($message, 500);
    }

    /**
     * Envia resposta de serviço indisponível
     */
    public static function serviceUnavailable(string $message = 'Serviço temporariamente indisponível'): void
    {
        self::error($message, 503);
    }

    /**
     * Envia resposta customizada
     */
    public static function custom(array $data, int $statusCode = 200): void
    {
        http_response_code($statusCode);
        echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
        exit();
    }

    /**
     * Envia resposta de criação bem-sucedida
     */
    public static function created(array $data = [], string $location = null): void
    {
        if ($location) {
            header("Location: $location");
        }
        
        self::success($data, 201);
    }

    /**
     * Envia resposta de atualização sem conteúdo
     */
    public static function noContent(): void
    {
        http_response_code(204);
        exit();
    }

    /**
     * Configura headers CORS
     */
    public static function setCorsHeaders(array $allowedOrigins = ['*'], array $allowedMethods = ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS']): void
    {
        $origin = $_SERVER['HTTP_ORIGIN'] ?? '*';
        
        if (in_array('*', $allowedOrigins) || in_array($origin, $allowedOrigins)) {
            header("Access-Control-Allow-Origin: $origin");
        }
        
        header('Access-Control-Allow-Methods: ' . implode(', ', $allowedMethods));
        header('Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With');
        header('Access-Control-Allow-Credentials: true');
        header('Access-Control-Max-Age: 86400');
    }
} 
