//
//  MessageEvent.swift
//  lichunWebsocket
//
//  Message event model for game notifications
//

import Foundation

// MARK: - Simple Person
// Lightweight person representation for events
struct SimplePerson: Codable, Identifiable {
    let id: String
    let firstname: String
    let lastname: String
    let image: String
}

// MARK: - Event Category
enum EventCategory: String, Codable {
    case career = "💼"
    case social = "❤️"
    case achievement = "🏆"
    case education = "🎓"
    case health = "❤️‍🩹"
    case finance = "💰"
    case random = "🎲"
    case neutral = "ℹ️"
    case negative = "📉"

    static func fromV2Category(_ value: String?) -> EventCategory {
        guard let normalized = value?.trimmingCharacters(in: .whitespacesAndNewlines).lowercased(),
              !normalized.isEmpty else {
            return .neutral
        }

        switch normalized {
        case "career", "adulthood":
            return .career
        case "social", "family", "holidays":
            return .social
        case "achievement":
            return .achievement
        case "education", "adolescence":
            return .education
        case "health":
            return .health
        case "finance":
            return .finance
        case "random", "dilemmas":
            return .random
        case "negative":
            return .negative
        default:
            return .neutral
        }
    }
}

// MARK: - Affinity Change (per-character)
/// A relationship affinity change attributed to a specific named character,
/// shown on the decision-confirmation screen (e.g. "Mom +5 affinity").
struct AffinityChange: Codable, Equatable, Identifiable {
    var personId: String
    var name: String
    var delta: Int

    var id: String { personId }
}

// MARK: - Message Event
struct MessageEvent: Identifiable, Codable {
    var id: String
    var message: String
    var type: String
    var date: String?
    var hour: String?
    var energyCost: Int?
    var diamondCost: Int?
    var moneyCost: Int?
    var affinityChange: Int?
    var title: String?
    var image: String?
    var characters: [SimplePerson]?  // NEW: People involved in event
    var status: String?
    var categoryKey: String?

    // NEW: Claiming state
    var claimed: Bool = false
    var claimedAt: Date?

    // NEW: Event categorization
    var category: EventCategory = .neutral

    // NEW: Decision-result detail (for the choice-confirmation screen).
    // Outcome narrative shown in addition to `message`, the concrete stat
    // deltas (e.g. "Happiness +4"), and per-character affinity changes.
    var outcomeText: String?
    var statDeltas: [String: Int]?
    var affinityChanges: [AffinityChange]?

    // NEW: Computed properties
    var isClaimable: Bool {
        // Has positive rewards?
        (energyCost ?? 0) > 0 ||
        (moneyCost ?? 0) > 0 ||
        (diamondCost ?? 0) > 0 ||
        (affinityChange ?? 0) > 0
    }

    var isNegative: Bool {
        // Has negative costs?
        (energyCost ?? 0) < 0 ||
        (moneyCost ?? 0) < 0 ||
        (diamondCost ?? 0) < 0 ||
        (affinityChange ?? 0) < 0
    }

    init(id: String, message: String, type: String, date: String?, hour: String?, energyCost: Int?, diamondCost: Int?, moneyCost: Int?, affinityChange: Int?, title: String?, image: String?, characters: [SimplePerson]? = nil, claimed: Bool = false, claimedAt: Date? = nil, category: EventCategory = .neutral, status: String? = nil, categoryKey: String? = nil, outcomeText: String? = nil, statDeltas: [String: Int]? = nil, affinityChanges: [AffinityChange]? = nil) {
        self.id = id
        self.message = message
        self.type = type
        self.date = date
        self.hour = hour
        self.energyCost = energyCost
        self.diamondCost = diamondCost
        self.moneyCost = moneyCost
        self.affinityChange = affinityChange
        self.title = title
        self.image = image
        self.characters = characters
        self.claimed = claimed
        self.claimedAt = claimedAt
        self.category = category
        self.status = status
        self.categoryKey = categoryKey
        self.outcomeText = outcomeText
        self.statDeltas = statDeltas
        self.affinityChanges = affinityChanges
    }
}
