#!/usr/bin/env python3
"""Setzt das Passwort des Admin-Users direkt in der Datenbank.
Kein Kenntnis des alten Passworts erforderlich.

Aufruf:  python3 set_admin_password.py
"""

import configparser
import getpass
import os
import re
import sys

import pymysql
from passlib.context import CryptContext

CONFIG_FILE = os.path.join(os.path.dirname(__file__), "target.conf")
PASSWORD_PATTERN = re.compile(r"^(?=.*[A-Za-z])(?=.*\d).{10,}$")
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")


def load_config():
    if not os.path.exists(CONFIG_FILE):
        print(f"Fehler: Konfigurationsdatei nicht gefunden: {CONFIG_FILE}", file=sys.stderr)
        sys.exit(1)
    cfg = configparser.ConfigParser()
    cfg.read(CONFIG_FILE)
    return cfg


def prompt_password() -> str:
    while True:
        pwd = getpass.getpass("Neues Passwort: ")
        if not PASSWORD_PATTERN.match(pwd):
            print("Passwort muss mindestens 10 Zeichen lang sein und Buchstaben sowie Zahlen enthalten.")
            continue
        confirm = getpass.getpass("Passwort bestätigen: ")
        if pwd != confirm:
            print("Passwörter stimmen nicht überein.")
            continue
        return pwd


def main():
    print("=== meyton-sync: Admin-Passwort zurücksetzen ===\n")

    cfg = load_config()
    new_password = prompt_password()
    hashed = pwd_context.hash(new_password)

    try:
        conn = pymysql.connect(
            host=cfg.get("database", "host"),
            port=cfg.getint("database", "port", fallback=3306),
            user=cfg.get("database", "user"),
            password=cfg.get("database", "password"),
            database=cfg.get("database", "database"),
            charset="utf8",
            connect_timeout=10,
        )
    except pymysql.Error as e:
        print(f"\nDatenbankverbindung fehlgeschlagen: {e}", file=sys.stderr)
        sys.exit(1)

    try:
        with conn.cursor() as cur:
            cur.execute("UPDATE Users SET Password = %s WHERE Login = 'admin'", (hashed,))
            if cur.rowcount == 0:
                print("\nFehler: Admin-User nicht in der Datenbank gefunden.", file=sys.stderr)
                sys.exit(1)
            conn.commit()
    except pymysql.Error as e:
        print(f"\nDatenbankfehler: {e}", file=sys.stderr)
        sys.exit(1)
    finally:
        conn.close()

    print("\nPasswort erfolgreich geändert.")


if __name__ == "__main__":
    main()
