// A command line tool for generating typescript type declarations from go
// struct types.
//
// Example:
//
//	go run ./cmd/go2ts -o webui/src/types.ts
package main

import (
	"flag"
	"fmt"
	"os"

	"go.skia.org/infra/go/go2ts"
	"sketch.dev/git_tools"
	"sketch.dev/llm"
	"sketch.dev/loop"
	"sketch.dev/loop/server"
)

func main() {
	outputPath := flag.String("o", "", "Path to the output TypeScript file.")
	flag.Parse()

	generator := TS()

	w, err := os.Create(*outputPath)
	if err != nil {
		fmt.Printf("error: %v\n", err)
		os.Exit(1)
	}
	fmt.Fprintf(w, "// Auto-generated by sketch.dev/cmd/go2ts.go\n")
	generator.Render(w)
}

// TS returns a Go2TS generator for go types we want to use in TypeScript.
func TS() *go2ts.Go2TS {
	generator := go2ts.New()

	// Enum types
	generator.AddMultipleUnion(
		[]loop.CodingAgentMessageType{
			loop.UserMessageType,
			loop.AgentMessageType,
			loop.ErrorMessageType,
			loop.BudgetMessageType,
			loop.ToolUseMessageType,
			loop.CommitMessageType,
			loop.AutoMessageType,
			loop.PortMessageType,
			loop.CompactMessageType,
			loop.SlugMessageType,
			loop.ExternalMessageType,
		},
	)

	// Struct types
	generator.AddMultiple(
		loop.AgentMessage{},
		loop.GitCommit{},
		loop.ToolCall{},
		llm.Usage{},
		server.State{},
		server.TodoItem{},
		server.TodoList{},
		server.Remote{},
		server.GitPushInfoResponse{},
		server.GitPushRequest{},
		server.GitPushResponse{},
		git_tools.DiffFile{},
		git_tools.GitLogEntry{},
	)

	generator.GenerateNominalTypes = true

	return generator
}
