package main

import (
	"go/types"
	"sort"
	"strings"

	"go.mau.fi/mautrix-telegram/pkg/gotd/telegram/query/internal/genutil"
)

// Param represents request parameter.
type Param struct {
	// Name to use in function declaration.
	Name string
	// OriginalName in struct definition.
	OriginalName string
	// Go type.
	Type string
}

func varToParam(field *types.Var) Param {
	fieldName := field.Name()
	fieldName = strings.ToLower(fieldName[:1]) + fieldName[1:]
	return Param{
		Name:         fieldName,
		OriginalName: field.Name(),
		Type:         genutil.PrintType(field.Type()),
	}
}

func sortParams(p []Param) []Param {
	sort.SliceStable(p, func(i, j int) bool {
		return p[i].Name < p[j].Name
	})

	return p
}

// CachedQuery is a RPC cacheable query helper.
type CachedQuery struct {
	// Name of struct to generate.
	Name string
	// MethodName is name of method of tg.Client.
	MethodName string
	// RequestName is name of request struct.
	RequestName string
	// ManualHash determines whether hash must be computed using
	// hand-written function computeHash or not.
	// Need to resolve case when Telegram does not return hash with result.
	ManualHash bool
	// RequestParams contains additional params to send.
	RequestParams []Param
	// ResultName is name of result type.
	ResultName string
	// NotModifiedName is name of NotModified result type.
	NotModifiedName string
}

// Config is codegeneration config to use.
type Config struct {
	// Query helpers to generate.
	Queries []CachedQuery
	// ResultName package name
	Package string
}
