package main

import (
	"fmt"
	"os"
	"strings"

	"github.com/tidbcloud/tidb-management-service/tidb-x-migration/internal/api"
	"github.com/tidbcloud/tidb-management-service/tidb-x-migration/internal/config"
	"github.com/tidbcloud/tidb-management-service/tidb-x-migration/internal/storage"
	"github.com/tidbcloud/tidb-management-service/tidb-x-migration/internal/task"
	"github.com/tidbcloud/tidb-management-service/tidb-x-migration/internal/tool"

	"github.com/gin-gonic/gin"
)

func main() {
	// Install tiup tools
	if err := tool.InstallTiupTools(); err != nil {
		fmt.Printf("Failed to install tiup tools: %v\n", err)
		os.Exit(1)
	}

	// Initialize configuration
	config.InitConfig()

	// Initialize storage
	taskStorage, err := initStorage()
	if err != nil {
		fmt.Printf("Failed to initialize storage: %v\n", err)
		os.Exit(1)
	}
	defer taskStorage.Close()

	// Initialize task manager
	taskManager := task.NewManager(
		taskStorage,
		config.MaxRetries,
		config.MaxConcurrentTasks,
		config.TaskPollInterval,
		config.StaleTaskTTL,
	)

	// Initialize API handlers
	handlers := api.NewHandlers(taskManager)

	// Initialize Gin engine
	router := gin.Default()

	// Set up routes
	api.SetupRoutes(router, handlers)
	api.SetupHealthCheck(router)

	// Get port
	port := os.Getenv("PORT")
	if port == "" {
		port = "8080"
	}

	// Start server
	fmt.Printf("Server starting on :%s\n", port)
	if err := router.Run(":" + port); err != nil {
		fmt.Printf("Failed to start server: %v\n", err)
		os.Exit(1)
	}
}

func initStorage() (storage.Storage, error) {
	switch strings.ToLower(config.StorageType) {
	case "mysql", "tidb":
		return storage.NewMySQLStorage(config.MySQLDSN)
	case "memory":
		return storage.NewMemoryStorage(), nil
	default:
		return nil, fmt.Errorf("unsupported storage type: %s", config.StorageType)
	}
}
