package main

import (
	"io/ioutil"
	"log"
	"os"

	"github.com/gin-gonic/gin"
	"github.com/gomodule/redigo/redis"
)

var client redis.Conn

func main() {
	host := os.Getenv("host")
	redisPort := os.Getenv("port")
	endpoint := host + ":" + redisPort
	var err error
	client, err = redis.Dial("tcp",
		endpoint,
		redis.DialPassword(os.Getenv("password")),
	)
	if err != nil {
		log.Fatal("can't connect to the Redis database")
	}
	pong, e := Ping(client)
	if e != nil {
		log.Println("can't get response from Redis database ", e)
	}
	log.Println(pong)
	router := gin.Default()
	router.GET("/", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "Hello Kyma!",
		})
	})
	v1 := router.Group("/api/v1/orders")
	{
		v1.GET("/", getOrder)
		v1.POST("/", createOrder)
	}
	port := os.Getenv("PORT")
	if port == "" {
		port = "5000"
	}
	port = ":" + port
	err = router.Run(port)
	if err != nil {
		log.Println(err)
	}
	defer client.Close()
}

// createOrder
func createOrder(c *gin.Context) {
	order, err := ioutil.ReadAll(c.Request.Body)
	if err != nil {
		log.Println(err)
	}
	if _, err = client.Do("SET", "order", order); err != nil {
		log.Println(err)
	}
}

// getOrder
func getOrder(c *gin.Context) {
	order, err := redis.String(client.Do("GET", "order"))
	if err != nil {
		log.Fatal(err)
	}
	c.JSON(200, order)
}

func Ping(c redis.Conn) (interface{}, error) {
	return redis.String(c.Do("PING"))
}
