from sqlalchemy import text
from sqlalchemy.exc import OperationalError, ProgrammingError
from database import engine

def frissit_adatbazist():
    # Kapcsolódás a database.py-ban beállított aktív adatbázishoz (MariaDB/MySQL/SQLite)
    with engine.begin() as conn:
        
        # 1. A MACHINES tábla bővítése
        uj_gep_oszlopok = [
            ("emelesi_magassag", "VARCHAR(100)"),
            ("fesztav_gemhossz", "VARCHAR(100)"),
            ("meghajtas", "VARCHAR(100)"),
            ("teljesitmeny", "VARCHAR(100)"),
            ("egyedi_1", "VARCHAR(255)"),
            ("egyedi_2", "VARCHAR(255)"),
            ("egyedi_3", "VARCHAR(255)"),
            ("napi_atlag_uzemido", "FLOAT DEFAULT 0.0"),
            ("matrix_kezdo_datum", "DATETIME"),
            ("matrix_kezdo_uzemora", "FLOAT"),
            ("uzemora_riasztas_szint", "VARCHAR(10)"),
            ("fo_gep_id", "INTEGER"),
            ("berelt_eszkoz", "BOOLEAN DEFAULT 0"),
            ("berbeado_neve", "VARCHAR(255)"),
            ("berbeado_elerhetoseg", "VARCHAR(255)"),
            ("berlet_lejarat_datum", "DATE")
        ]

        uj_user_oszlopok = [
            ("jog_gep_szerkesztes", "BOOLEAN DEFAULT 0"),
            ("aktiv", "BOOLEAN DEFAULT 1"),
            ("csak_olvasas", "BOOLEAN DEFAULT 0")
        ]

        print("🔄 'machines' tábla ellenőrzése és frissítése...")
        for oszlop_nev, tipus in uj_gep_oszlopok:
            try:
                # Biztonságos SQL futtatás a text() modullal
                conn.execute(text(f"ALTER TABLE machines ADD COLUMN {oszlop_nev} {tipus}"))
                print(f"  ✅ Oszlop hozzáadva: {oszlop_nev}")
            except (OperationalError, ProgrammingError) as e:
                hiba_uzenet = str(e).lower()
                # A MySQL/MariaDB 1060-as hibakódot, az SQLite "duplicate column"-t dob
                if "duplicate column" in hiba_uzenet or "already exists" in hiba_uzenet or "1060" in hiba_uzenet:
                    print(f"  ⏩ Az oszlop már létezik, átugorva: {oszlop_nev}")
                else:
                    print(f"  ❌ Váratlan hiba történt a(z) {oszlop_nev} oszlopnál: {e}")

        # 2. A MACHINE_TYPE_CONFIGS tábla bővítése
        uj_konfig_oszlopok = [
            ("rejtett_mezok", "TEXT"),
            ("egyedi_1_nev", "VARCHAR(100)"),
            ("egyedi_2_nev", "VARCHAR(100)"),
            ("egyedi_3_nev", "VARCHAR(100)")
        ]

        print("\n🔄 'machine_type_configs' tábla ellenőrzése és frissítése...")
        for oszlop_nev, tipus in uj_konfig_oszlopok:
            try:
                conn.execute(text(f"ALTER TABLE machine_type_configs ADD COLUMN {oszlop_nev} {tipus}"))
                print(f"  ✅ Oszlop hozzáadva: {oszlop_nev}")
            except (OperationalError, ProgrammingError) as e:
                hiba_uzenet = str(e).lower()
                if "duplicate column" in hiba_uzenet or "already exists" in hiba_uzenet or "1060" in hiba_uzenet:
                    print(f"  ⏩ Az oszlop már létezik, átugorva: {oszlop_nev}")
                else:
                    print(f"  ❌ Váratlan hiba történt a(z) {oszlop_nev} oszlopnál: {e}")

        # 3. A USERS tábla bővítése
        print("\n🔄 'users' tábla ellenőrzése és frissítése...")
        for oszlop_nev, tipus in uj_user_oszlopok:
            try:
                conn.execute(text(f"ALTER TABLE users ADD COLUMN {oszlop_nev} {tipus}"))
                print(f"  ✅ Oszlop hozzáadva: {oszlop_nev}")
            except (OperationalError, ProgrammingError) as e:
                hiba_uzenet = str(e).lower()
                if "duplicate column" in hiba_uzenet or "already exists" in hiba_uzenet or "1060" in hiba_uzenet:
                    print(f"  ⏩ Az oszlop már létezik, átugorva: {oszlop_nev}")
                else:
                    print(f"  ❌ Váratlan hiba történt a(z) {oszlop_nev} oszlopnál: {e}")

        # 4. A COMPANIES tábla bővítése
        print("\n🔄 'companies' tábla ellenőrzése és frissítése...")
        try:
            conn.execute(text("ALTER TABLE companies ADD COLUMN aktiv BOOLEAN DEFAULT 1"))
            print("  ✅ Oszlop hozzáadva: aktiv")
        except (OperationalError, ProgrammingError) as e:
            hiba_uzenet = str(e).lower()
            if "duplicate column" in hiba_uzenet or "already exists" in hiba_uzenet or "1060" in hiba_uzenet:
                print("  ⏩ Az oszlop már létezik, átugorva: aktiv")
            else:
                print(f"  ❌ Váratlan hiba történt az aktiv oszlopnál: {e}")

        # 5. Az AUDIT_LOGS tábla bővítése (jogosultsági napló céghez kötése)
        print("\n🔄 'audit_logs' tábla ellenőrzése és frissítése...")
        try:
            conn.execute(text("ALTER TABLE audit_logs ADD COLUMN company_id INTEGER"))
            print("  ✅ Oszlop hozzáadva: company_id")
        except (OperationalError, ProgrammingError) as e:
            hiba_uzenet = str(e).lower()
            if "duplicate column" in hiba_uzenet or "already exists" in hiba_uzenet or "1060" in hiba_uzenet:
                print("  ⏩ Az oszlop már létezik, átugorva: company_id")
            else:
                print(f"  ❌ Váratlan hiba történt a company_id oszlopnál: {e}")

    print("\n🎉 Az adatbázis frissítése sikeresen befejeződött!")

if __name__ == "__main__":
    frissit_adatbazist()

