package main

import (
	"database/sql"
	"log"
	"strings"

	_ "modernc.org/sqlite"
)

// database
//
// Manage database connection to ./app.db
// Handles CRUD
func database() *sql.DB {
	db, err := sql.Open("sqlite", "./app.db")
	if err != nil {
		log.Fatal(err)
	}

	// Seed default menu items if empty
	row := db.QueryRow("SELECT COUNT(*) FROM menu_items")
	var count int
	_ = row.Scan(&count)
	if count == 0 {
		log.Println("Seeding default menu_items…")
		defaults := []struct {
			category string
			name     string
		}{
			{"soup", "Erőleves"},
			{"soup", "Dörgicsei Csibeleves"},
			{"soup", "Újházi Tyúkhúsleves"},
			{"soup", "Jókai Bableves"},
			{"soup", "Tárkonyos Raguleves"},
			{"soup", "Frankfurti Leves"},
			{"soup", "Tavaszi Zöldségleves"},
			{"soup", "Fokhagyma Krémleves"},

			{"main", "Babragus Csülök"},
			{"main", "Rántott Csirkemell"},
			{"main", "Rántott Gomba és Rántott Camembert"},
			{"main", "Cordon Bleu"},
			{"main", "Cigánypecsenye Kakastaréjjal"},
			{"main", "Mozzarellás-Paradicsomos Csirkemell Roston"},
			{"main", "Kemencés Fokhagymás Csülökszeletek"},
			{"main", "Holstein Szelet"},
			{"main", "Jalapeños Sajtgolyók"},
			{"main", "Cornflakes Bundában Sült Csirkemell"},
			{"main", "Baconköntösben Pirított Csirkemáj"},

			{"side", "Friss Saláta Kapros Joghurtos Öntettel"},
			{"side", "Párolt Rizs"},
			{"side", "Fűszeres Steakburgonya"},
			{"side", "Grill Zöldség"},
			{"side", "Lilahagymás Kukoricasaláta"},
		}

		for _, d := range defaults {
			_, err := db.Exec("INSERT INTO menu_items (category, name) VALUES (?, ?)", d.category, d.name)
			if err != nil {
				log.Println("Error seeding menu item:", err)
			}
		}
	}

	// Create users table
	_, err = db.Exec(`
		CREATE TABLE IF NOT EXISTS users (
			id INTEGER PRIMARY KEY AUTOINCREMENT,
			username TEXT NOT NULL UNIQUE,
			password TEXT NOT NULL,
			role INTEGER NOT NULL DEFAULT 2
		)
	`)
	if err != nil {
		log.Fatal(err)
	}

	// Create settings table
	_, err = db.Exec(`
    CREATE TABLE IF NOT EXISTS settings (
        key TEXT PRIMARY KEY,
        value TEXT NOT NULL
    )
	`)
	if err != nil {
		log.Fatal(err)
	}

	// Seed default finalize_time if missing
	_, err = db.Exec(`INSERT OR IGNORE INTO settings (key, value) VALUES ('finalize_time', '10:30')`)
	if err != nil {
		log.Fatal(err)
	}

	_, err = db.Exec(`
		CREATE TABLE IF NOT EXISTS menu_items (
			id INTEGER PRIMARY KEY AUTOINCREMENT,
			category TEXT NOT NULL,
			name TEXT NOT NULL
		)
	`)
	if err != nil {
		log.Fatal(err)
	}

	// Create selections table (latest choice per user)
	_, err = db.Exec(`
		CREATE TABLE IF NOT EXISTS selections (
			id INTEGER PRIMARY KEY AUTOINCREMENT,
			user_id INTEGER NOT NULL,
			main TEXT NOT NULL,
			side TEXT NOT NULL,
			soup TEXT,
			created_at TEXT NOT NULL,
			FOREIGN KEY (user_id) REFERENCES users(id)
		)
	`)
	if err != nil {
		log.Fatal(err)
	}

	// Create orders table (all placed orders for history + realtime updates)
	_, err = db.Exec(`
		CREATE TABLE IF NOT EXISTS orders (
			id INTEGER PRIMARY KEY AUTOINCREMENT,
			username TEXT NOT NULL,
			soup TEXT,
			main TEXT NOT NULL,
			side TEXT NOT NULL,
			created_at TEXT NOT NULL
		)
	`)
	if err != nil {
		log.Fatal(err)
	}

	// Add status column if it doesn't exist
	_, err = db.Exec(`ALTER TABLE orders ADD COLUMN status TEXT NOT NULL DEFAULT 'active'`)
	if err != nil && !strings.Contains(err.Error(), "duplicate column name") {
		log.Fatal(err)
	}

	return db
}
