#!/usr/bin/env python3
"""Cria as tasks da Quinzena Industrial PaperX (22/08 a 05/09/2026) no ClickUp via MCP.

Boards:
  Social Media 901715919416  (statuses: planejado, em producao, aprovacao master, postado)
  QA e Suporte 901715921118  (statuses: pendente, em progresso, concluido)

Foco: manutencao industrial em campo (CNC, tornos, maquinas-ferramenta).
Regra da quinzena: DATA NUNCA na arte (so no nome do arquivo); texto na imagem <=20% (Meta).

Saida: JSON com {id, name, status, due, url} + salva estado em .tasks_state.json p/ retomada.
"""
import json, subprocess, sys, os, time

BASE = os.path.dirname(os.path.abspath(__file__))
CLI = os.path.join(BASE, 'mcp_clickup.py')
STATE = os.path.join(BASE, '.tasks_state.json')

L_SOCIAL = "901715919416"
L_QA = "901715921118"

def call(name, args):
    out = subprocess.run([sys.executable, CLI, 'tools-call', name, json.dumps(args, ensure_ascii=False)],
                         capture_output=True, text=True).stdout
    try:
        d = json.loads(out)
    except Exception:
        return {'_raw': out[:300]}
    txt = d['result']['content'][0]['text']
    try:
        return json.loads(txt)
    except Exception:
        return {'_raw': txt[:300]}

def is_rate_limited(r):
    if isinstance(r, dict):
        s = json.dumps(r)[:500]
        return 'RATE_LIMIT' in s.upper() or 'Rate limit' in s
    return False

def create_task(name, desc, status, due, priority="normal", list_id=L_SOCIAL):
    args = {"name": name, "list_id": list_id, "markdown_description": desc,
            "status": status, "priority": priority}
    if due:
        args["due_date"] = due
    r = call('clickup_create_task', args)
    if isinstance(r, dict) and r.get('id'):
        return {"id": r['id'], "name": name, "status": status, "due": due,
                "url": r.get('url', '')}
    return {"error": name, "resp": r}

# ---------------------------------------------------------------------------
# CALENDARIO QUINZENA INDUSTRIAL — 22/08 a 05/09/2026
# Semana 1 (22-28/08): DOR — "Chao de fabrica nao espera papel"
# Semana 2 (29/08-05/09): PROMESSA — "Efeito Empresa Gigante"
# ---------------------------------------------------------------------------

CONTENT = [
 # (data, nome, prioridade, descricao)
 ("2026-08-22", "[Post] Sáb 22/08 — Story teaser: A máquina parada não perdoa", "high",
"""**Brief — Teaser da quinzena industrial: downtime de CNC custa caro.**
- Alvo: donos/gestores de manutencao industrial em campo (CNC, tornos, maquinas-ferramenta).
- Formato: Story 9:16. Contraste: chao de fabrica × Dark Mode + Verde Esmeralda #1CD370.
- Angulo: DOR. "A maquina parada nao perdoa. Cada minuto de CNC parado e dinheiro saindo."
- Copy: gancho direto. CTA: "Agende uma demonstracao gratuita" (link na bio).
- Arte: usar print real do app (drawer de IA / split fiscal) como base; tipografia Anton + Inter.
- REGRA: SEM data na imagem. Texto na imagem <=20%.
- Entrega: copy (1 legenda + 3 ganchos) + arte (1 story). Status final: Postado.""" , "Planejado"),

 ("2026-08-23", "[Post] Dom 23/08 — Story: Mão no óleo, laudo na voz", "normal",
"""**Brief — Story de contraste (serie Antes/Depois).**
- Formato: Story 9:16. Metade esquerda: mao suja de oleo de corte segurando O.S. de papel. Metade direita: app PaperX, laudo preenchido por voz.
- Angulo: DOR → PROMESSA. "Tecnico de manutencao nao tem mao livre pra digitar. Por isso o laudo sai por voz."
- Copy: 2 linhas maximas + CTA "Demonstracao gratis · Link na bio".
- Arte: sobrepor print real do Drawer de IA (mobile) no mockup de celular.
- REGRA: SEM data na imagem. Texto <=20%.""" , "Planejado"),

 ("2026-08-24", "[Post] Seg 24/08 — Carrossel: Quanto custa 1h de CNC parada?", "high",
"""**Brief — Carrossel (5-6 slides) — ABERTURA DA SEMANA 1 (DOR).**
- Alvo: gestores de manutencao industrial.
- Angulo: DOR N1 — downtime. Maquina parada = linha parada = dinheiro. Laudo rapido reduz parada.
- Estrutura: (1) capa com a pergunta; (2) cena do chao de fabrica (maquina parada, tecnico procurando O.S. de papel); (3) o custo escondido (R$/h de parada × volume); (4) PaperX: laudo por voz em 2min, offline, sem papel; (5) CTA.
- Copy: numeros concretos, PT-BR direto, sem AI-slop. CTA: "Agende uma demonstracao gratuita".
- Arte: contraste extremo (foto graxa × UI dark/verde). Prints reais: wizard laudo + RAT.
- REGRA: SEM data na imagem. Texto por slide minimo (<=20% total).
- Hashtags: #PaperX #ManutencaoIndustrial #CNC #TornoMecanico #Usinagem #LaudoPorVoz #TecnicoEmCampo""" , "Planejado"),

 ("2026-08-25", "[Post] Ter 25/08 — Reel: Técnico sem internet no galpão", "high",
"""**Brief — Reel 30-45s — DOR N2: tecnico sem internet.**
- Angulo: DOR → SOLUCAO. Galpao/fabrica sem sinal; o PaperX funciona OFFLINE (IndexedDB) e sincroniza quando volta.
- Roteiro: (1) take do tecnico no galpao sem sinal; (2) legenda "Seu tecnico trava sem internet?"; (3) app offline preenchendo laudo; (4) CTA.
- Copy: argumento do rastreamento a cada 50m (economia bateria/dados) + CTA demo.
- Arte: prints reais mobile (wizard laudo / ditado por voz) + composicao dark/verde.
- REGRA: SEM data na imagem. Texto <=20%.""" , "Planejado"),

 ("2026-08-26", "[Post] Qua 26/08 — Carrossel: A peça trocada que sumiu da nota", "high",
"""**Brief — Carrossel (5 slides) — DOR N3: pecas esquecidas nao faturadas.**
- Angulo: DOR. Rolamento/correia/fusivel trocados no campo, anotados no papel, nunca viram NF-e → prejuizo todo mes.
- Estrutura: (1) capa "A peca que saiu do almoxarifado e sumiu da nota"; (2) fluxo do papel; (3) PaperX separa NF-e (pecas) e NFS-e (servicos) — Split Fiscal; (4) print real do modal Split Fiscal; (5) CTA.
- Copy: tom de auditor. "Nao e R$ 0,60 de NF extra. E peca que some do faturamento."
- Arte: print real do Split Fiscal (desktop) + contraste graxa/dark.
- REGRA: SEM data na imagem.""" , "Planejado"),

 ("2026-08-27", "[Post] Qui 27/08 — Carrossel: Bitributação, o erro que a Receita adora", "high",
"""**Brief — Carrossel (5-6 slides) — DOR N4: bitributacao.**
- Angulo: DOR. Mesmo servico tributado duas vezes por erro de classificacao (peca × servico) = multa. O Split Fiscal divide sozinho NFS-e (servicos) e NF-e (pecas).
- Estrutura: (1) capa "Bitributacao: o erro que a Receita adora"; (2) o que e; (3) como o PaperX evita (Split Fiscal automatico); (4) print real do modal; (5) CTA.
- Copy: direta, exemplo numerico simples. CTA: demo gratuita.
- Arte: print real Split Fiscal + anotacoes.
- REGRA: SEM data na imagem.""" , "Planejado"),

 ("2026-08-28", "[Post] Sex 28/08 — Reel: O Efeito Empresa Gigante", "high",
"""**Brief — Reel de fechamento da Semana 1 — PROMESSA.**
- Angulo: "Efeito Empresa Gigante": e-mail @seusite.com.br, portal White-Label, rastreamento para o cliente, laudo com a sua marca.
- Roteiro: (1) manutencao pequena operando como gigante; (2) cada peca do PaperX (e-mail corporativo, dominio proprio, portal); (3) CTA demo.
- Copy: legenda com status + CTA. White-Label como ancora de status.
- Arte: prints White-Label (aba /configuracoes + portal do cliente) + composicao premium dark/verde.
- REGRA: SEM data na imagem.""" , "Planejado"),

 ("2026-08-29", "[Post] Sáb 29/08 — Story: R$ 297/mês (Starter)", "normal",
"""**Brief — Story de oferta leve (fim de semana).**
- Formato: Story 9:16. Card de preco minimalista dark/verde.
- Angulo: OFERTA. Plano Starter R$ 297/mes: 2 tecnicos, 100 notas, 100 laudos IA, WhatsApp basico, GPS interno.
- Copy: "Comece com R$ 297/mes. Cancele quando quiser." CTA: "Agende uma demonstracao gratuita".
- ATENCAO: NUNCA inventar preco. Tabela oficial (Starter 297 / Pro 597 / Enterprise 1290).
- REGRA: SEM data na imagem.""" , "Planejado"),

 ("2026-08-30", "[Post] Dom 30/08 — Story: pergunta de ouro (engajamento)", "low",
"""**Brief — Story interativa (enquete).**
- Formato: Story 9:16 com sticker de enquete.
- Pergunta: "Seu tecnico ainda entrega O.S. de papel?" Opcoes: "Sim, infelizmente" / "Ja e digital".
- Angulo: DOR leve + engajamento. Depois: story de resposta com print do PaperX.
- Copy: curta. Sem CTA forte (fim de semana).
- REGRA: SEM data na imagem.""" , "Planejado"),

 ("2026-08-31", "[Post] Seg 31/08 — Carrossel: Seu cliente industrial vê o técnico no mapa", "high",
"""**Brief — Carrossel (5 slides) — ABERTURA DA SEMANA 2 (PROMESSA/FEATURES).**
- Angulo: PROMESSA/FEATURE. Rastreamento GPS: cliente recebe link no WhatsApp e ve o tecnico a caminho (mapa em tempo real, atualizacao a cada 50m).
- Estrutura: (1) capa "Seu cliente nunca mais vai perguntar 'cadê o tecnico?'"; (2) print real da pagina de rastreamento (badge 'Em deslocamento'); (3) notificacoes automaticas no WhatsApp; (4) como ativa; (5) CTA.
- Copy: beneficio + confianca. CTA demo.
- Arte: print real do rastreamento (mobile) + composicao dark/verde.
- REGRA: SEM data na imagem.""" , "Planejado"),

 ("2026-09-01", "[Post] Ter 01/09 — Reel: Fala que o laudo se preenche (Drawer de IA)", "high",
"""**Brief — Reel 30-45s — FEATURE: Drawer de Inteligencia Artificial (laudo por voz).**
- Angulo: PROMESSA/FEATURE. O tecnico fala e a IA (Whisper) preenche o laudo. Sem digitar, sem papel.
- Roteiro: (1) take do tecnico falando (ambiente ruidoso de fabrica); (2) overlay do texto sendo preenchido em tempo real; (3) RAT finalizado; (4) CTA.
- Copy: "Enquanto o concorrente digita, o seu tecnico ja foi embora." + CTA demo.
- Arte: print real do ditado por voz (Drawer de IA) mobile + captions.
- REGRA: SEM data na imagem.""" , "Planejado"),

 ("2026-09-02", "[Post] Qua 02/09 — Carrossel: Sua marca, seu domínio (White-Label)", "high",
"""**Brief — Carrossel (5-6 slides) — OFERTA/STATUS: White-Label.**
- Angulo: OFERTA + PROMESSA. Dominio customizado (CNAME → cname.paperxapp.com.br), e-mail @seusite.com.br, portal do cliente com a SUA marca e cores.
- Estrutura: (1) capa "Parece empresa gigante? Parece. E o PaperX White-Label."; (2) o que e dominio proprio; (3) print real da aba White-Label (tabela DNS/CNAME); (4) print do portal do cliente com branding; (5) CTA.
- Copy: ancora de status (e-mail corporativo padrao). CTA demo.
- Arte: prints reais white-label (configuracoes + portal/login).
- REGRA: SEM data na imagem.""" , "Planejado"),

 ("2026-09-03", "[Post] Qui 03/09 — Carrossel: Planos oficiais Starter, Pro e Enterprise", "high",
"""**Brief — Carrossel (5 slides) — OFERTA OFICIAL (fechamento).**
- Angulo: OFERTA. Tabela oficial:
  - Starter R$ 297/mes: 2 tecnicos, 100 notas, 100 laudos IA, WhatsApp basico, GPS interno (NF extra R$ 0,60).
  - Pro R$ 597/mes (mais popular): 5 tecnicos, 300 notas, IA ilimitada, WhatsApp ilimitado, GPS cliente, suporte prioritario (NF extra R$ 0,60).
  - Enterprise R$ 1.290/mes: 6+ tecnicos, NFs customizadas, multiplas filiais, portal cliente, suporte 24/7, API/Webhooks.
- Estrutura: (1) capa "O plano certo para a sua manutencao"; (2-4) um slide por plano com destaque Pro; (5) CTA "Agende uma demonstracao gratuita".
- Copy: valores EXATOS da tabela oficial. NUNCA inventar preco.
- Arte: cards de preco dark/verde, tipografia Anton.
- REGRA: SEM data na imagem.""" , "Planejado"),

 ("2026-09-04", "[Post] Sex 04/09 — Reel: Laudo por voz no chão de fábrica", "high",
"""**Brief — Reel 30-45s — FEATURE: laudo por voz em ambiente industrial.**
- Angulo: PROMESSA/FEATURE. Mao ocupada, EPI, ambiente ruidoso — o Whisper capta a voz do tecnico e preenche o laudo.
- Roteiro: (1) cena real de fabrica (ruido, EPI, maquina); (2) tecnico dita o laudo; (3) laudo preenchido na tela; (4) CTA.
- Copy: "Capacete na cabeca, chave na mao, laudo na voz." + CTA demo.
- Arte: print real do ditado por voz + foto de chao de fabrica (Kairogen/banco).
- REGRA: SEM data na imagem.""" , "Planejado"),

 ("2026-09-05", "[Post] Sáb 05/09 — Reel: O ERP de bolso da manutenção industrial (encerramento)", "high",
"""**Brief — Reel de encerramento da quinzena — PROMESSA + CTA forte.**
- Angulo: PROMESSA. "O Efeito Empresa Gigante cabe no bolso do seu tecnico." Recapitular: laudo por voz (IA), offline, Split Fiscal, rastreamento, White-Label.
- Roteiro: (1) montagem rapida das dores (downtime, papel, peca, sinal, bitributacao); (2) montagem das solucoes; (3) tela final com logo PaperX + CTA.
- Copy: legenda-resumo + link na bio. Menção aos 3 planos (a partir de R$ 297/mes).
- Arte: compilado dos melhores prints da quinzena.
- REGRA: SEM data na imagem.""" , "Planejado"),
]

# ---------------------------------------------------------------------------
def main():
    created = []
    # carrega estado anterior (retomada)
    done_ids = set()
    if os.path.exists(STATE):
        try:
            with open(STATE) as f:
                prev = json.load(f)
            done_ids = {p['name'] for p in prev if 'id' in p}
            created = prev
        except Exception:
            pass

    for due, name, prio, desc, st in CONTENT:
        if name in done_ids:
            print(f"SKIP (ja criada): {name}")
            continue
        r = create_task(name, desc, st, due, prio, L_SOCIAL)
        if isinstance(r, dict) and r.get('id'):
            created.append(r)
            print(f"OK: {name} -> {r['id']}")
        else:
            print(f"ERRO/RL: {name} -> {json.dumps(r, ensure_ascii=False)[:300]}")
            if is_rate_limited(r):
                # salva estado e para (rate limit)
                with open(STATE, 'w', encoding='utf-8') as f:
                    json.dump(created, f, ensure_ascii=False, indent=1)
                print("RATE_LIMIT: estado salvo em .tasks_state.json. Retomar via cron.")
                sys.exit(2)
        time.sleep(1.2)

    with open(STATE, 'w', encoding='utf-8') as f:
        json.dump(created, f, ensure_ascii=False, indent=1)
    ok = [c for c in created if 'id' in c]
    print(f"TOTAL: {len(created)} | OK: {len(ok)}")
    for c in created:
        if 'id' in c:
            print(f"  [{c['status']}] {c['due']} {c['name']} -> {c['id']}")

if __name__ == '__main__':
    main()
