package models

import (
	"strings"
	"time"

	"git.kirsle.net/apps/gosocial/pkg/log"
)

// Feedback table for Contact Us & Reporting to admins.
type Feedback struct {
	ID           uint64 `gorm:"primaryKey"`
	UserID       uint64 `gorm:"index"` // if logged-in user posted this
	Acknowledged bool   `gorm:"index"` // admin dashboard "read" status
	Intent       string
	Subject      string
	Message      string
	TableName    string
	TableID      uint64
	ReplyTo      string // logged-out user may leave their email for reply
	CreatedAt    time.Time
	UpdatedAt    time.Time
}

// GetFeedback by ID.
func GetFeedback(id uint64) (*Feedback, error) {
	m := &Feedback{}
	result := DB.First(&m, id)
	return m, result.Error
}

// CountUnreadFeedback gets the count of unacknowledged feedback for admins.
func CountUnreadFeedback() int64 {
	query := DB.Where(
		"acknowledged = ?",
		false,
	)

	var count int64
	result := query.Model(&Feedback{}).Count(&count)
	if result.Error != nil {
		log.Error("models.CountUnreadFeedback: %s", result.Error)
	}
	return count
}

// PaginateFeedback
func PaginateFeedback(acknowledged bool, intent string, pager *Pagination) ([]*Feedback, error) {
	var (
		fb           = []*Feedback{}
		wheres       = []string{}
		placeholders = []interface{}{}
	)

	wheres = append(wheres, "acknowledged = ?")
	placeholders = append(placeholders, acknowledged)

	if intent != "" {
		wheres = append(wheres, "intent = ?")
		placeholders = append(placeholders, intent)
	}

	query := DB.Where(
		strings.Join(wheres, " AND "),
		placeholders...,
	).Order(
		pager.Sort,
	)

	query.Model(&Feedback{}).Count(&pager.Total)

	result := query.Offset(
		pager.GetOffset(),
	).Limit(pager.PerPage).Find(&fb)

	return fb, result.Error
}

// CreateFeedback saves a new Feedback row to the DB.
func CreateFeedback(fb *Feedback) error {
	result := DB.Create(fb)
	return result.Error
}

// Save Feedback.
func (fb *Feedback) Save() error {
	result := DB.Save(fb)
	return result.Error
}
