import pool from '../db.js';

// ==============================================================================
// Void-Genesis - Datenbank Initialisierungs-Skript
// Führt alle nötigen CREATE TABLE Befehle aus, falls die Tabellen nicht existieren.
// ==============================================================================

const createTablesQuery = `

-- ------------------------------------------------------------------------------
-- DROP TABLES
-- WICHTIG: Die Reihenfolge beim Löschen ist entscheidend!
-- Tabellen mit Fremdschlüsseln (Foreign Keys) müssen zuerst gelöscht werden.
-- ------------------------------------------------------------------------------
DROP TABLE IF EXISTS planets;
DROP TABLE IF EXISTS local_accounts;

-- ------------------------------------------------------------------------------
-- TABLE: lobby_accounts
-- Basis-Nutzerdaten für das gesamte Void-Genesis Universum.
-- ------------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS local_accounts (
    local_uuid UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    lobby_uuid UUID NOT NULL UNIQUE,
    username VARCHAR(50) NOT NULL UNIQUE,
    gender VARCHAR(10) NOT NULL,
    vacation BOOLEAN NOT NULL DEFAULT FALSE,
    blocked BOOLEAN NOT NULL DEFAULT FALSE,
    res_premium INT NOT NULL DEFAULT 0,
    avatar_id INT DEFAULT NULL,
    title_id INT DEFAULT NULL,
    
    -- Zeitstempel für Logs und Analysen
    last_login TIMESTAMP WITH TIME ZONE DEFAULT NULL,
    created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
    updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW()
);

-- ------------------------------------------------------------------------------
-- TABLE: planets
-- Verwaltet alle Planeten des Universums, deren Ressourcen, Bevölkerung,
-- Geografie und die Zuordnung zum jeweiligen Commander (local_uuid).
-- ------------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS planets (
    planet_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    parent_planet_id UUID REFERENCES planets(planet_id) ON DELETE CASCADE DEFAULT NULL,
    local_uuid UUID REFERENCES local_accounts(local_uuid) ON DELETE SET NULL,
    planet_name VARCHAR(100) NOT NULL,
    galaxy INT NOT NULL,
    system INT NOT NULL,
    position INT NOT NULL,
    temp_min INT NOT NULL,
    temp_max INT NOT NULL,
    diameter INT NOT NULL,
    fields_built INT NOT NULL,
    fields_explored INT NOT NULL,
    fields_max INT NOT NULL,
    res_wood NUMERIC(20,4) NOT NULL DEFAULT 0.0000,
    res_stone NUMERIC(20,4) NOT NULL DEFAULT 0.0000,
    res_primary NUMERIC(20,4) NOT NULL DEFAULT 0.0000,
    res_secondary NUMERIC(20,4) NOT NULL DEFAULT 0.0000,
    res_fuel_base NUMERIC(20,4) NOT NULL DEFAULT 0.0000,
    res_fuel_adv NUMERIC(20,4) NOT NULL DEFAULT 0.0000,
    res_food_base NUMERIC(20,4) NOT NULL DEFAULT 0.0000,
    res_food_adv NUMERIC(20,4) NOT NULL DEFAULT 0.0000,
    pop_idle NUMERIC(20,4) NOT NULL DEFAULT 0.0000,
    pop_working NUMERIC(20,4) NOT NULL DEFAULT 0.0000,
    pop_injured NUMERIC(20,4) NOT NULL DEFAULT 0.0000,
    created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
    updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW()
);

-- ------------------------------------------------------------------------------
-- TABLE: debris_fields
-- Speichert Trümmerfelder (aus Flottenkämpfen), wie in sectorSettings.json definiert.
-- Da ein Trümmerfeld keinem Account gehört, ist es eine separate Entität auf einer Koordinate.
-- ------------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS debris_fields (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    galaxy INT NOT NULL,
    system INT NOT NULL,
    position INT NOT NULL,
    res_primary NUMERIC(20,4) NOT NULL DEFAULT 0.0000,
    res_secondary NUMERIC(20,4) NOT NULL DEFAULT 0.0000,
    res_fuel_base NUMERIC(20,4) NOT NULL DEFAULT 0.0000,
    res_fuel_adv NUMERIC(20,4) NOT NULL DEFAULT 0.0000,
    created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
    updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
    UNIQUE(galaxy, system, position)
);

-- ------------------------------------------------------------------------------
-- TRIGGER: Auto-update 'updated_at' timestamp
-- Diese Funktion setzt das 'updated_at' Feld bei jeder Änderung auf die aktuelle Zeit.
-- ------------------------------------------------------------------------------
CREATE OR REPLACE FUNCTION update_modified_column()
RETURNS TRIGGER AS $$
BEGIN
    NEW.updated_at = NOW();
    RETURN NEW;
END;
$$ language 'plpgsql';

-- Wir wenden den Trigger nur an, wenn er noch nicht existiert.
DO $$ 
BEGIN
  -- Trigger für local_accounts
  IF NOT EXISTS (SELECT 1 FROM pg_trigger WHERE tgname = 'update_local_accounts_modtime') THEN
    CREATE TRIGGER update_local_accounts_modtime
        BEFORE UPDATE ON local_accounts
        FOR EACH ROW
        EXECUTE FUNCTION update_modified_column();
  END IF;
  IF NOT EXISTS (SELECT 1 FROM pg_trigger WHERE tgname = 'update_debris_fields_modtime') THEN
    CREATE TRIGGER update_debris_fields_modtime
        BEFORE UPDATE ON debris_fields
        FOR EACH ROW
        EXECUTE FUNCTION update_modified_column();
  END IF;
END $$;
`;

// ==============================================================================
// Ausführungs-Logik
// ==============================================================================
async function initDatabase() {
    console.log('⏳ Starte Sektor-Datenbank-Initialisierung...');
    
    const client = await pool.connect();

    try {
        await client.query(createTablesQuery);
        console.log('✅ Sektor-Tabellen wurden erfolgreich erstellt (oder existierten bereits).');
    } catch (error) {
        console.error('❌ Fehler beim Erstellen der Tabellen:', error);
    } finally {
        client.release();
        process.exit();
    }
}

initDatabase();