package routes

import (
	"net/http"
	"os"
	"strings"
	"time"

	"github.com/gofiber/fiber/v2"
	"github.com/mattn/go-sqlite3"
	"github.com/ngn13/website/api/util"
)

var Token string = util.CreateToken() 

func AuthMiddleware(c *fiber.Ctx) error {
  if c.Path() == "/admin/login" {
    return c.Next()
  }

  if c.Get("Authorization") != Token {
    return util.ErrAuth(c) 
  }

  return c.Next()
}

func Login(c *fiber.Ctx) error{
  if c.Query("pass") != os.Getenv("PASSWORD") {
    return c.Status(http.StatusUnauthorized).JSON(fiber.Map{
      "error": "Authentication failed", 
    })
  }

  return c.Status(http.StatusOK).JSON(fiber.Map{
    "error": "",
    "token": Token,
  })
}

func Logout(c *fiber.Ctx) error{
  Token = util.CreateToken()
  return c.Status(http.StatusOK).JSON(fiber.Map{
    "error": "",
  })
}

func RemoveService(c *fiber.Ctx) error {
  name := c.Query("name")
  if name == "" {
    util.ErrBadData(c)
  }

  _, err := DB.Exec("DELETE FROM services WHERE name = ?", name)
  if util.ErrorCheck(err, c){
    return util.ErrServer(c)
  }
 
  return util.NoError(c)
}

func AddService(c *fiber.Ctx) error {
  var service Service 
  if c.BodyParser(&service) != nil {
    return util.ErrBadJSON(c)
  }

  if service.Name == "" || service.Desc == "" || service.Url == "" {
    return util.ErrBadData(c)
  }

  rows, err := DB.Query("SELECT * FROM services WHERE name = ?", service.Name)
  if util.ErrorCheck(err, c){
    return util.ErrServer(c)
  }
 
  if rows.Next() {
    rows.Close()
    return util.ErrExists(c)
  }

  rows.Close()

  _, err = DB.Exec(
    "INSERT INTO services(name, desc, url) values(?, ?, ?)",
    service.Name, service.Desc, service.Url,
  )

  if util.ErrorCheck(err, c){
    return util.ErrServer(c)
  }

  return util.NoError(c)
}

func RemovePost(c *fiber.Ctx) error{
  var id = c.Query("id")
  if id == "" {
    return util.ErrBadData(c)
  }

  _, err := DB.Exec("DELETE FROM posts WHERE id = ?", id)
  if util.ErrorCheck(err, c){
    return util.ErrServer(c)
  }

  return util.NoError(c)
}

func AddPost(c *fiber.Ctx) error{
  var post Post
  post.Public = 1

  if c.BodyParser(&post) != nil {
    return util.ErrBadJSON(c)
  }

  if post.Title == "" || post.Author == "" || post.Content == "" {
    return util.ErrBadData(c)
  }

  post.Date = time.Now().Format("02/01/06")
  post.ID = TitleToID(post.Title)

  _, err := DB.Exec(
    "INSERT INTO posts(id, title, author, date, content, public, vote) values(?, ?, ?, ?, ?, ?, ?)",
    post.ID, post.Title, post.Author, post.Date, post.Content, post.Public, post.Vote,
  )

  if err != nil && strings.Contains(err.Error(), sqlite3.ErrConstraintUnique.Error()) {
    return util.ErrExists(c)
  }

  if util.ErrorCheck(err, c){
    return util.ErrExists(c)
  }

  return util.NoError(c)
}