package main

import (
	"sync"
	"time"
)

type Donation struct {
	Name      string    `json:"name"`
	Amount    int       `json:"amount"`
	Message   string    `json:"message"`
	Timestamp time.Time `json:"timestamp"`
}

type CampaignStats struct {
	TotalDonors     int `json:"totalDonors"`
	TotalAmount     int `json:"totalAmount"`
	ReleasedFish    int `json:"releasedFish"`    // 마리
	CollectedWaste  int `json:"collectedWaste"`  // kg
	PurifiedArea    int `json:"purifiedArea"`    // m²
}

type CampaignService struct {
	mu        sync.Mutex
	donations []Donation
	stats     CampaignStats
}

func NewCampaignService() *CampaignService {
	// 기본 통계치 설정
	return &CampaignService{
		donations: []Donation{
			{Name: "김어부", Amount: 50000, Message: "바다가 다시 풍요로워지길 바랍니다.", Timestamp: time.Now().Add(-10 * time.Minute)},
			{Name: "이바다", Amount: 30000, Message: "깨끗한 바다를 우리 아이들에게!", Timestamp: time.Now().Add(-1 * time.Hour)},
			{Name: "박수협", Amount: 100000, Message: "어업인 여러분 힘내세요!", Timestamp: time.Now().Add(-3 * time.Hour)},
		},
		stats: CampaignStats{
			TotalDonors:     12543,
			TotalAmount:     627150000, // 6억 2천만원
			ReleasedFish:    4200000,   // 420만 마리
			CollectedWaste:  185000,    // 185,000 kg (185톤)
			PurifiedArea:    95000,     // 95,000 m²
		},
	}
}

func (c *CampaignService) GetStats() CampaignStats {
	c.mu.Lock()
	defer c.mu.Unlock()
	return c.stats
}

func (c *CampaignService) GetRecentDonations() []Donation {
	c.mu.Lock()
	defer c.mu.Unlock()
	
	// 최근 10개만 반환
	n := len(c.donations)
	if n > 10 {
		return c.donations[n-10:]
	}
	return c.donations
}

func (c *CampaignService) Donate(name string, amount int, message string) CampaignStats {
	c.mu.Lock()
	defer c.mu.Unlock()

	if name == "" {
		name = "익명의 기부자"
	}

	newDonation := Donation{
		Name:      name,
		Amount:    amount,
		Message:   message,
		Timestamp: time.Now(),
	}
	c.donations = append(c.donations, newDonation)

	// 기부로 인한 통계치 상승 효과 시뮬레이션
	c.stats.TotalDonors += 1
	c.stats.TotalAmount += amount
	
	// 기부금에 비례하여 환경 개선 지표 증가
	// 10,000원 당: 종자 2마리 방류, 0.5kg 쓰레기 수거, 0.2m² 정화
	multiplier := float64(amount) / 10000.0
	c.stats.ReleasedFish += int(multiplier * 2)
	c.stats.CollectedWaste += int(multiplier * 0.5)
	c.stats.PurifiedArea += int(multiplier * 0.2)

	return c.stats
}
