package controller

import (
	"fmt"
	"github.com/gin-gonic/gin"
)

type PaLMChatMessage struct {
	Author  string `json:"author"`
	Content string `json:"content"`
}

type PaLMFilter struct {
	Reason  string `json:"reason"`
	Message string `json:"message"`
}

// https://developers.generativeai.google/api/rest/generativelanguage/models/generateMessage#request-body
type PaLMChatRequest struct {
	Prompt         []Message `json:"prompt"`
	Temperature    float64   `json:"temperature"`
	CandidateCount int       `json:"candidateCount"`
	TopP           float64   `json:"topP"`
	TopK           int       `json:"topK"`
}

// https://developers.generativeai.google/api/rest/generativelanguage/models/generateMessage#response-body
type PaLMChatResponse struct {
	Candidates []Message    `json:"candidates"`
	Messages   []Message    `json:"messages"`
	Filters    []PaLMFilter `json:"filters"`
}

func relayPaLM(openAIRequest GeneralOpenAIRequest, c *gin.Context) *OpenAIErrorWithStatusCode {
	// https://developers.generativeai.google/api/rest/generativelanguage/models/generateMessage
	messages := make([]PaLMChatMessage, 0, len(openAIRequest.Messages))
	for _, message := range openAIRequest.Messages {
		var author string
		if message.Role == "user" {
			author = "0"
		} else {
			author = "1"
		}
		messages = append(messages, PaLMChatMessage{
			Author:  author,
			Content: message.Content,
		})
	}
	request := PaLMChatRequest{
		Prompt:         nil,
		Temperature:    openAIRequest.Temperature,
		CandidateCount: openAIRequest.N,
		TopP:           openAIRequest.TopP,
		TopK:           openAIRequest.MaxTokens,
	}
	// TODO: forward request to PaLM & convert response
	fmt.Print(request)
	return nil
}