package main

import (
	"fmt"
	"log"
	"os"
	"path/filepath"

	deltalake "github.com/tidbcloud/metering/delta-rs-golang"
)

func main() {
	fmt.Println("Delta Lake Go Binding - SQL Query Example")

	tempDir, err := os.MkdirTemp("", "delta-query-example")
	if err != nil {
		log.Fatalf("failed to create temp directory: %v", err)
	}
	defer os.RemoveAll(tempDir)

	tablePath := filepath.Join(tempDir, "people")

	columns := []deltalake.ColumnDefinition{
		{Name: "id", Type: "integer", Nullable: false},
		{Name: "name", Type: "string", Nullable: false},
		{Name: "age", Type: "integer", Nullable: false},
		{Name: "year", Type: "integer", Nullable: false},
	}

	options := deltalake.CreateTableOptions{
		TablePath: tablePath,
		SaveMode:  deltalake.WriteModeOverwrite,
		Columns:   columns,
	}

	fmt.Printf("Creating Delta table at %s\n", tablePath)
	table, err := deltalake.CreateDeltaLakeTable(options)
	if err != nil {
		log.Fatalf("failed to create table: %v", err)
	}
	defer table.Close()

	data := deltalake.WriteData{
		Schema: columns,
		Data: [][]interface{}{
			{1, "Alice", 25, 2020},
			{2, "Bob", 30, 2021},
			{3, "Charlie", 35, 2021},
			{4, "Diana", 40, 2022},
		},
	}

	fmt.Println("Writing sample rows to table...")
	populatedTable, err := table.Write(data, deltalake.WriteModeAppend)
	if err != nil {
		log.Fatalf("failed to write data: %v", err)
	}
	defer populatedTable.Close()

	fmt.Println("\nQuery 1: default alias (delta_table)")
	rows, err := populatedTable.Query(
		"SELECT name, age FROM delta_table WHERE year = 2021 ORDER BY age",
		nil,
	)
	if err != nil {
		log.Fatalf("query failed: %v", err)
	}

	for _, row := range rows {
		fmt.Printf("  - %s (age %.0f)\n", row["name"], numericAsFloat(row["age"]))
	}

	fmt.Println("\nQuery 2: custom alias (events)")
	aliasRows, err := populatedTable.Query(
		"SELECT year, COUNT(1) AS cnt FROM events GROUP BY year ORDER BY year",
		&deltalake.QueryOptions{TableAlias: "events"},
	)
	if err != nil {
		log.Fatalf("alias query failed: %v", err)
	}

	for _, row := range aliasRows {
		fmt.Printf("  - year %.0f has %.0f rows\n", numericAsFloat(row["year"]), numericAsFloat(row["cnt"]))
	}

	fmt.Println("\nSuccess! Delta table SQL queries executed via Go bindings.")
}

func numericAsFloat(value interface{}) float64 {
	switch v := value.(type) {
	case float64:
		return v
	case int:
		return float64(v)
	case int64:
		return float64(v)
	default:
		log.Fatalf("unexpected numeric type %T", value)
	}
	return 0
}
