import sqlite3, hashlib, os, uuid
from datetime import datetime

DB_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'mt_scan.db')

def get_db():
    conn = sqlite3.connect(DB_PATH)
    conn.row_factory = sqlite3.Row
    conn.execute("PRAGMA journal_mode=WAL")
    conn.execute("PRAGMA foreign_keys=ON")
    return conn

def hash_password(password):
    return hashlib.sha256(password.encode()).hexdigest()

def init_db():
    from questions import QUESTIONS, CATEGORIES
    conn = get_db()
    c = conn.cursor()
    c.executescript("""
    CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT UNIQUE NOT NULL, password_hash TEXT NOT NULL, name TEXT NOT NULL, role TEXT NOT NULL DEFAULT 'admin');
    CREATE TABLE IF NOT EXISTS scans (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        company_name TEXT NOT NULL DEFAULT '',
        contact_name TEXT DEFAULT '',
        contact_email TEXT DEFAULT '',
        created_date TEXT NOT NULL DEFAULT (datetime('now')),
        status TEXT NOT NULL DEFAULT 'new',
        notes TEXT DEFAULT '',
        org_sector TEXT DEFAULT '',
        org_size TEXT DEFAULT '',
        mt_size TEXT DEFAULT '',
        mt_composition TEXT DEFAULT '',
        strategy_priorities TEXT DEFAULT '',
        challenges TEXT DEFAULT '',
        scan_reason TEXT DEFAULT '',
        ambition_changes TEXT DEFAULT '',
        ambition_opportunities TEXT DEFAULT '',
        ambition_support TEXT DEFAULT '',
        remarks TEXT DEFAULT ''
    );
    CREATE TABLE IF NOT EXISTS scan_responses (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        scan_id INTEGER NOT NULL,
        question_id INTEGER NOT NULL,
        category TEXT NOT NULL,
        question_text TEXT NOT NULL,
        score INTEGER NOT NULL,
        comment TEXT DEFAULT '',
        part INTEGER NOT NULL DEFAULT 2,
        context TEXT DEFAULT '',
        FOREIGN KEY (scan_id) REFERENCES scans(id)
    );
    CREATE TABLE IF NOT EXISTS expert_inputs (id INTEGER PRIMARY KEY AUTOINCREMENT, scan_id INTEGER NOT NULL, author TEXT NOT NULL, observation TEXT DEFAULT '', context TEXT DEFAULT '', recommendations TEXT DEFAULT '', created_date TEXT NOT NULL DEFAULT (datetime('now')), FOREIGN KEY (scan_id) REFERENCES scans(id));
    CREATE TABLE IF NOT EXISTS reports (id INTEGER PRIMARY KEY AUTOINCREMENT, scan_id INTEGER NOT NULL, pdf_path TEXT DEFAULT '', status TEXT NOT NULL DEFAULT 'generated', share_token TEXT UNIQUE, created_date TEXT NOT NULL DEFAULT (datetime('now')), FOREIGN KEY (scan_id) REFERENCES scans(id));
    """)

    # Migrate: add missing columns to scans
    new_cols = ['org_sector','org_size','mt_size','mt_composition','strategy_priorities','challenges','scan_reason','ambition_changes','ambition_opportunities','ambition_support','remarks']
    for col in new_cols:
        try:
            c.execute(f"ALTER TABLE scans ADD COLUMN {col} TEXT DEFAULT ''")
        except:
            pass

    # Migrate: add part and context columns to scan_responses
    for col in ['part', 'context']:
        try:
            default = "2" if col == "part" else "''"
            c.execute(f"ALTER TABLE scan_responses ADD COLUMN {col} TEXT DEFAULT {default}")
        except:
            pass

    pw = hash_password("Groots2026!")
    for uname, name in [("ellen", "Ellen van Groots"), ("sanne", "Sanne de Vries")]:
        c.execute("INSERT OR IGNORE INTO users (username, password_hash, name, role) VALUES (?,?,?,'admin')", (uname, pw, name))

    # Seed test data only if no v2 test scan exists
    existing = c.execute("SELECT id FROM scans WHERE company_name = 'TechVibe B.V.' AND org_sector IS NOT NULL AND org_sector != ''").fetchone()
    if not existing:
        # Delete old test scan if exists
        old = c.execute("SELECT id FROM scans WHERE company_name = 'TechVibe B.V.'").fetchone()
        if old:
            c.execute("DELETE FROM scan_responses WHERE scan_id=?", (old['id'],))
            c.execute("DELETE FROM expert_inputs WHERE scan_id=?", (old['id'],))
            c.execute("DELETE FROM reports WHERE scan_id=?", (old['id'],))
            c.execute("DELETE FROM scans WHERE id=?", (old['id'],))

        c.execute("""INSERT INTO scans (company_name, contact_name, contact_email, status, notes,
            org_sector, org_size, mt_size, mt_composition, strategy_priorities, challenges, scan_reason,
            ambition_changes, ambition_opportunities, ambition_support, remarks)
            VALUES ('TechVibe B.V.','Mark de Jong','mark@techvibe.nl','completed','Test scan v2.0',
            'IT / Softwareontwikkeling','45','5','3 mannen, 2 vrouwen, gem. leeftijd 38, 2 jaar samen',
            '1. Agile transformatie versnellen
2. Klanttevredenheid verhogen
3. Nieuwe markt betreden',
            'Informatie stroomt niet goed tussen development en sales. Besluitvorming duurt te lang.',
            'Voorbereiding op scale-up fase en MT-versterking met twee nieuwe leden.',
            'Agile werken doorvoeren in hele MT, wekelijkse stand-ups, retrospectieven.',
            'Betere interdisciplinaire samenwerking en snellere besluitvorming.',
            'DISC-workshop, agile coaching, teambuilding sessie.',
            'Openstaan voor verandering en bereidheid om te investeren in teamontwikkeling.')""")
        scan_id = c.lastrowid

        # Realistic scores with mix
        scores_map = {
            1: (3, ''), 2: (2, 'Luisteren kan beter, vooral in vergaderingen wordt vaak te snel aangehaald bij besluiten.'), 3: (2, 'Feedback wordt nog te vaak vermeden. Mensen zijn bang om elkaar aan te spreken.'),
            4: (2, 'Sales en development communiceren onvoldoende. Belangrijke info komt te laat.'), 5: (3, ''),
            6: (3, ''), 7: (2, 'Besluiten liggen vaak weken. Gebrek aan daadkracht bij lastige keuzes.'), 8: (4, ''), 9: (3, ''), 10: (2, 'Weinig lef voor onconventionele keuzes. Veiligheid boven innovatie.'),
            11: (4, ''), 12: (3, ''), 13: (2, 'Conflicten worden uit de weg gegaan. Onderhuidse spanningen.'), 14: (4, 'Successen worden goed gevierd, vooral milestones.'), 15: (2, 'Niet iedereen voelt zich veilig om mening te geven.'),
            16: (2, 'Weinig bewustzijn van DISC-profielen binnen het team.'), 17: (2, 'Communicatiestijl is te weinig aangepast aan gesprekspartner.'), 18: (3, ''), 19: (1, 'Stijlverschillen leiden regelmatig tot frustratie en misverstanden.'), 20: (3, ''),
            21: (3, ''), 22: (4, ''), 23: (3, ''), 24: (4, 'Ambitieuze doelen worden gesteld en nagestreefd.'), 25: (3, ''),
            26: (4, ''), 27: (3, ''), 28: (3, ''), 29: (1, 'Geen enkele opvolgingsplanning aanwezig. Risico bij vertrek.'), 30: (3, ''),
        }
        for q in QUESTIONS:
            score, comment = scores_map.get(q['id'], (3, ''))
            c.execute("INSERT INTO scan_responses (scan_id, question_id, category, question_text, score, comment, part, context) VALUES (?,?,?,?,?,?,?,?)",
                (scan_id, q['id'], q['category'], q['text'], score, comment, q['part'], q['context']))

        c.execute("INSERT INTO expert_inputs (scan_id, author, observation, context, recommendations) VALUES (?,?,?,?,?)", (scan_id, "Ellen van Groots",
            "Het MT van TechVibe laat een gemengd beeld zien. Sterk op resultaatgerichtheid en visie, maar communicatie tussen afdelingen en DISC-bewustzijn vragen om serieuze aandacht. De score van 1.0 op vraag 19 (stijlconflicten) is een kritiek signaal.",
            "TechVibe is een scale-up met 45 medewerkers in de IT-sector. Het MT bestaat uit 5 leden (3M/2V, gem. 38 jaar) die 2 jaar samenwerken. Twee nieuwe leden worden verwacht.",
            "1. Start met een DISC-workshop voor het hele MT.\n2. Introduceer wekelijkse inter-afdeling stand-ups.\n3. Werk aan een veilige feedbackcultuur met een externe facilitator.\n4. Maak opvolgingsplanning voor alle MT-functies.\n5. Introduceer een besluitvormingsprotocol met maximale doorlooptijd."))

        token = uuid.uuid4().hex[:8]
        c.execute("INSERT INTO reports (scan_id, pdf_path, status, share_token) VALUES (?,'','draft',?)", (scan_id, token))

    conn.commit()
    conn.close()

if __name__ == "__main__":
    init_db()
    print("Database geinitialiseerd.")
