package models

import (
	"time"

	"gorm.io/gorm"
)

// KnowledgeBase represents a knowledge base entry (FAQ)
type KnowledgeBase struct {
	ID         uint           `json:"id" gorm:"primaryKey"`
	Question   string         `json:"question" gorm:"not null"`
	Answer     string         `json:"answer" gorm:"not null"`
	Category   string         `json:"category" gorm:"not null"`
	Tags       string         `json:"tags"`                      // Comma-separated tags
	Priority   int            `json:"priority" gorm:"default:1"` // Higher number = higher priority
	ViewCount  int            `json:"viewCount" gorm:"default:0"`
	Helpful    int            `json:"helpful" gorm:"default:0"`    // Number of times marked as helpful
	NotHelpful int            `json:"notHelpful" gorm:"default:0"` // Number of times marked as not helpful
	Active     bool           `json:"active" gorm:"default:true"`
	CreatedBy  uint           `json:"createdBy"`
	UpdatedBy  uint           `json:"updatedBy"`
	CreatedAt  time.Time      `json:"createdAt"`
	UpdatedAt  time.Time      `json:"updatedAt"`
	DeletedAt  gorm.DeletedAt `json:"-" gorm:"index"`

	// Relationships
	Creator User `json:"creator" gorm:"foreignKey:CreatedBy"`
	Updater User `json:"updater" gorm:"foreignKey:UpdatedBy"`
}

// KnowledgeBaseFeedback represents user feedback on a knowledge base entry
type KnowledgeBaseFeedback struct {
	ID              uint      `json:"id" gorm:"primaryKey"`
	KnowledgeBaseID uint      `json:"knowledgeBaseId" gorm:"not null"`
	UserID          uint      `json:"userId" gorm:"not null"`
	Helpful         bool      `json:"helpful"` // true if helpful, false if not helpful
	Comment         string    `json:"comment"`
	CreatedAt       time.Time `json:"createdAt"`

	// Relationships
	KnowledgeBase KnowledgeBase `json:"knowledgeBase" gorm:"foreignKey:KnowledgeBaseID"`
	User          User          `json:"user" gorm:"foreignKey:UserID"`
}


// BeforeCreate is a GORM hook that validates the knowledge base entry before creation
func (k *KnowledgeBase) BeforeCreate(tx *gorm.DB) error {
	if k.Priority < 1 {
		k.Priority = 1
	}
	return nil
}

// BeforeUpdate is a GORM hook that validates the knowledge base entry before update
func (k *KnowledgeBase) BeforeUpdate(tx *gorm.DB) error {
	if k.Priority < 1 {
		k.Priority = 1
	}
	return nil
}

// IncrementViewCount increments the view count of a knowledge base entry
func (k *KnowledgeBase) IncrementViewCount(tx *gorm.DB) error {
	return tx.Model(k).UpdateColumn("view_count", gorm.Expr("view_count + ?", 1)).Error
}

// MarkHelpful marks a knowledge base entry as helpful
func (k *KnowledgeBase) MarkHelpful(tx *gorm.DB) error {
	return tx.Model(k).UpdateColumn("helpful", gorm.Expr("helpful + ?", 1)).Error
}

// MarkNotHelpful marks a knowledge base entry as not helpful
func (k *KnowledgeBase) MarkNotHelpful(tx *gorm.DB) error {
	return tx.Model(k).UpdateColumn("not_helpful", gorm.Expr("not_helpful + ?", 1)).Error
}

// GetHelpfulnessPercentage returns the helpfulness percentage
func (k *KnowledgeBase) GetHelpfulnessPercentage() float64 {
	total := k.Helpful + k.NotHelpful
	if total == 0 {
		return 0
	}
	return float64(k.Helpful) / float64(total) * 100
}
