package dao

import (
	"strconv"
	"strings"
	"time"

	"github.com/tidbcloud/api-gateway/ui/internal/util"
)

type Route struct {
	ID          int
	Host        string
	Path        string
	Namespace   string
	ServiceName string
	ServicePort int
	Priority    int
	TestCases   string
	Status      bool
	CreatedAt   time.Time
	UpdatedAt   time.Time
}

func (r *Route) ToRouteModel(label int) util.RouteModel {
	return util.RouteModel{
		Label:       label,
		Host:        r.Host,
		Path:        r.Path,
		Namespace:   r.Namespace,
		ServiceName: r.ServiceName,
		ServicePort: r.ServicePort,
		TestCases:   strings.Split(r.TestCases, ","),
	}
}

func CreateRoute(host, path, namespace, serviceName, servicePort, testCases string) error {
	port, err := strconv.Atoi(servicePort)
	if err != nil {
		return err
	}
	route := Route{
		Host:        host,
		Path:        path,
		Namespace:   namespace,
		ServiceName: serviceName,
		ServicePort: port,
		Priority:    100,
		TestCases:   testCases,
		Status:      true,
		CreatedAt:   time.Now(),
		UpdatedAt:   time.Now(),
	}
	return db.Create(&route).Error
}

func ListRoutes() ([]Route, error) {
	routes := make([]Route, 0)
	result := db.Where("status = ?", true).Order("id desc").Find(&routes)
	return routes, result.Error
}

func ListRoutesByHost(host string) ([]Route, error) {
	routes := make([]Route, 0)
	result := db.Where("host=? and status=?", host, true).Find(&routes)
	return routes, result.Error
}

func GetRoute(id int) (*Route, error) {
	route := new(Route)
	result := db.First(route, id)
	return route, result.Error
}

func UpdateRoute(id int, host, path, namespace, serviceName, servicePort, testCases string) error {
	port, err := strconv.Atoi(servicePort)
	if err != nil {
		return err
	}
	route := new(Route)
	result := db.First(route, id)
	if result.Error != nil {
		return result.Error
	}
	route.Host = host
	route.Path = path
	route.Namespace = namespace
	route.ServiceName = serviceName
	route.ServicePort = port
	route.TestCases = testCases
	return db.Save(route).Error
}

func DeleteRoute(id int) error {
	route := new(Route)
	result := db.First(route, id)
	if result.Error != nil {
		return result.Error
	}
	route.Status = false
	return db.Save(route).Error
}
