import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Exemplo de integração com a API Fiscal SysVelox — Java (usa só java.net.http.HttpClient,
 * embutido no JDK 11+, sem dependências externas).
 *
 * 1. Troque API_KEY pela sua chave (gerada em https://api.sysvelox.com/conta/chaves.php)
 * 2. Troque COMPANY_ID pelo ID da sua empresa (veja em https://api.sysvelox.com/conta/empresas.php)
 * 3. Rode: java Exemplo.java   (Java 11+ roda direto, sem precisar compilar antes)
 *
 * Este exemplo extrai o campo "id" da resposta com uma expressão regular simples, só pra
 * não depender de uma biblioteca de JSON — num projeto de verdade, use uma (Jackson, Gson).
 */
public class Exemplo {

    static final String API_KEY = "sk_test_TROQUE_PELA_SUA_CHAVE";
    static final String COMPANY_ID = "TROQUE_PELO_ID_DA_EMPRESA";
    static final String BASE_URL = "https://api.sysvelox.com";

    public static void main(String[] args) throws Exception {
        HttpClient client = HttpClient.newBuilder().connectTimeout(Duration.ofSeconds(10)).build();

        System.out.println("== Emitindo NFC-e ==");

        // payment_method (opcional, padrão "dinheiro") e destinatario (opcional, CPF/CNPJ
        // do cliente na nota) — omita "destinatario" pra consumidor não identificado.
        //
        // OPÇÕES AVANÇADAS (text block Java não aceita comentário dentro do JSON, então
        // ficam aqui em texto — só acrescentar a chave dentro do payload abaixo quando
        // precisar). Referência completa em https://api.sysvelox.com/docs/referencia.php:
        //   "discount_cents": 500        desconto total da venda, em centavos
        //   "freight_cents": 300         frete, em centavos
        //   "change_cents": 500          troco (só com payment_method = dinheiro)
        //   "payments": [                pagamento dividido — substitui payment_method
        //     {"method": "dinheiro", "amount_cents": 500},
        //     {"method": "cartao_credito", "amount_cents": 500}
        //   ]
        String payload = """
            {
              "company_id": "%s",
              "payment_method": "pix",
              "destinatario": {
                "documento": "11122233396",
                "nome": "Cliente Exemplo"
              },
              "items": [
                {
                  "description": "Produto de exemplo",
                  "ncm": "12345678",
                  "cfop": "5102",
                  "unit": "UN",
                  "quantity": 1,
                  "unit_price_cents": 1000,
                  "total_cents": 1000,
                  "csosn": "102",
                  "cst_pis": "07",
                  "cst_cofins": "07"
                }
              ]
            }
            """.formatted(COMPANY_ID);

        HttpRequest emitirRequest = HttpRequest.newBuilder()
            .uri(URI.create(BASE_URL + "/v1/nfce"))
            .header("Authorization", "Bearer " + API_KEY)
            .header("Content-Type", "application/json")
            .header("Idempotency-Key", "exemplo-" + System.currentTimeMillis())
            .POST(HttpRequest.BodyPublishers.ofString(payload))
            .build();

        HttpResponse<String> emissao = client.send(emitirRequest, HttpResponse.BodyHandlers.ofString());
        System.out.println("HTTP " + emissao.statusCode());
        System.out.println(emissao.body());

        if (emissao.statusCode() >= 400) {
            return;
        }

        String documentoId = extrairCampo(emissao.body(), "id");

        System.out.println("\n== Consultando status de " + documentoId + " (aguardando alguns segundos) ==");
        Thread.sleep(5000);

        HttpRequest consultaRequest = HttpRequest.newBuilder()
            .uri(URI.create(BASE_URL + "/v1/notas/" + documentoId))
            .header("Authorization", "Bearer " + API_KEY)
            .GET()
            .build();

        HttpResponse<String> consulta = client.send(consultaRequest, HttpResponse.BodyHandlers.ofString());
        System.out.println("HTTP " + consulta.statusCode());
        System.out.println(consulta.body());
    }

    static String extrairCampo(String json, String campo) {
        Matcher matcher = Pattern.compile("\"" + campo + "\"\\s*:\\s*\"([^\"]*)\"").matcher(json);
        return matcher.find() ? matcher.group(1) : null;
    }
}
