package config

import (
	"encoding/json"
	"flag"
	"os"
)

type Config struct {
	HttpPort uint
	Tiflash  struct {
		Port       uint
		Namespace  string
		ServiceDNS string
		ConfigMap  string // name of the config map for tiflash-manager
		Main       struct {
			PoolName        string
			StatefulSetName string // name of the main statefulset
		}
		Branch struct {
			PoolName        string
			StatefulSetName string // name of the branch statefulset
		}
		DefaultPool string
	}
}

func (c *Config) String() {
	data, err := json.MarshalIndent(c, "", "  ")
	if err != nil {
		panic(err)
	}
	os.Stdout.Write(data)
}

var defaultConfig = Config{
	HttpPort: 8080,
	Tiflash: struct {
		Port       uint
		Namespace  string
		ServiceDNS string
		ConfigMap  string
		Main       struct {
			PoolName        string
			StatefulSetName string
		}
		Branch struct {
			PoolName        string
			StatefulSetName string
		}
		DefaultPool string
	}{
		Port:       3930,
		Namespace:  "tidb-serverless",
		ServiceDNS: "tiflash-{POOL}-{INDEX}.tiflash-manager-{POOL}-peer.tidb-serverless.svc.cluster.local",
		ConfigMap:  "tiflash-tenants",
		Main: struct {
			PoolName        string
			StatefulSetName string
		}{
			PoolName:        "main",
			StatefulSetName: "tiflash-main",
		},
		Branch: struct {
			PoolName        string
			StatefulSetName string
		}{
			PoolName:        "branch",
			StatefulSetName: "tiflash-branch",
		},
		DefaultPool: "main",
	},
}

func Parsed() *Config {
	httpPort := flag.Uint("http-port", defaultConfig.HttpPort, "HTTP server port")
	tiflashPort := flag.Uint("tiflash-port", defaultConfig.Tiflash.Port, "TiFlash port")
	tiflashNamespace := flag.String("tiflash-namespace", defaultConfig.Tiflash.Namespace, "TiFlash namespace")
	tiflashServiceDNS := flag.String("tiflash-service-dns", defaultConfig.Tiflash.ServiceDNS, "TiFlash service DNS format")
	tiflashConfigMap := flag.String("tiflash-config-map", defaultConfig.Tiflash.ConfigMap, "TiFlash config map name")
	tiflashMainPoolName := flag.String("tiflash-main-pool", defaultConfig.Tiflash.Main.PoolName, "TiFlash main pool name")
	tiflashMainStatefulSet := flag.String("tiflash-main-statefulset", defaultConfig.Tiflash.Main.StatefulSetName, "TiFlash main statefulset name")
	tiflashBranchPoolName := flag.String("tiflash-branch-pool", defaultConfig.Tiflash.Branch.PoolName, "TiFlash branch pool name")
	tiflashBranchStatefulSet := flag.String("tiflash-branch-statefulset", defaultConfig.Tiflash.Branch.StatefulSetName, "TiFlash branch statefulset name")
	tiflashDefaultPool := flag.String("tiflash-default-pool", defaultConfig.Tiflash.DefaultPool, "TiFlash default pool name")
	flag.Parse()

	defaultConfig.HttpPort = *httpPort
	defaultConfig.Tiflash.Port = *tiflashPort
	defaultConfig.Tiflash.Namespace = *tiflashNamespace
	defaultConfig.Tiflash.ServiceDNS = *tiflashServiceDNS
	defaultConfig.Tiflash.ConfigMap = *tiflashConfigMap
	defaultConfig.Tiflash.Main.PoolName = *tiflashMainPoolName
	defaultConfig.Tiflash.Main.StatefulSetName = *tiflashMainStatefulSet
	defaultConfig.Tiflash.Branch.PoolName = *tiflashBranchPoolName
	defaultConfig.Tiflash.Branch.StatefulSetName = *tiflashBranchStatefulSet
	defaultConfig.Tiflash.DefaultPool = *tiflashDefaultPool

	return &defaultConfig
}

func (c *Config) LoadFromFile(path string) error {
	data, err := os.ReadFile(path)
	if err != nil {
		return err
	}

	if err := json.Unmarshal(data, c); err != nil {
		return err
	}

	return nil
}
