#!/usr/bin/env python3
"""Generator mapy myśli Excalidraw dla oferty PutzDuo."""
import json
import math
import random
import uuid

random.seed(42)

def nid():
    return uuid.uuid4().hex[:20]

def seed():
    return random.randint(1, 2**30)

BASE = {
    "angle": 0, "strokeWidth": 2, "strokeStyle": "solid", "roughness": 1,
    "opacity": 100, "groupIds": [], "frameId": None, "roundness": {"type": 3},
    "seed": 0, "version": 1, "versionNonce": 0, "isDeleted": False,
    "boundElements": [], "updated": 1, "link": None, "locked": False,
    "fillStyle": "solid", "index": None,
}

def rect(x, y, w, h, fill, stroke="#000000"):
    e = dict(BASE)
    e.update({
        "type": "rectangle", "id": nid(), "x": x, "y": y,
        "width": w, "height": h, "seed": seed(),
        "backgroundColor": fill, "strokeColor": stroke,
    })
    return e

def ellipse(x, y, w, h, fill, stroke="#000000"):
    e = dict(BASE)
    e.update({
        "type": "ellipse", "id": nid(), "x": x, "y": y,
        "width": w, "height": h, "seed": seed(),
        "backgroundColor": fill, "strokeColor": stroke,
        "roundness": None,
    })
    return e

def text(x, y, w, h, content, size=16, color="#000000"):
    e = dict(BASE)
    e.update({
        "type": "text", "id": nid(), "x": x, "y": y,
        "width": w, "height": h, "seed": seed(),
        "backgroundColor": "transparent", "strokeColor": color,
        "text": content, "fontSize": size, "fontFamily": 1,
        "textAlign": "center", "verticalAlign": "middle",
        "baseline": size - 2, "containerId": None, "originalText": content,
        "lineHeight": 1.25, "roundness": None,
    })
    return e

def arrow(x1, y1, x2, y2, color="#555555"):
    e = dict(BASE)
    e.update({
        "type": "arrow", "id": nid(), "x": x1, "y": y1,
        "width": x2 - x1, "height": y2 - y1, "seed": seed(),
        "backgroundColor": "transparent", "strokeColor": color,
        "strokeWidth": 1.5,
        "points": [[0, 0], [x2 - x1, y2 - y1]],
        "lastCommittedPoint": None, "startBinding": None, "endBinding": None,
        "startArrowhead": None, "endArrowhead": "arrow", "elbowed": False,
        "roundness": {"type": 2},
    })
    return e

COLORS = {
    "center": ("#1e3a8a", "#ffffff"),
    "procesy": "#fee2e2",       # czerwony
    "pain": "#fef3c7",           # żółty
    "rozw": "#dcfce7",            # zielony
    "int": "#dbeafe",             # niebieski
}

elements = []

# Środek — PutzDuo
CX, CY = 0, 0
cx_w, cx_h = 260, 120
c_rect = rect(CX - cx_w/2, CY - cx_h/2, cx_w, cx_h, COLORS["center"][0], "#1e3a8a")
elements.append(c_rect)
elements.append(text(CX - cx_w/2, CY - 25, cx_w, 24, "PutzDuo", 28, COLORS["center"][1]))
elements.append(text(CX - cx_w/2, CY + 5, cx_w, 20, "Anna Głowacka — 600 klientów", 14, COLORS["center"][1]))

# Warstwa 1 — Aktualne procesy (lewa strona, radial)
procesy = [
    ("1. Rezerwacja", "Telefon → Outlook"),
    ("2. Oszacowanie", "Teren → ręczny Kundenblatt"),
    ("3. Planowanie", "Connect Time (ręczne)"),
    ("4. Realizacja", "Pracownica sprząta"),
    ("5. Fakturowanie", "Lexware (osobny wpis)"),
    ("6. Kontakt", "Outlook, ręczne szablony"),
]
R1 = 560
for i, (t, desc) in enumerate(procesy):
    # rozkład na lewym półkolu od -120° do -240° (czyli od góry-lewo do dołu-lewo)
    ang = math.radians(180 + (i - 2.5) * 22)
    x = CX + R1 * math.cos(ang) - 110
    y = CY + R1 * math.sin(ang) - 40
    elements.append(rect(x, y, 220, 80, COLORS["procesy"], "#991b1b"))
    elements.append(text(x, y + 8, 220, 22, t, 14, "#991b1b"))
    elements.append(text(x, y + 40, 220, 18, desc, 11, "#7f1d1d"))
    elements.append(arrow(x + 220, y + 40, CX - cx_w/2 - 5, CY, "#991b1b"))

# Warstwa 2 — Pain points (góra-prawo)
pain = [
    "3-4x wpisywanie\ntego samego klienta",
    "Brak synchronizacji\n(Connect/Outlook/Lexware)",
    "Chaos w planowaniu tras\n(Google Maps off)",
    "Szablony maili rozrzucone,\nnadpisywane",
    "30 min szukania\ndokumentu",
    "Brak spisanych\nprocedur",
    "Pracownice odmawiają\ntabletu",
    "FB na prywatnym koncie,\nIG martwy",
    "PrestaShop\nniebezpieczny",
    "Brak filtru CV\n(czerwona lampka)",
]
R2 = 900
for i, p in enumerate(pain):
    ang = math.radians(-90 + (i - 4.5) * 9)  # górna część prawej strony
    x = CX + R2 * math.cos(ang) - 95
    y = CY + R2 * math.sin(ang) - 30
    elements.append(rect(x, y, 190, 60, COLORS["pain"], "#a16207"))
    elements.append(text(x, y + 5, 190, 50, p, 11, "#78350f"))

# Nagłówek pain points
elements.append(text(CX - 100, CY - R2 - 50, 200, 30, "🔥 Pain points", 22, "#a16207"))

# Warstwa 3 — Rozwiązania (prawa-dół)
rozw = [
    ("CRM 360°", "Jedna karta klienta, auto-sync 3 systemów"),
    ("Dashboard", "KPI, szybki dostęp do najczęstszych akcji"),
    ("Routing", "Google Maps + auto-przypisanie pracownic"),
    ("Inbox + szablony", "Biblioteka szablonów, AI kategoryzacja"),
    ("Raporty", "Finansowe (Lexware) + operacyjne"),
    ("Panel SM", "Blotato, FB/IG z firmowego konta"),
    ("Rekrutacja", "Formularz wielokroki + flagi CV"),
    ("Sklep eko", "Nowa platforma, integracja z CRM"),
    ("AI Dyktafon", "Oszacowania głosowe + transkrypcja"),
    ("AI Call", "Automat odbierający telefony"),
    ("Baza procesów", "SOPs, dokumentacja, nagrania"),
    ("Role & dostęp", "Anna / menedżer / biuro / teren"),
]
R3 = 900
for i, (t, desc) in enumerate(rozw):
    ang = math.radians(90 + (i - 5.5) * 9)  # dolna część prawej strony
    x = CX + R3 * math.cos(ang) - 110
    y = CY + R3 * math.sin(ang) - 40
    elements.append(rect(x, y, 220, 80, COLORS["rozw"], "#166534"))
    elements.append(text(x, y + 8, 220, 22, t, 14, "#166534"))
    elements.append(text(x, y + 40, 220, 36, desc, 10, "#14532d"))

elements.append(text(CX + 350, CY + R3 + 80, 300, 30, "✅ Moduły systemu", 22, "#166534"))

# Warstwa 4 — Integracje (lewy-dół, kolumna)
integracje = [
    "Connect Time API",
    "Outlook / MS365",
    "Lexware",
    "Google Maps API",
    "Blotato",
    "Facebook / Instagram",
    "OpenAI (Whisper + GPT)",
    "n8n — hub automatyzacji",
    "Platforma rekrutacji PL",
    "Stripe / przelewy DE",
]
for i, t in enumerate(integracje):
    x = CX - 1200
    y = CY + 100 + i * 60
    elements.append(rect(x, y, 220, 46, COLORS["int"], "#1e40af"))
    elements.append(text(x, y + 13, 220, 20, t, 13, "#1e3a8a"))

elements.append(text(CX - 1200, CY + 40, 220, 30, "🔌 Integracje", 20, "#1e40af"))

# Transze (banner na dole)
transze = [
    ("T1 — Fundament", "6-8 tyg · 18-22k", "#fecaca"),
    ("T2 — Operacje", "4-6 tyg · 15-20k", "#fed7aa"),
    ("T3 — SM + Rekrut.", "3-4 tyg · 10-15k", "#fef08a"),
    ("T4 — Sklep + AI tel.", "4-6 tyg · 18-25k", "#bbf7d0"),
]
for i, (t, sub, col) in enumerate(transze):
    x = CX - 540 + i * 280
    y = CY + 1100
    elements.append(rect(x, y, 260, 100, col, "#000000"))
    elements.append(text(x, y + 15, 260, 24, t, 16, "#000000"))
    elements.append(text(x, y + 55, 260, 20, sub, 13, "#374151"))

elements.append(text(CX - 300, CY + 1040, 600, 30, "📅 Plan etapowy (pod dotację DE)", 22, "#000000"))

doc = {
    "type": "excalidraw",
    "version": 2,
    "source": "https://excalidraw.com",
    "elements": elements,
    "appState": {
        "viewBackgroundColor": "#fafafa",
        "gridSize": None,
    },
    "files": {},
}

import sys
out = "/Users/miloszzajac/Documents/02_projekty/202604180853_netfly_crm/05_oferta_putzduo/mapa_procesy_putzduo.excalidraw"
with open(out, "w") as f:
    json.dump(doc, f, indent=2, ensure_ascii=False)
print(f"✓ {out}")
print(f"  {len(elements)} elementów")
