"""Recrea solo el workflow SANDBOX con system prompt corregido (sin llaves que LangChain interprete)."""
import json, urllib.request, sys, os

API_KEY = os.environ.get("N8N_API_KEY", "")
BASE    = os.environ.get("N8N_BASE_URL", "http://localhost:5678") + "/api/v1"

id_get_prices    = "7hqeTzIe0iN8nEWh"
id_calc_budget   = "CtTIxulOODx8sPcI"
id_qualify       = "ohSMGhfOv08HsEho"
id_escalate      = "esagSy5x4KqXwwxg"
id_analyze_image = "C7FECW87O0StCRWj"
id_transcribe    = "0Yl4HMeBE6HYRazG"
id_render        = "Vlt2XlDqvGxGREur"
id_budget        = "oyDupIJSrT27ArTe"

# IMPORTANTE: sin llaves {} en el prompt — LangChain las interpreta como variables de template
SYSTEM_PROMPT = (
    "Sos Richard, el asistente comercial de Fibromuebles. "
    "Fabrica de muebles a medida en MDF y melamina, Bahia Blanca, Argentina (Corrientes 289).\n\n"
    "## Tu personalidad\n"
    "- Hablas en castellano argentino coloquial. Usas 'che', 'dale', 'te cuento'.\n"
    "- Directo y concreto. Sin frases serviles.\n"
    "- Mensajes cortos: maximo 4 lineas.\n"
    "- Si te preguntan si sos IA, decis que sos del equipo de Fibromuebles.\n\n"
    "## Tu objetivo\n"
    "Entender que necesita el cliente, deducir cortes, calcular solo de forma interna y crear nota privada para Edd.\n\n"
    "## Como calcular\n"
    "Antes de llamar a calculate_budget, identifica cada pieza del mueble.\n"
    "Placard: 2 laterales + techo + piso + fondo 3mm + zocalo pino + estantes + puertas + cajones.\n"
    "Bajo mesada: 2 laterales + piso + zocalos superiores. Alto 90cm, prof 60cm.\n"
    "Cajones: 2 laterales + 2 contrafrentes + frente visible + fondo 3mm blanco + 1 telescopica.\n"
    "Puertas batientes: max 50cm ancho. Cazoletas: 2 si alto<=100cm, 3 si <=180cm, 4 si >180cm.\n"
    "Puertas corredizas: max 120cm recomendado, llevan manijon de aluminio.\n\n"
    "## Herramientas disponibles\n"
    "- get_prices: precios actualizados. Sin parametros.\n"
    "- calculate_budget: calcula precio de UNA pieza. Enviar: tag, cant, a (ancho mm), b (alto mm), mat.\n"
    "  Tags: #Mueble, #Cajon, #Pino, #Herraje, #Adicional. Tags legacy #Medida-* migran a #Mueble.\n"
    "  Mat: 18b=melamina blanco 18mm / 18=MDF 18mm / 18c=color 18mm / 3b=blanco 3mm / 3=MDF 3mm.\n"
    "- qualify_lead: califica el lead. Enviar: phone, name, budget, location, urgency, product_interest, has_dimensions.\n"
    "- escalate_to_edd: escala a Edd. Enviar: phone, name, reason, summary.\n"
    "- analyze_image: analiza imagen. Enviar: media_url, media_type, context.\n"
    "- transcribe_audio: transcribe audio. Enviar: media_url, media_type, phone.\n"
    "- generate_render: genera render. Enviar: tipo_mueble, material, color, dimensiones, estilo, descripcion, ambiente.\n"
    "- prepare_budget_for_edelmar: crea nota privada. Enviar: conversation_id, cliente, mueble, medidas_cm, material, pieces, total_estimado, bloque_odoo.\n\n"
    "NUNCA des precio, rango ni valor de referencia al cliente. calculate_budget es solo interno y prepare_budget_for_edelmar crea nota privada.\n\n"
    "## Politica de precio privada\n"
    "Si el cliente no eligio material, pregunta una sola vez por MDF crudo, melamina blanca o melamina color. No calcules variantes publicas.\n\n"
    "## Cuando escalar a Edd\n"
    "- qualify_lead retorna score >= 6\n"
    "- El cliente quiere confirmar o cerrar un pedido\n"
    "- Reclamo con pedido anterior\n"
    "- Cliente fuera de Bahia Blanca pregunta por envio\n"
    "- Pedido complejo: cocina completa, local comercial, multiples ambientes\n"
    "- El cliente pide hablar con una persona\n"
    "Al escalar decir: 'Dale, te paso con Edd. Ya le mando tus datos y te contacta en el dia.'\n\n"
    "## Info del negocio\n"
    "- Materiales Faplac: MDF (3-25mm), Melamina blanca (3-18mm), Melamina color (18mm)\n"
    "- Entrega: MDF crudo 20 a 25 dias habiles; melamina 25 a 30 dias habiles desde la sena del 50%.\n"
    "- Flete en Bahia Blanca incluido. Para afuera, el cliente coordina comisionista.\n"
    "- El valor final lo confirma Edelmar; Richard no comunica precios.\n"
)


def api_post(path, data):
    body = json.dumps(data).encode()
    req = urllib.request.Request(BASE + path, data=body,
        headers={"X-N8N-API-KEY": API_KEY, "Content-Type": "application/json"})
    with urllib.request.urlopen(req) as r:
        return json.loads(r.read())


def api_post_empty(path):
    req = urllib.request.Request(BASE + path, data=b"{}",
        headers={"X-N8N-API-KEY": API_KEY, "Content-Type": "application/json"})
    with urllib.request.urlopen(req) as r:
        return json.loads(r.read())


print("Creando whatsapp-agent-fibromuebles (SANDBOX)...")
wf = {
    "name": "whatsapp-agent-fibromuebles (SANDBOX)",
    "nodes": [
        {"id":"s1","name":"Webhook SANDBOX","type":"n8n-nodes-base.webhook","typeVersion":1,"position":[240,300],
         "parameters":{"httpMethod":"POST","path":"fibromuebles-whatsapp-sandbox","responseMode":"lastNode","options":{}}},
        {"id":"s2","name":"Richard - AI Agent","type":"@n8n/n8n-nodes-langchain.agent","typeVersion":1,"position":[680,300],
         "retryOnFail": True, "maxTries": 3, "waitBetweenTries": 20000,
         "parameters":{"promptType":"define","text":"={{ $json.body.input }}","options":{"systemMessage":SYSTEM_PROMPT}}},
        {"id":"s3","name":"GPT-4.1","type":"@n8n/n8n-nodes-langchain.lmChatOpenAi","typeVersion":1,"position":[560,500],
         "parameters":{"model":"gpt-4.1","options":{"maxTokens":500,"maxRetries":6,"temperature":0.2}}},
        {"id":"s4","name":"Window Buffer Memory","type":"@n8n/n8n-nodes-langchain.memoryBufferWindow","typeVersion":1,"position":[700,500],
         "parameters":{"sessionKey":"={{ $('Webhook SANDBOX').first().json.body.sessionId || $('Webhook SANDBOX').first().json.body.phone }}",
                       "contextWindowLength":12}},
        {"id":"s5","name":"get_prices","type":"@n8n/n8n-nodes-langchain.toolWorkflow","typeVersion":1.2,"position":[840,500],
         "parameters":{"name":"get_prices","description":"Obtiene precios actualizados de materiales. Sin parametros.",
                       "workflowId":{"__rl":True,"value":id_get_prices,"mode":"id"},"fields":{"values":[]}}},
        {"id":"s6","name":"calculate_budget","type":"@n8n/n8n-nodes-langchain.toolWorkflow","typeVersion":1.2,"position":[980,500],
         "parameters":{"name":"calculate_budget","description":"Calcula precio de una pieza. Parametros: tag, cant, a (ancho mm), b (alto mm), mat.",
                       "workflowId":{"__rl":True,"value":id_calc_budget,"mode":"id"},"fields":{"values":[]}}},
        {"id":"s7","name":"qualify_lead","type":"@n8n/n8n-nodes-langchain.toolWorkflow","typeVersion":1.2,"position":[1120,500],
         "parameters":{"name":"qualify_lead","description":"Califica el lead (score 0-10). Parametros: phone, name, budget, location, urgency, product_interest, has_dimensions.",
                       "workflowId":{"__rl":True,"value":id_qualify,"mode":"id"},"fields":{"values":[]}}},
        {"id":"s8","name":"escalate_to_edd","type":"@n8n/n8n-nodes-langchain.toolWorkflow","typeVersion":1.2,"position":[1260,500],
         "parameters":{"name":"escalate_to_edd","description":"Escala a Edd. Parametros: phone, name, reason, summary.",
                       "workflowId":{"__rl":True,"value":id_escalate,"mode":"id"},"fields":{"values":[]}}},
        {"id":"s9","name":"analyze_image","type":"@n8n/n8n-nodes-langchain.toolWorkflow","typeVersion":1.2,"position":[840,620],
         "parameters":{"name":"analyze_image","description":"Analiza imagen del cliente. Parametros: media_url, media_type, context.",
                       "workflowId":{"__rl":True,"value":id_analyze_image,"mode":"id"},"fields":{"values":[]}}},
        {"id":"s10","name":"transcribe_audio","type":"@n8n/n8n-nodes-langchain.toolWorkflow","typeVersion":1.2,"position":[980,620],
         "parameters":{"name":"transcribe_audio","description":"Transcribe audio del cliente. Parametros: media_url, media_type, phone.",
                       "workflowId":{"__rl":True,"value":id_transcribe,"mode":"id"},"fields":{"values":[]}}},
        {"id":"s11","name":"generate_render","type":"@n8n/n8n-nodes-langchain.toolWorkflow","typeVersion":1.2,"position":[1120,620],
         "parameters":{"name":"generate_render","description":"Genera render del mueble. Parametros: tipo_mueble, material, color, dimensiones, estilo, descripcion, ambiente.",
                       "workflowId":{"__rl":True,"value":id_render,"mode":"id"},"fields":{"values":[]}}},
        {"id":"s12","name":"generate_budget","type":"@n8n/n8n-nodes-langchain.toolWorkflow","typeVersion":1.2,"position":[1260,620],
         "parameters":{"name":"generate_budget","description":"Genera presupuesto formateado para WhatsApp. Parametros: cliente, mueble, items (lista con descripcion y precio_total), render_url, notas, tiempo_entrega.",
                       "workflowId":{"__rl":True,"value":id_budget,"mode":"id"},"fields":{"values":[]}}},
        {"id":"s13","name":"Respond to Webhook","type":"n8n-nodes-base.respondToWebhook","typeVersion":1,"position":[920,300],
         "parameters":{"respondWith":"json","responseBody":"={{ JSON.stringify({output: $json.output}) }}"}}
    ],
    "connections": {
        "Webhook SANDBOX":{"main":[[{"node":"Richard - AI Agent","type":"main","index":0}]]},
        "Richard - AI Agent":{"main":[[{"node":"Respond to Webhook","type":"main","index":0}]]},
        "GPT-4.1":{"ai_languageModel":[[{"node":"Richard - AI Agent","type":"ai_languageModel","index":0}]]},
        "Window Buffer Memory":{"ai_memory":[[{"node":"Richard - AI Agent","type":"ai_memory","index":0}]]},
        "get_prices":{"ai_tool":[[{"node":"Richard - AI Agent","type":"ai_tool","index":0}]]},
        "calculate_budget":{"ai_tool":[[{"node":"Richard - AI Agent","type":"ai_tool","index":1}]]},
        "qualify_lead":{"ai_tool":[[{"node":"Richard - AI Agent","type":"ai_tool","index":2}]]},
        "escalate_to_edd":{"ai_tool":[[{"node":"Richard - AI Agent","type":"ai_tool","index":3}]]},
        "analyze_image":{"ai_tool":[[{"node":"Richard - AI Agent","type":"ai_tool","index":4}]]},
        "transcribe_audio":{"ai_tool":[[{"node":"Richard - AI Agent","type":"ai_tool","index":5}]]},
        "generate_render":{"ai_tool":[[{"node":"Richard - AI Agent","type":"ai_tool","index":6}]]},
        "generate_budget":{"ai_tool":[[{"node":"Richard - AI Agent","type":"ai_tool","index":7}]]}
    },
    "settings":{"executionOrder":"v1"}
}

r = api_post("/workflows", wf)
new_id = r["id"]
print(f"Creado: {r['name']} -> ID: {new_id}")

# Activar
api_post_empty(f"/workflows/{new_id}/activate")
print(f"Activado.")
print(f"\nNuevo ID SANDBOX: {new_id}")
print("Actualizar CLAUDE.md con este ID.")
