"""
Exemplo de integração com a API Fiscal SysVelox — NFS-e, Python (só biblioteca padrão,
sem precisar instalar nada com pip).

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: python3 exemplo-nfse.py
"""

import json
import time
import datetime
import urllib.request
import urllib.error

API_KEY = "sk_test_TROQUE_PELA_SUA_CHAVE"
COMPANY_ID = "TROQUE_PELO_ID_DA_EMPRESA"
BASE_URL = "https://api.sysvelox.com"


def chamar_api(method, path, body=None, idempotency_key=None):
    headers = {
        "Authorization": f"Bearer {API_KEY}",
        "Content-Type": "application/json",
    }
    if idempotency_key:
        headers["Idempotency-Key"] = idempotency_key

    data = json.dumps(body).encode("utf-8") if body is not None else None
    request = urllib.request.Request(BASE_URL + path, data=data, headers=headers, method=method)

    try:
        with urllib.request.urlopen(request) as response:
            return response.status, json.loads(response.read())
    except urllib.error.HTTPError as error:
        return error.code, json.loads(error.read())


def main():
    print("== Emitindo NFS-e ==")

    status, emissao = chamar_api(
        "POST",
        "/v1/nfse",
        {
            "company_id": COMPANY_ID,
            "tomador": {
                "documento": "11122233396",
                "nome": "Cliente Exemplo",
                "email": None,
                "endereco": {
                    "cep": "65775000",
                    "logradouro": "Rua Exemplo",
                    "numero": "100",
                    "complemento": None,
                    "bairro": "Centro",
                    "codigo_municipio": "2104404",
                },
            },
            "servico": {
                "codigo_tributacao_nacional": "140201",
                "codigo_tributacao_municipal": None,
                # NBS (opcional, 9 dígitos) e o grupo IBS/CBS (Reforma Tributária, opcional)
                # só entram no XML quando c_ind_op + cst_ibs_cbs + cclass_trib vêm juntos.
                "codigo_nbs": None,
                "descricao": "Serviço de exemplo",
                "valor_cents": 10000,
                "iss_retido": False,
                "aliquota_iss": 2.01,
                "c_ind_op": None,
                "cst_ibs_cbs": None,
                "cclass_trib": None,
                "ind_final": False,
            },
            # competencia (opcional, AAAA-MM-DD): período em que o serviço foi de fato
            # prestado — se omitido, assume hoje. Não confunda com a data de emissão.
            "competencia": datetime.date.today().isoformat(),
        },
        idempotency_key=f"exemplo-nfse-{int(time.time())}",
    )

    print(f"HTTP {status}")
    print(emissao)

    if status >= 400:
        return

    documento_id = emissao["id"]

    print(f"\n== Consultando status de {documento_id} (aguardando alguns segundos) ==")
    time.sleep(5)

    status, consulta = chamar_api("GET", f"/v1/notas/{documento_id}")
    print(f"HTTP {status}")
    print(consulta)


if __name__ == "__main__":
    main()
