package main

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

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

// componentImageCmd represents the component-image command
var componentImageCmd = &cobra.Command{
	Use:   "component-image",
	Short: "manage component images",
	Long:  `manage component images`,
}

func init() {
	rootCmd.AddCommand(componentImageCmd)

	componentImageCmd.AddCommand(newComponentImageGetCmd())
	componentImageCmd.AddCommand(newComponentImageUpdateCmd())
}

func newComponentImageGetCmd() *cobra.Command {
	var clusterType, version string
	cmd := &cobra.Command{
		Use:   "get <component>",
		Short: "get cluster component",
		Long:  `get cluster component`,
		RunE: func(cmd *cobra.Command, args []string) error {
			if len(args) < 1 {
				return fmt.Errorf("component name required")
			}
			var opts []grpc.DialOption
			opts = append(opts, grpc.WithInsecure())
			conn, err := grpc.Dial(configCenterEndpoint, opts...)
			if err != nil {
				return err
			}
			defer conn.Close()
			client := pb.NewConfigCenterServiceClient(conn)

			name := args[0]
			t, err := client.GetComponentImage(context.Background(), &pb.GetComponentImageRequest{
				ClusterType:      pb.ClusterType(pb.ClusterType_value[clusterType]),
				ComponentName:    name,
				ComponentVersion: version,
			})
			if err == nil {
				txt, _ := json.MarshalIndent(t, "", "    ")
				fmt.Println(string(txt))
			}
			return err
		},
	}

	cmd.Flags().StringVarP(&clusterType, "cluster-type", "T", pb.ClusterType_SHARED_POOL.String(), "cluster type")
	cmd.Flags().StringVarP(&version, "version", "v", "", "component version")

	return cmd
}

func newComponentImageUpdateCmd() *cobra.Command {
	var clusterType, version, baseImage, tag string
	cmd := &cobra.Command{
		Use:   "update <component>",
		Short: "update component image",
		Long:  `update component image`,
		RunE: func(cmd *cobra.Command, args []string) error {
			if len(args) < 1 {
				return fmt.Errorf("component name required")
			}
			var opts []grpc.DialOption
			opts = append(opts, grpc.WithInsecure())
			conn, err := grpc.Dial(configCenterEndpoint, opts...)
			if err != nil {
				return err
			}
			defer conn.Close()
			client := pb.NewConfigCenterServiceClient(conn)

			name := args[0]
			if baseImage == "" {
				baseImage = "gcr.io/pingcap-public/dbaas/" + name
			}
			t, err := client.UpdateComponentImage(context.Background(), &pb.UpdateComponentImageRequest{
				ClusterType:      pb.ClusterType(pb.ClusterType_value[clusterType]),
				ComponentName:    name,
				ComponentVersion: version,
				BaseImage:        baseImage,
				Tag:              tag,
			})
			if err == nil {
				txt, _ := json.MarshalIndent(t, "", "    ")
				fmt.Println(string(txt))
			}
			return err
		},
	}

	cmd.Flags().StringVarP(&clusterType, "cluster-type", "T", pb.ClusterType_SHARED_POOL.String(), "cluster type")
	cmd.Flags().StringVarP(&version, "version", "v", "", "version")
	cmd.Flags().StringVarP(&baseImage, "base-image", "b", "", "base image")
	cmd.Flags().StringVarP(&tag, "tag", "t", "", "tag")

	return cmd
}
