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.time.LocalDate;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Exemplo de integração com a API Fiscal SysVelox — NFS-e, 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 ExemploNfse.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 ExemploNfse {

    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 NFS-e ==");

        // competencia (opcional, AAAA-MM-DD): período em que o serviço foi de fato prestado —
        // se omitido, assume hoje. codigo_nbs e o grupo IBS/CBS (Reforma Tributária) são
        // opcionais; o grupo só entra no XML quando c_ind_op + cst_ibs_cbs + cclass_trib vêm juntos.
        String payload = """
            {
              "company_id": "%s",
              "tomador": {
                "documento": "11122233396",
                "nome": "Cliente Exemplo",
                "email": null,
                "endereco": {
                  "cep": "65775000",
                  "logradouro": "Rua Exemplo",
                  "numero": "100",
                  "complemento": null,
                  "bairro": "Centro",
                  "codigo_municipio": "2104404"
                }
              },
              "servico": {
                "codigo_tributacao_nacional": "140201",
                "codigo_tributacao_municipal": null,
                "codigo_nbs": null,
                "descricao": "Serviço de exemplo",
                "valor_cents": 10000,
                "iss_retido": false,
                "aliquota_iss": 2.01,
                "c_ind_op": null,
                "cst_ibs_cbs": null,
                "cclass_trib": null,
                "ind_final": false
              },
              "competencia": "%s"
            }
            """.formatted(COMPANY_ID, LocalDate.now());

        HttpRequest emitirRequest = HttpRequest.newBuilder()
            .uri(URI.create(BASE_URL + "/v1/nfse"))
            .header("Authorization", "Bearer " + API_KEY)
            .header("Content-Type", "application/json")
            .header("Idempotency-Key", "exemplo-nfse-" + 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;
    }
}
