package main

import (
	"context"
	"encoding/json"
	"fmt"

	"github.com/spf13/cobra"
	pb "github.com/tidbcloud/config-center/proto/config_center"
	"google.golang.org/grpc"
	"google.golang.org/protobuf/types/known/structpb"
)

// tenantParamsCmd represents the tenant_params command
var tenantParamsCmd = &cobra.Command{
	Use:   "tenant-params",
	Short: "manage tenant related default custom params",
	Long:  `manage tenant related default custom params`,
}

func init() {
	rootCmd.AddCommand(tenantParamsCmd)

	tenantParamsCmd.AddCommand(newTenantGetCmd())
	tenantParamsCmd.AddCommand(newTenantListCmd())
	tenantParamsCmd.AddCommand(newTenantUpdateCmd())
}

func newTenantGetCmd() *cobra.Command {
	var clusterType string
	var tenantID uint64
	cmd := &cobra.Command{
		Use:   "get <filename>",
		Short: "get tenant related default custom params",
		Long:  `get tenant related default custom params`,
		RunE: func(cmd *cobra.Command, args []string) error {
			var opts []grpc.DialOption
			opts = append(opts, grpc.WithInsecure())
			conn, err := grpc.Dial(configCenterEndpoint, opts...)
			if err != nil {
				panic(err)
			}
			defer conn.Close()
			client := pb.NewConfigCenterServiceClient(conn)

			filename := args[0]
			t, err := client.GetTenantInitialCustomParams(context.Background(), &pb.GetTenantInitialCustomParamsRequest{
				ClusterType:       pb.ClusterType(pb.ClusterType_value[clusterType]),
				TenantId:          tenantID,
				ConfigurationType: filename,
			})
			if err == nil {
				txt, _ := json.MarshalIndent(t, "", "    ")
				fmt.Println(string(txt))
			}
			return err
		},
	}

	cmd.Flags().StringVarP(&clusterType, "cluster-type", "T", pb.ClusterType_DEDICATED_TIDB.String(), "cluster type")
	cmd.Flags().Uint64VarP(&tenantID, "tenant-id", "t", 0, "cluster id")

	return cmd
}

func newTenantListCmd() *cobra.Command {
	var clusterType string
	var tenantID uint64
	cmd := &cobra.Command{
		Use:   "list",
		Short: "list tenant related default custom params",
		Long:  `list tenant related default custom params`,
		RunE: func(cmd *cobra.Command, args []string) error {
			var opts []grpc.DialOption
			opts = append(opts, grpc.WithInsecure())
			conn, err := grpc.Dial(configCenterEndpoint, opts...)
			if err != nil {
				panic(err)
			}
			defer conn.Close()
			client := pb.NewConfigCenterServiceClient(conn)

			t, err := client.ListTenantInitialCustomParams(context.Background(), &pb.ListTenantInitialCustomParamsRequest{
				ClusterType: pb.ClusterType(pb.ClusterType_value[clusterType]),
				TenantId:    tenantID,
			})
			if err == nil {
				txt, _ := json.MarshalIndent(t, "", "    ")
				fmt.Println(string(txt))
			}
			return err
		},
	}

	cmd.Flags().StringVarP(&clusterType, "cluster-type", "T", pb.ClusterType_DEDICATED_TIDB.String(), "cluster type")
	cmd.Flags().Uint64VarP(&tenantID, "tenant-id", "t", 0, "cluster id")

	return cmd
}

func newTenantUpdateCmd() *cobra.Command {
	var clusterType string
	var tenantID uint64
	cmd := &cobra.Command{
		Use:   "update <filename>",
		Short: "update tenant related default custom params",
		Long:  `update tenant related default custom params`,
		RunE: func(cmd *cobra.Command, args []string) error {
			var opts []grpc.DialOption
			opts = append(opts, grpc.WithInsecure())
			conn, err := grpc.Dial(configCenterEndpoint, opts...)
			if err != nil {
				panic(err)
			}
			defer conn.Close()
			client := pb.NewConfigCenterServiceClient(conn)

			initialParams := make(map[string]*pb.ParamItem)
			initialParams["tenant.name"] = &pb.ParamItem{
				Value:   structpb.NewStringValue("test_tenant"),
				Comment: "tenant name is test_tenant",
			}
			filename := args[0]
			t, err := client.UpdateTenantInitialCustomParams(context.Background(), &pb.UpdateTenantInitialCustomParamsRequest{
				ClusterType:       pb.ClusterType(pb.ClusterType_value[clusterType]),
				TenantId:          tenantID,
				ConfigurationType: filename,
				InitialParams:     initialParams,
			})
			if err == nil {
				txt, _ := json.MarshalIndent(t, "", "    ")
				fmt.Println(string(txt))
			}
			return err
		},
	}

	cmd.Flags().StringVarP(&clusterType, "cluster-type", "T", pb.ClusterType_DEDICATED_TIDB.String(), "cluster type")
	cmd.Flags().Uint64VarP(&tenantID, "tenant-id", "t", 0, "tenant id")

	return cmd
}
