package go_llm

import (
	"context"
	"gitea.stevedudenhoeffer.com/steve/go-llm/schema"
	"reflect"
)

// Parse takes a function pointer and returns a function object.
// fn must be a pointer to a function that takes a context.Context as its first argument, and then a struct that contains
// the parameters for the function.  The struct must contain only the types: string, int, float64, bool, and pointers to
// those types.
// The struct parameters can have the following tags:
// - Description: a string that describes the parameter, passed to openaiImpl to tell it what the parameter is for

func NewFunction[T any](name string, description string, fn func(context.Context, T) (string, error)) *Function {
	var o T

	res := Function{
		Name:        name,
		Description: description,
		Parameters:  schema.GetType(o),
		fn:          reflect.ValueOf(fn),
		paramType:   reflect.TypeOf(o),
	}

	if res.fn.Kind() != reflect.Func {
		panic("fn must be a function")
	}
	if res.paramType.Kind() != reflect.Struct {
		panic("function parameter must be a struct")
	}

	return &res
}