package ui

import (
	"fmt"
	"sort"

	"github.com/rivo/tview"

	"git.warky.dev/wdevs/relspecgo/pkg/models"
)

// SchemaEditor represents the interactive schema editor
type SchemaEditor struct {
	db         *models.Database
	app        *tview.Application
	pages      *tview.Pages
	loadConfig *LoadConfig
	saveConfig *SaveConfig
}

// NewSchemaEditor creates a new schema editor
func NewSchemaEditor(db *models.Database) *SchemaEditor {
	return &SchemaEditor{
		db:         db,
		app:        tview.NewApplication(),
		pages:      tview.NewPages(),
		loadConfig: nil,
		saveConfig: nil,
	}
}

// NewSchemaEditorWithConfigs creates a new schema editor with load/save configurations
func NewSchemaEditorWithConfigs(db *models.Database, loadConfig *LoadConfig, saveConfig *SaveConfig) *SchemaEditor {
	return &SchemaEditor{
		db:         db,
		app:        tview.NewApplication(),
		pages:      tview.NewPages(),
		loadConfig: loadConfig,
		saveConfig: saveConfig,
	}
}

// Run starts the interactive editor
func (se *SchemaEditor) Run() error {
	// If no database is loaded, show load screen
	if se.db == nil {
		se.showLoadScreen()
	} else {
		// Create main menu view
		mainMenu := se.createMainMenu()
		se.pages.AddPage("main", mainMenu, true, true)
	}

	// Run the application
	if err := se.app.SetRoot(se.pages, true).Run(); err != nil {
		return fmt.Errorf("application error: %w", err)
	}

	return nil
}

// GetDatabase returns the current database
func (se *SchemaEditor) GetDatabase() *models.Database {
	return se.db
}

// Helper function to get sorted column names
func getColumnNames(table *models.Table) []string {
	names := make([]string, 0, len(table.Columns))
	for name := range table.Columns {
		names = append(names, name)
	}
	sort.Strings(names)
	return names
}
