package main

import (
	"net/http"

	"github.com/gin-gonic/gin"
	log "github.com/sirupsen/logrus"
)

// Modeled after google docs
// https://developers.google.com/assistant/conversational/responses#browsing_carousel

// Response is the entire JSON payload response
type Response struct {
	Payload Payload `json:"payload"`
}

// Payload is a google defined higher structure, see https://developers.google.com/assistant/conversational/responses#browsing_carousel
type Payload struct {
	Google Google `json:"google"`
}

// Google is another google defined higher structure, see https://developers.google.com/assistant/conversational/responses#browsing_carousel
type Google struct {
	ExpectUserResponse bool         `json:"expectUserResponse"`
	RichResponse       RichResponse `json:"richResponse,omitempty"`
}

// RichResponse gives UI representation of the news data fetched
type RichResponse struct {
	Items []Item `json:"items,omitempty"`
}

// Item provides different interactions
type Item struct {
	SimpleResponse *SimpleResponse `json:"simpleResponse,omitempty"`
	CarouselBrowse *CarouselBrowse `json:"carouselBrowse,omitempty"`
}

// Simple response provides audio only feedback
type SimpleResponse struct {
	TextToSpeech string `json:"textToSpeech"`
}

// CarouselBrowse provides a UI list of items with hyperlinks
type CarouselBrowse struct {
	Items []CarouselItem `json:"items"`
}

// CarouselItem is a UI entry for each news item
type CarouselItem struct {
	Title         string        `json:"title"`
	OpenURLAction OpenURLAction `json:"openUrlAction"`
	Description   string        `json:"description,omitempty"`
}

// OpenURLAction provides a url to be opened in the client's browser when touched
type OpenURLAction struct {
	URL string `json:"url"`
}

func buildFulfillment() *Response {
	return &Response{
		Payload{
			Google{
				ExpectUserResponse: false,
				RichResponse: RichResponse{
					Items: []Item{
						{
							SimpleResponse: &SimpleResponse{
								TextToSpeech: "This is the default audio response",
							},
						},
						{
							CarouselBrowse: &CarouselBrowse{
								Items: []CarouselItem{

									CarouselItem{
										Title:       "Title1",
										Description: "Description1",
										OpenURLAction: OpenURLAction{
											URL: "https://example.com/1",
										},
									},

									CarouselItem{
										Title:       "Title2",
										Description: "Description2",
										OpenURLAction: OpenURLAction{
											URL: "https://example.com/2",
										},
									},
								},
							},
						},
					},
				},
			},
		},
	}
}

func handleWebhook(c *gin.Context) {
	c.JSON(http.StatusOK, buildFulfillment())
}

func main() {
	var err error
	r := gin.Default()
	r.POST("/webhook", handleWebhook)
	if err = r.Run(); err != nil {
		log.WithError(err).Fatal("Couldn't start server")
	}
}