"""Создать 15 flat-projects в TickTick по naming-конвенции v2.0.

Запуск:
    .venv/bin/python -m scripts.setup_ticktick_structure

Идемпотентный: если проект с таким именем уже есть в TickTick — пропускает.
Сохраняет маппинг `name → projectId` в scripts/preflight/projects_mapping.json.
"""
import json
from pathlib import Path

from scripts.preflight import config
from scripts.preflight import http_client as http

# Семантика: один цвет на «бренд» проекта, чтобы в UI можно было визуально
# группировать перетаскиванием.
COLORS = {
    "Mars": "#3B82F6",         # синий
    "Channel": "#A855F7",      # фиолетовый
    "Consulting": "#F59E0B",   # оранжевый
    "Life": "#10B981",         # зелёный
    "Vibe Coding": "#14B8A6",  # бирюзовый
}

# Структура: {brand: [list_name, ...]}
STRUCTURE: dict[str, list[str]] = {
    "Mars": ["To Do", "Бэклог", "Стратегия"],
    "Channel": ["To Do", "Threads", "Instagram", "Канал", "Бэклог"],
    "Consulting": ["To Do", "Бэклог"],
    "Life": ["To Do", "Бэклог"],
    "Vibe Coding": ["To Do", "Бэклог", "Стратегия"],
}


def build_project_names() -> list[tuple[str, str, str]]:
    """Вернуть [(full_name, brand, color), ...]."""
    out = []
    for brand, lists in STRUCTURE.items():
        for lst in lists:
            full = f"{brand} - {lst}"
            out.append((full, brand, COLORS[brand]))
    return out


def main() -> None:
    cfg = config.load()
    if not cfg.access_token:
        raise SystemExit("Нет TICKTICK_ACCESS_TOKEN в .env.preflight")

    token = cfg.access_token

    # 1. Считать существующие проекты
    existing = http.get("project", token) or []
    existing_by_name: dict[str, str] = {
        p["name"]: p["id"] for p in existing if isinstance(p, dict)
    }
    print(f"Существующих проектов в TickTick: {len(existing_by_name)}")

    # 2. Создать недостающие
    targets = build_project_names()
    mapping: dict[str, str] = {}
    created = 0
    skipped = 0
    for full_name, brand, color in targets:
        if full_name in existing_by_name:
            pid = existing_by_name[full_name]
            mapping[full_name] = pid
            print(f"  ⊙ skip (exists)  {full_name:<30}  id={pid}")
            skipped += 1
            continue
        result = http.post(
            "project",
            token,
            {"name": full_name, "color": color},
        )
        pid = result["id"]
        mapping[full_name] = pid
        print(f"  + created        {full_name:<30}  id={pid}")
        created += 1

    print()
    print(f"Создано: {created}, пропущено: {skipped}, всего в маппинге: {len(mapping)}")

    # 3. Сохранить маппинг
    out_path = Path("scripts/preflight/projects_mapping.json")
    out_path.write_text(
        json.dumps(mapping, ensure_ascii=False, indent=2) + "\n",
        encoding="utf-8",
    )
    print(f"\nМаппинг сохранён: {out_path}")


if __name__ == "__main__":
    main()
