package services

import (
	"fmt"

	"git.solsynth.dev/hypernet/interactive/pkg/internal/database"
	"git.solsynth.dev/hypernet/interactive/pkg/internal/models"
)

func NewPoll(poll models.Poll) (models.Poll, error) {
	if err := database.C.Create(&poll).Error; err != nil {
		return poll, err
	}
	return poll, nil
}

func UpdatePoll(poll models.Poll) (models.Poll, error) {
	if err := database.C.Save(&poll).Error; err != nil {
		return poll, err
	}
	return poll, nil
}

func AddPollAnswer(poll models.Poll, answer models.PollAnswer) (models.PollAnswer, error) {
	answer.PollID = poll.ID

	var count int64
	if err := database.C.Model(&models.PollAnswer{}).Where("poll_id = ? AND account_id = ?", poll.ID, answer.AccountID).Count(&count).Error; err != nil {
		return answer, fmt.Errorf("you already answered the poll")
	}
	if err := database.C.Create(&answer).Error; err != nil {
		return answer, err
	}

	return answer, nil
}

func GetPollMetric(poll models.Poll) models.PollMetric {
	var answers []models.PollAnswer
	if err := database.C.Where("poll_id = ?", poll.ID).Find(&answers); err != nil {
		return models.PollMetric{}
	}

	byOptions := make(map[string]int64)
	for _, answer := range answers {
		if _, ok := byOptions[answer.Answer]; !ok {
			byOptions[answer.Answer] = 0
		}
		byOptions[answer.Answer]++
	}

	return models.PollMetric{
		TotalAnswer: int64(len(answers)),
		ByOptions:   byOptions,
	}
}