package cmd

import (
	"crypto/sha256"
	"embed"
	"fmt"
	"os"
	"strings"

	"port-knocker/internal"

	"github.com/gin-contrib/cors"
	"github.com/gin-gonic/gin"
	"github.com/spf13/cobra"
)

//go:embed public/*
var embeddedFS embed.FS

var serveCmd = &cobra.Command{
	Use:   "serve",
	Short: "Запуск встроенного веб-сервера с GUI и REST API",
	RunE:  runServe,
}

func init() {
	rootCmd.AddCommand(serveCmd)
}

func runServe(cmd *cobra.Command, args []string) error {
	pass := os.Getenv("GO_KNOCKER_SERVE_PASS")
	if strings.TrimSpace(pass) == "" {
		return fmt.Errorf("GO_KNOCKER_SERVE_PASS не задан — задайте пароль для доступа к GUI/API")
	}

	// Хеш, который будем использовать как ключ шифрования (совместимо с internal)
	passHash := sha256.Sum256([]byte(pass))
	// Пробрасываем пароль; internal сам выполнит sha256 от значения env
	os.Setenv(internal.EncryptionKeyEnvVar, pass)

	port := os.Getenv("GO_KNOCKER_SERVE_PORT")
	if strings.TrimSpace(port) == "" {
		port = "8888"
	}

	r := gin.Default()

	// CORS: разрешаем для локальной разработки
	r.Use(cors.New(cors.Config{
		AllowOrigins:     []string{"http://localhost:4200", "http://127.0.0.1:8888", "http://localhost:8888"},
		AllowMethods:     []string{"GET", "POST", "OPTIONS"},
		AllowHeaders:     []string{"Authorization", "Content-Type"},
		AllowCredentials: true,
	}))

	// Применяем middleware для защиты HTML страниц
	r.Use(staticAuthMiddleware(pass))

	// API роуты с авторизацией
	api := r.Group("/api/v1/knock-actions")
	api.Use(authMiddleware(pass))

	// Настраиваем роуты
	setupKnockRoutes(api)
	setupCryptoRoutes(api, passHash)
	setupStaticRoutes(r, embeddedFS)

	fmt.Printf("Serving on :%s\n", port)
	return r.Run(":" + port)
}
