#!/usr/bin/env python3
"""Seed base authentication users into the auth_users table.

This script is intentionally simple and idempotent:
- it connects to the MySQL database using the same environment variables as the
  other import scripts
- it creates or updates a small set of test users
- passwords are stored as bcrypt hashes

Default users:
- admin / admin123
- test / test123

Environment variables used:
- MYSQL_HOST (default: 127.0.0.1)
- MYSQL_PORT (default: 3306)
- MYSQL_USER (default: app_user)
- MYSQL_PASSWORD (default: apppass)
- MYSQL_DATABASE (default: app_db)
"""

from __future__ import annotations

import os
from dataclasses import dataclass

#import bcrypt
import mysql.connector


@dataclass(frozen=True)
class SeedUser:
    username: str
    email: str | None
    password: str
    role: str
    is_active: bool = True


DEFAULT_USERS: tuple[SeedUser, ...] = (
    SeedUser(
        username="admin",
        email="admin@example.com",
        password="admin123",
        role="admin",
    ),
    SeedUser(
        username="test",
        email="test@example.com",
        password="test123",
        role="user",
    ),
)


def connect_mysql():
    return mysql.connector.connect(
        host=os.getenv("MYSQL_HOST", "127.0.0.1"),
        port=int(os.getenv("MYSQL_PORT", "3306")),
        user=os.getenv("MYSQL_USER", "app_user"),
        password=os.getenv("MYSQL_PASSWORD", "apppass"),
        database=os.getenv("MYSQL_DATABASE", "app_db"),
        autocommit=False,
    )


#def hash_password(password: str) -> str:
    return bcrypt.hashpw(password.encode("utf-8"), bcrypt.gensalt()).decode("utf-8")


def upsert_user(cursor, user: SeedUser) -> str:
    #password_hash = hash_password(user.password)

    cursor.execute(
        """
        INSERT INTO auth_users (username, email, password_hash, role, is_active, created_at, updated_at, last_login_at)
        VALUES (%s, %s, %s, %s, %s, NOW(), NOW(), NULL)
        ON DUPLICATE KEY UPDATE
            email = VALUES(email),
            password_hash = VALUES(password_hash),
            role = VALUES(role),
            is_active = VALUES(is_active),
            updated_at = NOW()
        """,
        (
            user.username,
            user.email,
            user.password,  # Store plaintext for simplicity in this seed script
            user.role,
            1 if user.is_active else 0,
        ),
    )

    return user.password


def main() -> int:
    connection = connect_mysql()
    cursor = connection.cursor()

    try:
        print("Seeding auth users...")

        for user in DEFAULT_USERS:
            upsert_user(cursor, user)
            print(f"  OK {user.username} ({user.role})")

        connection.commit()
        print("Seed completed successfully.")
        print("Default credentials:")
        for user in DEFAULT_USERS:
            print(f"  - {user.username} / {user.password}")

        return 0
    except mysql.connector.Error as exc:
        connection.rollback()
        print(f"MySQL error: {exc}")
        return 1
    finally:
        cursor.close()
        connection.close()


if __name__ == "__main__":
    raise SystemExit(main())
