package main

import (
	"database/sql"
	"fmt"

	"github.com/gin-gonic/contrib/sessions"
	"github.com/gin-gonic/contrib/static"

	"github.com/gin-gonic/gin"

	_ "github.com/lib/pq"
)

var router *gin.Engine
var db *sql.DB

func main() {

	// Подключение к базе данных
	connect()

	// Создаем роутер по умолчанию
	router = gin.Default()

	// Загружаем файлы шаблонов HTML страниц
	router.LoadHTMLFiles(
		cfg.Template+"index.html",
		cfg.Template+"footer.html",
		cfg.Template+"header.html",
		cfg.Template+"authorization.html",
		cfg.Template+"admin.html",
		cfg.Template+"404.html",
		cfg.Template+"page1.html",
		cfg.Template+"page2.html",
		cfg.Template+"page3.html",
		cfg.Template+"page4.html",
		cfg.Template+"page5.html",
	)

	// Указываем папку статических файлов
	router.Static("/assets", cfg.Assets)

	// Указываем путь к различным локальным файлам (картинки, документы, видео и тд). Папка data
	router.Use(static.Serve("/", static.LocalFile(cfg.Data, false)))

	// Создаем сессию (необходимо для сохранения авторизации на сайте)
	word := sessions.NewCookieStore([]byte("my-private-key"))
	router.Use(sessions.Sessions("session", word))

	// Обработчик запроса, если пользователь будет долбиться по не существующему адресу
	router.NoRoute(notFound)

	router.GET("/", index)
	router.GET("/page/:page", indexPage)
	router.GET("/authorization", authorization)
	router.POST("/login", login)
	router.GET("/logout", logout)

	router.Run(cfg.ServerHost + ":" + cfg.ServerPort)
}

func notFound(c *gin.Context) {
	c.HTML(404, "404", gin.H{})
}

func indexPage(c *gin.Context) {
	page := c.Param("page")

	s := sessions.Default(c)

	admin := false
	isLogin := false

	role, ok := s.Get("MySecretKey").(string)
	if ok {
		if role == "admin" {
			admin = true
		}
		isLogin = true
	}

	c.HTML(200, "index", gin.H{
		"Title":   "Мой сайт",
		"IsAdmin": admin,
		"IsLogin": isLogin,
		"Page":    page,
	})
}

func index(c *gin.Context) {
	s := sessions.Default(c)

	admin := false
	isLogin := false

	role, ok := s.Get("MySecretKey").(string)
	if ok {
		if role == "admin" {
			admin = true
		}
		isLogin = true
	}

	c.HTML(200, "index", gin.H{
		"Title":   "Мой сайт",
		"IsAdmin": admin,
		"IsLogin": isLogin,
		"Page":    "main",
	})
}

func authorization(c *gin.Context) {
	c.HTML(200, "authorization", gin.H{})
}

func login(c *gin.Context) {

	s := sessions.Default(c)

	_, ok := s.Get("MySecretKey").(string)
	if ok {
		s.Clear()
	}

	var u user

	e := c.BindJSON(&u)
	if e != nil {
		fmt.Println(e.Error())

		c.JSON(200, gin.H{
			"Result": false,
		})

		return
	}

	row := db.QueryRow(`SELECT "Role", "Name" FROM "User" WHERE "Phone"=$1 AND "Password"=$2`, u.Phone, u.Password)

	e = row.Scan(&u.Role, &u.Name)
	if e != nil {
		fmt.Println(e.Error())

		c.JSON(200, gin.H{
			"Result": false,
		})

		return
	}

	s.Set("MySecretKey", u.Role)

	e = s.Save()
	if e != nil {
		fmt.Println(e.Error())

		c.JSON(200, gin.H{
			"Result": false,
		})

		return
	}

	c.JSON(200, gin.H{
		"Result": true,
		"Name":   u.Name,
	})
}

func logout(c *gin.Context) {
	s := sessions.Default(c)

	role, ok := s.Get("MySecretKey").(string)
	if ok {
		s.Delete(role)
		s.Clear()
		s.Save()
	}

	c.HTML(200, "index", gin.H{
		"Title":   "Мой сайт",
		"IsAdmin": false,
		"IsLogin": false,
	})
}
