# qa-copilot/onboarding.py
"""
Onboarding wizard state tracking (#50).

Tracks first-time user progress through setup steps:
1. Connect Jira (configure Jira Cloud credentials)
2. Configure LLM (select provider + model)
3. Generate first test (run a generation)
4. Push to Xray (push a test to Xray)

State stored per-user in userdata.db.
"""
from __future__ import annotations

import sqlite3
from pathlib import Path

SCRIPT_DIR = Path(__file__).parent
_DEFAULT_DB = str(SCRIPT_DIR / "userdata.db")

STEPS = [
    {"id": "connect_jira", "title": "Connect Jira", "description": "Configure your Jira Cloud credentials to import user stories."},
    {"id": "configure_llm", "title": "Configure LLM", "description": "Select your LLM provider (Ollama, Claude, or OpenAI) and model."},
    {"id": "first_generation", "title": "Generate Your First Test", "description": "Paste a user story and generate test cases."},
    {"id": "push_xray", "title": "Push to Xray", "description": "Push your generated tests to Xray as test issues."},
]


def _init_onboarding_table(db_path: str = _DEFAULT_DB) -> None:
    conn = sqlite3.connect(db_path)
    conn.execute("PRAGMA journal_mode=WAL")
    conn.execute("""
        CREATE TABLE IF NOT EXISTS onboarding (
            user_id       TEXT PRIMARY KEY,
            current_step  INTEGER NOT NULL DEFAULT 0,
            completed     INTEGER NOT NULL DEFAULT 0,
            updated_at    TEXT NOT NULL DEFAULT (datetime('now'))
        )
    """)
    conn.commit()
    conn.close()


def get_state(user_id: str, db_path: str = _DEFAULT_DB) -> dict:
    conn = sqlite3.connect(db_path)
    row = conn.execute(
        "SELECT current_step, completed FROM onboarding WHERE user_id = ?",
        (user_id,),
    ).fetchone()
    conn.close()
    if row is None:
        return {"current_step": 0, "completed": False, "steps": STEPS}
    return {"current_step": row[0], "completed": bool(row[1]), "steps": STEPS}


def complete_step(user_id: str, step_index: int, db_path: str = _DEFAULT_DB) -> dict:
    next_step = step_index + 1
    completed = 1 if next_step >= len(STEPS) else 0
    conn = sqlite3.connect(db_path)
    conn.execute(
        """INSERT INTO onboarding (user_id, current_step, completed, updated_at)
           VALUES (?, ?, ?, datetime('now'))
           ON CONFLICT(user_id) DO UPDATE SET
               current_step = excluded.current_step,
               completed = excluded.completed,
               updated_at = excluded.updated_at""",
        (user_id, next_step, completed),
    )
    conn.commit()
    conn.close()
    return get_state(user_id, db_path)


def skip_onboarding(user_id: str, db_path: str = _DEFAULT_DB) -> dict:
    conn = sqlite3.connect(db_path)
    conn.execute(
        """INSERT INTO onboarding (user_id, current_step, completed, updated_at)
           VALUES (?, ?, 1, datetime('now'))
           ON CONFLICT(user_id) DO UPDATE SET
               completed = 1, updated_at = datetime('now')""",
        (user_id, len(STEPS)),
    )
    conn.commit()
    conn.close()
    return get_state(user_id, db_path)
