package api

import (
	"time"

	"git.solsynth.dev/hypernet/interactive/pkg/internal/database"
	"git.solsynth.dev/hypernet/interactive/pkg/internal/http/exts"
	"git.solsynth.dev/hypernet/interactive/pkg/internal/models"
	"git.solsynth.dev/hypernet/interactive/pkg/internal/services"
	"git.solsynth.dev/hypernet/nexus/pkg/nex/sec"
	authm "git.solsynth.dev/hypernet/passport/pkg/authkit/models"
	"github.com/gofiber/fiber/v2"
)

func getMyPollAnswer(c *fiber.Ctx) error {
	if err := sec.EnsureAuthenticated(c); err != nil {
		return err
	}
	user := c.Locals("user").(authm.Account)

	pollId, _ := c.ParamsInt("pollId")

	var answer models.PollAnswer
	if err := database.C.Where("poll_id = ? AND account_id = ?", pollId, user.ID).First(&answer).Error; err != nil {
		return fiber.NewError(fiber.StatusNotFound, err.Error())
	}

	return c.JSON(answer)
}

func answerPoll(c *fiber.Ctx) error {
	pollId, _ := c.ParamsInt("pollId")

	if err := sec.EnsureAuthenticated(c); err != nil {
		return err
	}
	user := c.Locals("user").(authm.Account)

	var data struct {
		Answer string `json:"answer" validate:"required"`
	}

	if err := exts.BindAndValidate(c, &data); err != nil {
		return err
	}

	var poll models.Poll
	if err := database.C.Where("id = ?", pollId).First(&poll).Error; err != nil {
		return fiber.NewError(fiber.StatusBadRequest, err.Error())
	}

	if poll.ExpiredAt != nil && time.Now().Unix() >= poll.ExpiredAt.Unix() {
		return fiber.NewError(fiber.StatusBadRequest, "poll has been ended")
	}

	doesContains := false
	for _, option := range poll.Options {
		if option.ID == data.Answer {
			doesContains = true
			break
		}
	}
	if !doesContains {
		return fiber.NewError(fiber.StatusBadRequest, "poll does not have a option like that")
	}

	answer := models.PollAnswer{
		Answer:    data.Answer,
		PollID:    poll.ID,
		AccountID: user.ID,
	}

	if answer, err := services.AddPollAnswer(poll, answer); err != nil {
		return fiber.NewError(fiber.StatusBadRequest, err.Error())
	} else {
		return c.JSON(answer)
	}
}