from sqlalchemy import create_engine, Column, Integer, String, Enum, TIMESTAMP, func, text
from sqlalchemy.orm import sessionmaker, declarative_base
import enum
import bcrypt

# Basis-Klasse für unsere Modelle
Base = declarative_base()

# Enum zur Definition der möglichen Rollen
class UserRole(enum.Enum):
    user = "user"
    admin = "admin"
    superadmin = "superadmin"

# Definition des User Models (Tabelle)
class User(Base):
    __tablename__ = 'users'
    
    id = Column(Integer, primary_key=True, autoincrement=True)
    username = Column(String(50), unique=True, nullable=False)
    password_hash = Column(String(60), nullable=False)  # bcrypt erzeugt einen 60-Zeichen-Hash
    role = Column(Enum(UserRole), nullable=False, default=UserRole.user)
    created_at = Column(TIMESTAMP, server_default=func.current_timestamp())
    updated_at = Column(TIMESTAMP, server_default=func.current_timestamp(), onupdate=func.current_timestamp())

# Definition des Client Models (Tabelle)
class Client(Base):
    __tablename__ = 'clients'
    
    # Die UUID wird vom Client erzeugt und muss daher übermittelt werden (kein Default)
    uuid = Column(String(36), primary_key=True, nullable=False)
    # Der Hardware-Hash wird ebenfalls direkt vom Client geliefert
    hardware_hash = Column(String(64), nullable=False)
    # Spalte für den Standort, der vom Benutzer bei der Anmeldung eingegeben wird
    location = Column(String(100), nullable=True)
    # Spalte für die IP-Adresse, die vom Server beim Kontakt ermittelt wird
    ip_address = Column(String(45), nullable=True)
    # Speicherung des Registrierungszeitpunkts, wird automatisch gesetzt
    registration_time = Column(TIMESTAMP, server_default=func.current_timestamp(), nullable=False)
    # Speicherung des Zeitpunkts der letzten Rückmeldung (Alive-Signal)
    last_alive = Column(
        TIMESTAMP,
        server_default=func.current_timestamp(),
        onupdate=func.current_timestamp(),
        nullable=False
    )

def main():
    # Zuerst Verbindung zur MariaDB ohne spezifische Datenbank, um die Datenbank anzulegen.
    admin_connection_str = 'mysql+pymysql://infoscreen_admin:KqtpM7wmNd$M1Da&mFKs@infoscreen-db/infoscreen_by_taa'
    admin_engine = create_engine(admin_connection_str, echo=True)
    
    # Datenbank "infoscreen_by_taa" anlegen, falls sie noch nicht existiert.
    with admin_engine.connect() as conn:
        conn.execute(text("CREATE DATABASE IF NOT EXISTS infoscreen_by_taa CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"))
    
    # Verbindung zur spezifischen Datenbank herstellen.
    db_connection_str = 'mysql+pymysql://infoscreen_admin:KqtpM7wmNd$M1Da&mFKs@infoscreen-db/infoscreen_by_taa'
    engine = create_engine(db_connection_str, echo=True)
    
    # Erstelle die Tabellen 'users' und 'clients'
    Base.metadata.create_all(engine)
    
    print("Die Tabellen 'users' und 'clients' wurden in der Datenbank 'infoscreen_by_taa' erstellt.")

if __name__ == '__main__':
    main()
