package main

import (
	"fmt"
	"io"
	"os"
	"path/filepath"
	"strings"

	"git.apinb.com/bsm-sdk/core/utils"
	"git.apinb.com/bsm-tools/protoc-gen-ts/internal/plugin"
	"google.golang.org/protobuf/proto"
	"google.golang.org/protobuf/types/pluginpb"
)

func main() {
	if err := run(); err != nil {
		fmt.Fprintf(os.Stderr, "%s: %v\n", filepath.Base(os.Args[0]), err)
		os.Exit(1)
	}

	genConst()
}

func genConst() {
	var body map[string][]*plugin.SrvMethod = make(map[string][]*plugin.SrvMethod)
	for _, item := range plugin.AllSrvMethods {
		name := strings.ToLower(item.PkgName)
		body[name] = append(body[name], &item)
	}

	for name, item := range body {
		constPath := "./sdk/typescript/" + name + "/const.ts"

		var code string
		for _, row := range item {
			code += "/** " + strings.TrimSpace(row.Comment) + " \n"
			code += "* - Request: " + row.In + "\n"
			code += "* - Response: " + row.Out + "\n"
			code += "*/\n"
			code += fmt.Sprintf("export const URL_%s_%s = \"/%s.%s/%s\"\n", row.ServiceName, row.MethodName, name, row.ServiceName, row.MethodName)
			code += "\n"
		}
		utils.StringToFile(constPath, code)
	}
}

func run() error {
	in, err := io.ReadAll(os.Stdin)
	if err != nil {
		return err
	}
	req := &pluginpb.CodeGeneratorRequest{}
	if err := proto.Unmarshal(in, req); err != nil {
		return err
	}
	resp, err := plugin.Generate(req)
	if err != nil {
		return err
	}
	out, err := proto.Marshal(resp)
	if err != nil {
		return err
	}
	if _, err := os.Stdout.Write(out); err != nil {
		return err
	}

	return nil
}