<?php

class FuturaApiClient {

    private $apiBaseUrl;
    // Se você tiver alguma API Key ou Bearer Token que será usada em chamadas futuras,
    // você pode adicionar aqui e configurar no construtor.
    // private $accessToken; // Para JWT, por exemplo

    public function __construct(string $apiBaseUrl) {
        $this->apiBaseUrl = rtrim($apiBaseUrl, '/'); // Remove barra final para evitar duplicação

        // Exemplo para futuras autenticações (não implementado neste momento)
        // Você pode passar o token no construtor ou ter um método setAccessToken()
        // $this->accessToken = $accessToken;
    }

    /**
     * Redimensiona e otimiza uma imagem usando o endpoint /api/images/resize da API.
     *
     * @param string $imagePathFull Caminho completo do arquivo de imagem no servidor local.
     * @param string $fileName (Opcional) Nome do arquivo a ser enviado para a API. Se não fornecido, usa o basename de $imagePathFull.
     * @return string Retorna os bytes da imagem redimensionada em caso de sucesso.
     * @throws Exception Em caso de erros (arquivo não encontrado, erro cURL, erro da API).
     */
    public function resizeImage(string $imagePathFull, string $fileName = null): string {
        if (!file_exists($imagePathFull)) {
            throw new Exception("FuturaApiClient Erro: Arquivo de imagem não encontrado em: " . $imagePathFull);
        }

        if (empty($fileName)) {
            $fileName = basename($imagePathFull);
        }

        $endpoint = $this->apiBaseUrl . '/api/images/resize'; // O endpoint específico para redimensionamento

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $endpoint);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Retorna a resposta como string
        curl_setopt($ch, CURLOPT_HEADER, false);      // Não incluir cabeçalhos na saída

        // Preparar o arquivo para envio multipart/form-data
        // O nome do campo 'file' deve corresponder ao que sua API ASP.NET Core espera (IFormFile file)
        $cfile = new CURLFile($imagePathFull, mime_content_type($imagePathFull), $fileName);
        curl_setopt($ch, CURLOPT_POSTFIELDS, ['file' => $cfile]);

        // --- Exemplo de como adicionar um token para AUTENTICAÇÃO FUTURA ---
        // Se você tiver um accessToken (e.g., JWT) no construtor ou via método set,
        // pode adicioná-lo aqui. Por enquanto, a API não exige, mas prepare-se.
        // $headers = [];
        // if (!empty($this->accessToken)) {
        //     $headers[] = 'Authorization: Bearer ' . $this->accessToken;
        // }
        // if (!empty($headers)) {
        //     curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        // }
        // --- Fim do Exemplo de Autenticação ---

        // Para ambiente de desenvolvimento, se você tiver problemas de certificado SSL
        // (NÃO USAR EM PRODUÇÃO SEM UM MOTIVO MUITO CLARO E SEGURO!)
        // curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        // curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

        $response = curl_exec($ch);
        $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        $curl_error = curl_error($ch);
        $curl_errno = curl_errno($ch);

        curl_close($ch);

        if ($curl_errno) {
            throw new Exception("FuturaApiClient Erro cURL: " . $curl_error);
        }

        // --- Tratamento de Respostas da API ---
        if ($http_code >= 200 && $http_code < 300) { // Sucesso (2xx)
            if (empty($response)) {
                 throw new Exception("FuturaApiClient Erro: A API retornou sucesso (HTTP {$http_code}) mas sem conteúdo de imagem.");
            }
            return $response; // A API retorna os bytes da imagem
        } else {
            // A API retornou um erro. Tenta decodificar JSON para uma mensagem detalhada.
            $error_data = json_decode($response, true);
            $error_message = "Erro inesperado da Futura API (Status: {$http_code}).";

            if ($error_data && isset($error_data['title'])) { // Padrão de erro do ASP.NET Core para 400 Bad Request
                $error_message = $error_data['title'];
                if (isset($error_data['errors'])) {
                    // Adiciona detalhes de validação, se disponíveis
                    foreach ($error_data['errors'] as $field => $messages) {
                        $error_message .= " [{$field}: " . implode(", ", $messages) . "]";
                    }
                }
            } elseif ($error_data && isset($error_data['message'])) { // Outro padrão comum para mensagens de erro
                $error_message = $error_data['message'];
            } elseif ($response) {
                // Se não for JSON ou não tiver as chaves esperadas, mas houver uma resposta
                $error_message .= " Resposta da API: " . $response;
            }

            throw new Exception("FuturaApiClient Falha na API: " . $error_message);
        }
    }
}