#!/usr/bin/env python3
"""seed.py — Créer les utilisateurs initiaux (à exécuter UNE SEULE FOIS après déploiement)

Usage:
    python seed.py                     # mode interactif
    python seed.py --defaults          # crée les 6 utilisateurs par défaut (DEV UNIQUEMENT)
    python seed.py --interactive       # force le mode interactif

En production, exécutez ce script une fois, puis SUPPRIMEZ-LE du serveur.
"""

import sys, os, getpass, re
from pathlib import Path
import sqlite3
from werkzeug.security import generate_password_hash

BASE_DIR = Path(__file__).resolve().parent
DB_PATH = BASE_DIR / "suivi.db"

DEFAULT_USERS = [
    ("admin",    "Administrateur", "super_admin"),
    ("nizar",    "NIZAR",          "admin"),
    ("yousra",   "YOUSRA",         "membre"),
    ("imane",    "IMANE",          "membre"),
    ("sanaa",    "SANAA",          "membre"),
    ("hayat",    "HAYAT",          "membre"),
    ("yousef",   "YOUSEF",         "membre"),
]


def validate_password(password):
    if len(password) < 8:
        return False, "Minimum 8 caractères."
    if not re.search(r"[A-Z]", password):
        return False, "Doit contenir au moins une lettre majuscule."
    if not re.search(r"\d", password):
        return False, "Doit contenir au moins un chiffre."
    if not re.search(r"[!@#$%^&*(),.?\":{}|<>_\-+=\[\]\\;'/`~]", password):
        return False, "Doit contenir au moins un caractère spécial."
    return True, ""


def create_users_interactive():
    """Create users one by one with password prompts."""
    db = sqlite3.connect(str(DB_PATH))
    db.execute("PRAGMA journal_mode=WAL")

    existing = set(r[0] for r in db.execute("SELECT username FROM users").fetchall())
    print(f"Base de données : {DB_PATH}")
    print(f"Utilisateurs existants : {existing if existing else 'aucun'}")
    print()
    print("Création des utilisateurs. Laissez vide pour passer.\n")

    for username, full_name, role in DEFAULT_USERS:
        if username in existing:
            print(f"  [{username}] déjà existant — ignoré.")
            continue

        print(f"  [{username}] ({full_name}, rôle={role})")
        pw = getpass.getpass(f"    Mot de passe pour {username}: ")
        if not pw:
            print("    → Ignoré (mot de passe vide).")
            continue
        ok, msg = validate_password(pw)
        if not ok:
            print(f"    → Mot de passe refusé : {msg}")
            continue
        pw2 = getpass.getpass("    Confirmer: ")
        if pw != pw2:
            print("    → Les mots de passe ne correspondent pas — ignoré.")
            continue
        db.execute(
            "INSERT INTO users (username, password_hash, full_name, role, must_change_password) VALUES (?,?,?,?,1)",
            (username, generate_password_hash(pw), full_name, role)
        )
        print(f"    ✓ Créé (doit changer le mot de passe au 1er login).")

    db.commit()
    db.close()
    print("\n✓ Terminé.")


def create_users_defaults():
    """DEV ONLY — create users with hardcoded passwords. NOT for production."""
    print("⚠️  ATTENTION : Mode --defaults — mots de passe en dur (DEV uniquement).")
    confirm = input("Tapez 'oui' pour confirmer : ")
    if confirm.strip().lower() != "oui":
        print("Annulé.")
        return

    db = sqlite3.connect(str(DB_PATH))
    default_pw = {
        "admin":  "Admin@2026",
        "nizar":  "Nizar@2026",
        "yousra": "Yousra@2026",
        "imane":  "Imane@2026",
        "sanaa":  "Sanaa@2026",
        "hayat":  "Hayat@2026",
        "yousef": "Yousef@2026",
    }
    for username, full_name, role in DEFAULT_USERS:
        if db.execute("SELECT id FROM users WHERE username=?", (username,)).fetchone():
            print(f"  [{username}] déjà existant — ignoré.")
            continue
        pw = default_pw.get(username, "Change@Me1")
        db.execute(
            "INSERT INTO users (username, password_hash, full_name, role, must_change_password) VALUES (?,?,?,?,1)",
            (username, generate_password_hash(pw), full_name, role)
        )
        print(f"  ✓ {username} ({full_name}) créé.")
    db.commit()
    print("\n✓ Terminé. TOUS les utilisateurs devront changer leur mot de passe au 1er login.")


def seed_reference_data():
    """Seed types_conge, jours_feries, and set equipes."""
    db = sqlite3.connect(str(DB_PATH))

    # Set equipes
    osm_users = ["NIZAR", "YOUSEF"]
    for u in osm_users:
        db.execute("UPDATE users SET equipe='OSM' WHERE full_name=?", (u,))
    db.execute("UPDATE users SET equipe='Standard' WHERE full_name NOT IN (?,?)",
               (osm_users[0], osm_users[1]))

    # Types de congé
    types_conge = [
        ("Congé annuel", "#3b82f6"),
        ("Congé maladie", "#ef4444"),
        ("Congé exceptionnel", "#f59e0b"),
        ("Récupération", "#10b981"),
        ("Maternité", "#ec4899"),
    ]
    for nom, couleur in types_conge:
        db.execute("INSERT OR IGNORE INTO types_conge (nom, couleur) VALUES (?,?)", (nom, couleur))

    # Jours fériés Maroc 2026 (estimated)
    jours_feries = [
        ("2026-01-01", "Nouvel An"),
        ("2026-01-11", "Manifeste de l'Indépendance"),
        ("2026-03-18", "Aïd al-Fitr (estimation)"),
        ("2026-03-19", "Aïd al-Fitr (estimation)"),
        ("2026-05-01", "Fête du Travail"),
        ("2026-05-25", "Aïd al-Adha (estimation)"),
        ("2026-05-26", "Aïd al-Adha (estimation)"),
        ("2026-06-15", "Nouvel An Hijri (estimation)"),
        ("2026-07-30", "Fête du Trône"),
        ("2026-08-14", "Allégeance Oued Eddahab"),
        ("2026-08-20", "Révolution du Roi et du Peuple"),
        ("2026-08-21", "Fête de la Jeunesse"),
        ("2026-08-24", "Naissance du Prophète (estimation)"),
        ("2026-11-06", "Marche Verte"),
        ("2026-11-18", "Fête de l'Indépendance"),
    ]
    for date_str, nom in jours_feries:
        db.execute("INSERT OR IGNORE INTO jours_feries (date_ferie, nom) VALUES (?,?)", (date_str, nom))

    print("✓ Équipes configurées : NIZAR,YOUSEF → OSM | autres → Standard")
    print(f"✓ {len(types_conge)} types de congé créés")
    print(f"✓ {len(jours_feries)} jours fériés créés")
    db.commit()
    db.close()


if __name__ == "__main__":
    if not DB_PATH.exists():
        print(f"Erreur : {DB_PATH} n'existe pas. Lancez d'abord l'application pour créer la base.")
        sys.exit(1)

    if "--defaults" in sys.argv:
        create_users_defaults()
    else:
        create_users_interactive()

    seed_reference_data()
    print()
