#!/usr/bin/env python3
from http.server import ThreadingHTTPServer, SimpleHTTPRequestHandler
from pathlib import Path
from datetime import datetime, timezone
import json, re, uuid

PUBLIC_DIR = Path('/root/public-html')
AGENT_STORE_DIR = Path('/root/.openclaw/workspace/projects/construcao-agentes-ia/respostas/submissoes')
TESTE_PAULO_STORE_DIR = Path('/root/.openclaw/workspace/projects/formulario-mae-paulo/respostas')
AGENT_STORE_DIR.mkdir(parents=True, exist_ok=True)
TESTE_PAULO_STORE_DIR.mkdir(parents=True, exist_ok=True)

SAFE_FORM = re.compile(r'[^a-zA-Z0-9_-]+')

class Handler(SimpleHTTPRequestHandler):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, directory=str(PUBLIC_DIR), **kwargs)

    def _map_clean_paths(self):
        if self.path.split('?', 1)[0].rstrip('/') == '/criar-agente':
            self.path = '/form-construcao-agente-mvp.html'
        if self.path.split('?', 1)[0].rstrip('/') == '/testepaulo':
            self.path = '/testepaulo/index.html'

    def do_GET(self):
        self._map_clean_paths()
        return super().do_GET()

    def do_HEAD(self):
        self._map_clean_paths()
        return super().do_HEAD()

    def _json(self, code, payload):
        body = json.dumps(payload, ensure_ascii=False).encode('utf-8')
        self.send_response(code)
        self.send_header('Content-Type', 'application/json; charset=utf-8')
        self.send_header('Content-Length', str(len(body)))
        self.end_headers()
        self.wfile.write(body)

    def do_POST(self):
        path = self.path.rstrip('/')
        if path not in {'/api/forms/agent-mvp', '/api/forms/testepaulo'}:
            return self._json(404, {'ok': False, 'error': 'not_found'})
        try:
            length = int(self.headers.get('Content-Length', '0'))
            if length <= 0 or length > 200_000:
                return self._json(413, {'ok': False, 'error': 'payload_invalido'})
            raw = self.rfile.read(length)
            data = json.loads(raw.decode('utf-8'))
            if not isinstance(data, dict):
                return self._json(400, {'ok': False, 'error': 'json_invalido'})

            default_form_id = 'testepaulo' if path == '/api/forms/testepaulo' else 'agent-mvp'
            store_dir = TESTE_PAULO_STORE_DIR if path == '/api/forms/testepaulo' else AGENT_STORE_DIR
            form_id = SAFE_FORM.sub('-', str(data.get('formId') or default_form_id)).strip('-')[:60] or default_form_id
            pessoa = data.get('nome') or data.get('nome_pessoa') or data.get('como_chamar') or data.get('respondente') or 'mae-paulo'
            pessoa_slug = SAFE_FORM.sub('-', str(pessoa).lower()).strip('-')[:50] or 'sem-nome'
            ts = datetime.now(timezone.utc).strftime('%Y%m%dT%H%M%SZ')
            rid = uuid.uuid4().hex[:8]
            base = f'{ts}-{form_id}-{pessoa_slug}-{rid}'

            record = {
                'received_at_utc': datetime.now(timezone.utc).isoformat(),
                'remote_ip': self.headers.get('X-Real-IP') or self.client_address[0],
                'user_agent': self.headers.get('User-Agent'),
                'data': data,
            }
            json_path = store_dir / f'{base}.json'
            txt_path = store_dir / f'{base}.md'
            json_path.write_text(json.dumps(record, ensure_ascii=False, indent=2), encoding='utf-8')
            txt_path.write_text(to_markdown(record, form_id), encoding='utf-8')
            return self._json(200, {'ok': True, 'id': base})
        except Exception as e:
            return self._json(500, {'ok': False, 'error': 'erro_ao_salvar'})

def to_markdown(record, form_id='agent-mvp'):
    d = record.get('data', {})
    if str(form_id).startswith('testepaulo'):
        return to_markdown_testepaulo(record)
    lines = [
        '# Submissão — Formulário Construção de Agente MVP',
        '',
        f"Recebido em UTC: {record.get('received_at_utc')}",
        f"IP: {record.get('remote_ip')}",
        '',
    ]
    labels = [
        ('Nome', 'nome'), ('Como chamar', 'como_chamar'), ('Cidade/fuso', 'cidade'), ('Canal', 'canal'),
        ('Quem é / contexto', 'perfil'), ('Comunicação preferida', 'comunicacao'), ('O que irrita', 'irritacoes'),
        ('Projetos/áreas', 'projetos'), ('Pessoas importantes', 'pessoas'), ('Ajuda esperada', 'ajuda'),
        ('Autonomia permitida', 'autonomia'), ('Sempre perguntar antes', 'confirmacao'),
        ('Privacidade / cuidado', 'privacidade'), ('Proatividade', 'proatividade'),
        ('Estilo do agente', 'estilo'), ('Nunca deve fazer', 'nunca'),
    ]
    for label, key in labels:
        val = d.get(key)
        if isinstance(val, list):
            val = '\n'.join(f'- {x}' for x in val if str(x).strip())
        if val and str(val).strip():
            lines += [f'## {label}', str(val).strip(), '']
    lines += ['## JSON bruto', '```json', json.dumps(d, ensure_ascii=False, indent=2), '```', '']
    return '\n'.join(lines)

def render_value(val):
    if isinstance(val, list):
        return '\n'.join(f'- {x}' for x in val if str(x).strip())
    if isinstance(val, dict):
        return json.dumps(val, ensure_ascii=False, indent=2)
    return str(val).strip()

def to_markdown_testepaulo(record):
    d = record.get('data', {})
    lines = [
        '# Submissão — Formulário mãe do Paulo',
        '',
        f"Recebido em UTC: {record.get('received_at_utc')}",
        f"IP: {record.get('remote_ip')}",
        '',
    ]
    labels = [
        ('Indicadores observados', 'indicadores_observados'),
        ('O que mais chama atenção', 'habilidades_observacao'),
        ('Áreas de maior destaque', 'areas_destaque'),
        ('Outra área', 'outra_area'),
        ('Tipo de gestação', 'tipo_gestacao'),
        ('Intercorrências da gestação', 'intercorrencias_gestacao'),
        ('Outras intercorrências da gestação', 'outras_intercorrencias_gestacao'),
        ('Semanas de gestação', 'semanas_gestacao'),
        ('Tipo de parto', 'tipo_parto'),
        ('Intercorrências durante o parto', 'intercorrencias_parto'),
        ('Peso ao nascer', 'peso_nascer'),
        ('Amamentação', 'amamentacao'),
        ('Marcos do desenvolvimento', 'marcos_desenvolvimento'),
        ('Nunca engatinhou', 'nunca_engatinhou'),
        ('Marcos perdidos ou regredidos', 'marcos_regredidos'),
        ('Histórico escolar', 'historico_escolar'),
        ('Desempenho geral', 'desempenho_geral'),
        ('Preocupação da escola/professores', 'preocupacao_escola'),
        ('Detalhes da preocupação escolar', 'preocupacao_escola_detalhes'),
        ('Condições na família', 'condicoes_familia'),
        ('Detalhamento familiar', 'detalhamento_familiar'),
        ('Comportamento em casa', 'comportamento_casa'),
        ('Sono', 'sono'),
        ('Seletividade alimentar', 'seletividade_alimentar'),
    ]
    for label, key in labels:
        val = d.get(key)
        if val is not None and render_value(val):
            lines += [f'## {label}', render_value(val), '']
    lines += ['## JSON bruto', '```json', json.dumps(d, ensure_ascii=False, indent=2), '```', '']
    return '\n'.join(lines)

if __name__ == '__main__':
    ThreadingHTTPServer(('0.0.0.0', 8765), Handler).serve_forever()
