package cmd

import (
	"fmt"
	"github.com/spf13/cobra"
	"net/rpc"
	"net/url"
	"ultone/internal/log"
	"ultone/internal/opt"
	"ultone/internal/unix"
)

var (
	cliCommand = &cobra.Command{
		Use: "cli",
		PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
			log.Debug(cmd.Context(), "[cmd.cli] svc address: %s", svc)

			uri, err := url.Parse(svc)
			if err != nil {
				return err
			}

			if cliClient, err = rpc.Dial(uri.Scheme, uri.Host+uri.Path); err != nil {
				return fmt.Errorf("rpc dial [%s] [%s] err: %w", uri.Scheme, uri.Host+uri.Path, err)
			}

			return nil
		},
		RunE: func(cmd *cobra.Command, args []string) error {
			log.Debug(cmd.Context(), "[cli] start run cli... all args: %v", args)

			return nil
		},
	}

	svc       string
	cliClient *rpc.Client
)

func initCli() {
	cliCommand.PersistentFlags().StringVar(&svc, "svc", opt.RpcAddress, "server unix listen address")
	cliCommand.AddCommand(&cobra.Command{
		Use: "set",
		RunE: func(cmd *cobra.Command, args []string) (err error) {
			log.Debug(cmd.Context(), "[cli.set] all args: %v", args)

			if len(args) < 2 {
				return fmt.Errorf("at least 2 args required")
			}

			switch args[0] {
			case "debug":
				out := &unix.Resp[bool]{}
				in := &unix.SettingReq{Debug: false}
				switch args[1] {
				case "true":
					in.Debug = true
				case "false":
				default:
					return fmt.Errorf("unknown debug value")
				}

				if err = cliClient.Call("svc.Setting", in, out); err != nil {
					return err
				}

				log.Info(cmd.Context(), out.Msg)
			default:
				return fmt.Errorf("unknown set variable(debug is available now)")
			}

			return nil
		},
	})
}