import Foundation

struct MonthlySummary {
    let periodLabel: String
    let startDate: Date
    let endDate: Date
    let startingValue: Decimal
    let endingValue: Decimal
    let contributions: Decimal
    let netPerformance: Decimal

    var netPerformancePercentage: Double {
        let base = startingValue + contributions
        guard base > 0 else { return 0 }
        return NSDecimalNumber(decimal: netPerformance / base).doubleValue * 100
    }

    var formattedMonthYear: String {
        let formatter = DateFormatter()
        formatter.dateFormat = "MMMM yyyy"
        return formatter.string(from: startDate)
    }

    var formattedStartingValue: String {
        CurrencyFormatter.format(startingValue, style: .currency, maximumFractionDigits: 0)
    }

    var formattedEndingValue: String {
        CurrencyFormatter.format(endingValue, style: .currency, maximumFractionDigits: 0)
    }

    var formattedContributions: String {
        CurrencyFormatter.format(contributions, style: .currency, maximumFractionDigits: 0)
    }

    var formattedNetPerformance: String {
        let prefix = netPerformance >= 0 ? "+" : ""
        let value = CurrencyFormatter.format(netPerformance, style: .currency, maximumFractionDigits: 0)
        return prefix + value
    }

    var formattedNetPerformancePercentage: String {
        let prefix = netPerformance >= 0 ? "+" : ""
        return String(format: "\(prefix)%.2f%%", netPerformancePercentage)
    }

    static var empty: MonthlySummary {
        MonthlySummary(
            periodLabel: "This Month",
            startDate: Date(),
            endDate: Date(),
            startingValue: 0,
            endingValue: 0,
            contributions: 0,
            netPerformance: 0
        )
    }
}

struct PortfolioChange {
    let absolute: Decimal
    let percentage: Double
    let label: String

    var formattedAbsolute: String {
        let prefix = absolute >= 0 ? "+" : ""
        let value = CurrencyFormatter.format(absolute, style: .currency, maximumFractionDigits: 0)
        return prefix + value
    }

    var formattedPercentage: String {
        let prefix = absolute >= 0 ? "+" : ""
        return String(format: "\(prefix)%.2f%%", percentage)
    }

    static var empty: PortfolioChange {
        PortfolioChange(absolute: 0, percentage: 0, label: "since last update")
    }
}
