
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.http.HttpRequest.BodyPublishers;
import java.net.http.HttpResponse.BodyHandlers;

public class CFSBrasilClient {

    private static final String STR_BASE_URL = "https://cfsbrasil.com.br/api";
    private static final String STR_EMAIL = "seu@email.com";
    private static final String STR_PASSWORD = "sua_senha";

    public static void main(String[] args) {
        HttpClient objClient = HttpClient.newHttpClient();

        try {
            // -------------------------------------------------------------------
            // 1. Autenticação (Login)
            // -------------------------------------------------------------------
            System.out.println("1. Realizando autenticacao...");

            String strJsonLogin = String.format("{\"email\":\"%s\", \"password\":\"%s\"}", STR_EMAIL, STR_PASSWORD);

            HttpRequest objLoginRequest = HttpRequest.newBuilder()
                    .uri(URI.create(STR_BASE_URL + "/login"))
                    .header("Content-Type", "application/json")
                    .POST(BodyPublishers.ofString(strJsonLogin))
                    .build();

            HttpResponse<String> objLoginResponse = objClient.send(objLoginRequest, BodyHandlers.ofString());

            if (objLoginResponse.statusCode() >= 200 && objLoginResponse.statusCode() <= 299) {
                // Parse simples do Token (em producao, use uma lib JSON como Jackson ou Gson)
                String strBody = objLoginResponse.body();
                String strToken = extractToken(strBody);

                if (strToken != null) {
                    System.out.println("Login com sucesso! Token: " + strToken.substring(0, 20) + "...");
                    System.out.println();

                    // -------------------------------------------------------------------
                    // 2. Consultar Serviços Oficiais (Requer Token)
                    // -------------------------------------------------------------------
                    System.out.println("2. Consultando Servicos Oficiais...");

                    HttpRequest objServicesRequest = HttpRequest.newBuilder()
                            .uri(URI.create(STR_BASE_URL + "/official-services"))
                            .header("Authorization", "Bearer " + strToken)
                            .GET()
                            .build();

                    HttpResponse<String> objServicesResponse = objClient.send(objServicesRequest, BodyHandlers.ofString());

                    if (objServicesResponse.statusCode() >= 200 && objServicesResponse.statusCode() <= 299) {
                        System.out.println("Status: " + objServicesResponse.statusCode());
                        String strServicesBody = objServicesResponse.body();
                        System.out.println("Dados (primeiros 100 chars): " + 
                            (strServicesBody.length() > 100 ? strServicesBody.substring(0, 100) + "..." : strServicesBody));
                    } else {
                        System.out.println("Erro ao consultar servicos: " + objServicesResponse.statusCode());
                    }
                    System.out.println();

                    // -------------------------------------------------------------------
                    // 3. Enviar Nota Fiscal de Serviço (XML)
                    // -------------------------------------------------------------------
                    System.out.println("3. Enviando Nota Fiscal (XML)...");
                    
                    // Escapando aspas duplas dentro do XML se necessário (aqui é simples)
                    String strXmlExemplo = "<Rps><InfRps><DataEmissao>2023-10-25</DataEmissao><Servico><ValorServico>100.00</ValorServico></Servico></InfRps></Rps>";
                    
                    // JSON manual: {"xmlContent": "..."}
                    String strJsonInvoice = String.format("{\"xmlContent\": \"%s\"}", strXmlExemplo);

                    HttpRequest objInvoiceRequest = HttpRequest.newBuilder()
                            .uri(URI.create(STR_BASE_URL + "/service-invoices"))
                            .header("Content-Type", "application/json")
                            .header("Authorization", "Bearer " + strToken)
                            .POST(BodyPublishers.ofString(strJsonInvoice))
                            .build();

                    HttpResponse<String> objInvoiceResponse = objClient.send(objInvoiceRequest, BodyHandlers.ofString());

                    if (objInvoiceResponse.statusCode() == 201) {
                        System.out.println("Nota enviada com sucesso!");
                        System.out.println("Resposta: " + objInvoiceResponse.body());
                    } else {
                        System.out.println("Erro ao enviar nota: " + objInvoiceResponse.statusCode());
                        System.out.println("Detalhe: " + objInvoiceResponse.body());
                    }

                } else {
                    System.out.println("Token nao encontrado na resposta.");
                }
            } else {
                System.out.println("Erro no login: " + objLoginResponse.statusCode());
                System.out.println("Resposta: " + objLoginResponse.body());
            }

        } catch (Exception objEx) {
            objEx.printStackTrace();
        }
    }

    // Helper simples para extrair token sem depender de lib externa neste exemplo
    private static String extractToken(String json) {
        String search = "\"token\":\"";
        int start = json.indexOf(search);
        if (start == -1) return null;
        start += search.length();
        int end = json.indexOf("\"", start);
        if (end == -1) return null;
        return json.substring(start, end);
    }
}
