#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""enviar-pedido.py — envia um PEDIDO DE COBERTURA do SEED Design System ao receptor (a fila pública fica em
https://ds.seed.eng.br/pedidos/). Feito para o Claude Code: a IA gera o pedido, MOSTRA o texto inteiro à pessoa, pergunta se pode
enviar e só então roda este script com --confirmo. Sem --confirmo o script só valida e imprime o que enviaria.

Uso:
  python scripts/enviar-pedido.py --papel engenharia --arquivo pedido.txt            # valida e mostra (não envia)
  python scripts/enviar-pedido.py --papel engenharia --arquivo pedido.txt --confirmo  # envia (com o "sim" da pessoa)
  papéis: comercial · engenharia · marketing · desenvolvimento · diretoria · outro
  --origem: claude-code (padrão) | api | outro        --stdin em vez de --arquivo

A primeira linha do pedido deve ser a referência da skill: "ref: seed-ds <versão> · <AAAA-MM-DD>". Se faltar, o script
a acrescenta a partir do VERSAO.json desta cópia e avisa. Sem dado pessoal no texto (regra do modelo). A resposta é o
número PC-AAAA-NNNN — diga-o à pessoa. Limites do receptor: 20 envios por hora por origem, 300 por hora no total."""
import argparse, datetime, json, pathlib, re, sys, urllib.error, urllib.request

RPC = 'https://cpiwlamxenskbjtfkswz.supabase.co/rest/v1/rpc/ds_pedido_registrar'
CHAVE = 'sb_publishable_G_gwnme3bYTkv2jUBcF17w_YXk86Ypv'      # chave PUBLICÁVEL: só executa a função de registro, que valida por dentro; não lê nada
PAPEIS = ('comercial', 'engenharia', 'marketing', 'desenvolvimento', 'diretoria', 'outro')
ORIGENS = ('claude-code', 'api', 'outro')
AQUI = pathlib.Path(__file__).resolve().parent

ap = argparse.ArgumentParser(description='envia um pedido de cobertura do SEED Design System')
ap.add_argument('--papel', required=True, choices=PAPEIS)
ap.add_argument('--arquivo', help='arquivo UTF-8 com o pedido')
ap.add_argument('--stdin', action='store_true', help='lê o pedido da entrada padrão')
ap.add_argument('--origem', default='claude-code', choices=ORIGENS)
ap.add_argument('--confirmo', action='store_true', help='a pessoa viu o texto e autorizou o envio')
a = ap.parse_args()

if a.stdin:
    texto = sys.stdin.read()
elif a.arquivo:
    texto = pathlib.Path(a.arquivo).read_text(encoding='utf-8')
else:
    ap.error('informe --arquivo ou --stdin')
texto = texto.strip()

# a 1ª linha de referência (marca de origem, não filtro)
linha1 = texto.split('\n', 1)[0].strip()
if not re.match(r'^ref:\s*seed-ds\s+\S+\s*[·-]\s*\d{4}-\d{2}-\d{2}$', linha1):
    try:
        versao = json.loads((AQUI.parent / 'VERSAO.json').read_text(encoding='utf-8'))['versao_skill']
    except Exception:
        versao = 'desconhecida'
    ref = 'ref: seed-ds %s · %s' % (versao, datetime.date.today().isoformat())
    texto = ref + '\n' + texto
    print('aviso: a primeira linha de referência faltava — acrescentada: %s' % ref)

if len(texto) < 40 or len(texto) > 16000:
    print('ERRO: o pedido tem %d caracteres; o receptor aceita de 40 a 16.000.' % len(texto)); sys.exit(2)
for pista in ('@', 'CPF', 'CNPJ'):
    if pista in texto:
        print('aviso: o texto contém "%s" — confira que não há dado pessoal (regra do modelo: sem nome, e-mail ou documento).' % pista)

if not a.confirmo:
    print('=' * 72); print(texto); print('=' * 72)
    print('NÃO ENVIADO. Mostre este texto à pessoa e, com o "sim" dela, rode de novo com --confirmo (papel: %s, origem: %s).' % (a.papel, a.origem))
    sys.exit(0)

corpo = json.dumps({'p_papel': a.papel, 'p_texto': texto, 'p_origem': a.origem}, ensure_ascii=False).encode('utf-8')
req = urllib.request.Request(RPC, data=corpo, method='POST', headers={'apikey': CHAVE, 'Content-Type': 'application/json; charset=utf-8', 'Accept': 'application/json'})
try:
    with urllib.request.urlopen(req, timeout=30) as r:
        resp = json.loads(r.read().decode('utf-8'))
except urllib.error.HTTPError as e:
    det = e.read().decode('utf-8', errors='replace')
    if 'LEAD_TAXA_EXCEDIDA' in det:
        print('NÃO ENVIADO: limite de envios por hora atingido no receptor — tente mais tarde.'); sys.exit(3)
    if 'PEDIDO_CAMPO_INVALIDO' in det:
        print('NÃO ENVIADO: o receptor recusou (papel ou tamanho).'); sys.exit(2)
    print('NÃO ENVIADO: HTTP %s.' % e.code); sys.exit(4)
except Exception as e:
    print('NÃO ENVIADO: sem rede ou receptor indisponível (%s). O texto continua com a pessoa; ela pode colar em https://ds.seed.eng.br/pedidos/.' % e); sys.exit(4)
print('ENVIADO. Número do pedido: %s — diga-o à pessoa; a fila pública está em https://ds.seed.eng.br/pedidos/.' % resp.get('codigo'))
