// Skript zum Einrichten von Supabase-Funktionen und Tabellen
import { createClient } from '@supabase/supabase-js';
import dotenv from 'dotenv';
import { fileURLToPath } from 'url';
import { dirname, join } from 'path';
import fs from 'fs';

// Lade Umgebungsvariablen aus .env
dotenv.config();

const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);

// Supabase-Client erstellen
const supabaseUrl = process.env.EXPO_PUBLIC_SUPABASE_URL;
const supabaseKey = process.env.EXPO_PUBLIC_SUPABASE_ANON_KEY;

if (!supabaseUrl || !supabaseKey) {
	console.error(
		'Fehler: EXPO_PUBLIC_SUPABASE_URL und EXPO_PUBLIC_SUPABASE_ANON_KEY müssen in der .env-Datei definiert sein.'
	);
	process.exit(1);
}

const supabase = createClient(supabaseUrl, supabaseKey);

// Funktion zum Ausführen einer SQL-Datei
async function executeSqlFile(filePath) {
	try {
		const fullPath = join(__dirname, filePath);
		console.log(`Führe SQL-Datei aus: ${fullPath}`);

		if (!fs.existsSync(fullPath)) {
			console.error(`Fehler: Datei ${fullPath} existiert nicht.`);
			return false;
		}

		const query = fs.readFileSync(fullPath, 'utf8');

		// Teile die Abfrage in einzelne Anweisungen auf
		const statements = query.split(';').filter((stmt) => stmt.trim() !== '');

		for (const statement of statements) {
			console.log(`Führe aus: ${statement.trim()}`);
			const { error } = await supabase.rpc('execute_sql', { query: statement.trim() });

			if (error) {
				console.error('Fehler bei der Ausführung:', error.message);
				// Fahre trotz Fehler fort
			}
		}

		return true;
	} catch (error) {
		console.error('Fehler beim Lesen oder Ausführen der Datei:', error.message);
		return false;
	}
}

// Funktion zum Erstellen der execute_sql-Funktion
async function createExecuteSqlFunction() {
	try {
		console.log('Erstelle execute_sql-Funktion...');

		const query = `
      CREATE OR REPLACE FUNCTION execute_sql(query text)
      RETURNS JSONB
      LANGUAGE plpgsql
      SECURITY DEFINER
      AS $$
      DECLARE
        result JSONB;
      BEGIN
        EXECUTE 'SELECT jsonb_agg(row_to_json(t)) FROM (' || query || ') t' INTO result;
        RETURN COALESCE(result, '[]'::jsonb);
      EXCEPTION
        WHEN OTHERS THEN
          RAISE EXCEPTION 'SQL-Fehler: %', SQLERRM;
      END;
      $$;
    `;

		const { error } = await supabase.rpc('execute_sql', { query });

		if (error) {
			// Die Funktion existiert möglicherweise noch nicht, versuche direkte SQL-Ausführung
			console.log('Versuche direkte SQL-Ausführung...');

			const { error: directError } = await supabase.from('_exec_sql').insert({ sql: query });

			if (directError) {
				console.error('Fehler beim Erstellen der execute_sql-Funktion:', directError.message);
				return false;
			}
		}

		console.log('execute_sql-Funktion erfolgreich erstellt.');
		return true;
	} catch (error) {
		console.error('Unerwarteter Fehler:', error.message);
		return false;
	}
}

// Hauptfunktion
async function setupSupabase() {
	console.log('Starte Supabase-Setup...');

	// Erstelle die execute_sql-Funktion
	const execSqlCreated = await createExecuteSqlFunction();

	if (!execSqlCreated) {
		console.log('Konnte execute_sql-Funktion nicht erstellen. Versuche trotzdem fortzufahren...');
	}

	// Führe die SQL-Dateien aus
	console.log('Führe Supabase-Funktionen-Setup aus...');
	await executeSqlFile('setup_supabase_functions.sql');

	console.log('Führe Modell-Updates aus...');
	await executeSqlFile('update_models.sql');

	console.log('Richte RLS-Richtlinien ein...');
	await executeSqlFile('setup_rls_policies.sql');

	console.log('Supabase-Setup abgeschlossen.');
}

// Führe die Funktion aus
setupSupabase()
	.catch((error) => {
		console.error('Unerwarteter Fehler:', error);
	})
	.finally(() => {
		process.exit(0);
	});
