from __future__ import annotations

import asyncio
import getpass
import os
import sys
from pathlib import Path

import asyncpg

ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(ROOT))
os.chdir(ROOT)

from backend.app.auth import hash_password  # noqa: E402
from backend.app.config import get_settings  # noqa: E402


async def main() -> None:
    email = input("Adresse electronique de l'administrateur : ").strip().lower()
    nom = input("Nom : ").strip()
    prenom = input("Prenom : ").strip() or None
    password = getpass.getpass("Mot de passe (12 caracteres minimum) : ")
    confirmation = getpass.getpass("Confirmation : ")
    if password != confirmation:
        raise RuntimeError("Les mots de passe ne correspondent pas.")
    encoded = hash_password(password)

    settings = get_settings()
    connection = await asyncpg.connect(
        host=settings.pghost,
        port=settings.pgport,
        database=settings.pgdatabase,
        user=settings.pguser,
        password=settings.pgpassword,
        ssl=False if settings.pgsslmode == "disable" else settings.pgsslmode,
    )
    try:
        await connection.execute(
            """
            INSERT INTO frelons.utilisateurs
              (email, nom, prenom, password_hash, role, actif, doit_changer_mot_de_passe)
            VALUES ($1, $2, $3, $4, 'admin', true, false)
            ON CONFLICT ((lower(email))) DO UPDATE SET
              nom = EXCLUDED.nom,
              prenom = EXCLUDED.prenom,
              password_hash = EXCLUDED.password_hash,
              role = 'admin',
              actif = true,
              doit_changer_mot_de_passe = false,
              modifie_le = now()
            """,
            email,
            nom,
            prenom,
            encoded,
        )
        print(f"Administrateur cree ou mis a jour : {email}")
    finally:
        await connection.close()


if __name__ == "__main__":
    asyncio.run(main())
