package model

import "gorm.io/gorm"

type Campaign struct {
	gorm.Model
	Name               string     `gorm:"notNull;size:30"`
	OrganizerName      string     `gorm:"notNull"`
	TargetAmount       float64    `gorm:"notNull;check:target_amount >= 10.0"`
	DonationMinimum    float64    `gorm:"notNull;check:donation_minimum >= 1.0"`
	Donations          []Donation `gorm:"foreignKey:CampaignID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE"`
	AmountDonatedSoFar float64    `gorm:"-"`
	Account            Account    `gorm:"embedded;embeddedPrefix:account_"`
}

func (c *Campaign) AfterFind(tx *gorm.DB) (err error) {
	var sum float64
	result := tx.Model(&Donation{}).Select("ifnull(sum(amount),0)").Where("campaign_id = ?", c.ID).Scan(&sum)
	if result.Error != nil {
		return result.Error
	}
	c.AmountDonatedSoFar = sum
	return nil
}