//
//  StoreItem.swift
//  lichunWebsocket
//
//  Store and in-app purchase item models
//

import Foundation

// MARK: - Store Item
struct StoreItem: Identifiable, Decodable, Hashable {
    var id: String
    var name: String
    var price: Int
    var description: String
    var prestigeBoost: Int
    var image: String?
    /// Minimum character prestige required to purchase. 0 = open to all.
    /// (Wave 2: surfaces prestige-gated items as locked with their threshold.)
    var minPrestige: Int
    /// True for items gated behind a prestige requirement (server `exclusive`).
    var exclusive: Bool

    enum CodingKeys: String, CodingKey {
        case id
        case name
        case price
        case description
        case prestigeBoost
        case image
        case minPrestige
        case exclusive
    }

    init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)

        id = try values.decode(String.self, forKey: .id)
        name = try values.decode(String.self, forKey: .name)
        price = try values.decode(Int.self, forKey: .price)
        description = try values.decode(String.self, forKey: .description)
        prestigeBoost = try values.decode(Int.self, forKey: .prestigeBoost)
        image = try values.decodeIfPresent(String.self, forKey: .image)
        minPrestige = (try? values.decodeIfPresent(Int.self, forKey: .minPrestige)) ?? 0
        exclusive = (try? values.decodeIfPresent(Bool.self, forKey: .exclusive)) ?? false
    }
}

// MARK: - In-App Purchase Item
struct InAppPurchaseItem: Identifiable, Decodable, Hashable {
    var id: String
    var name: String
    var price: Double
    var description: String
    var diamonds: Int
    var image: String

    enum CodingKeys: String, CodingKey {
        case id
        case name
        case price
        case description
        case diamonds
        case image
    }

    init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)

        id = try values.decode(String.self, forKey: .id)
        name = try values.decode(String.self, forKey: .name)
        price = try values.decode(Double.self, forKey: .price)
        description = try values.decode(String.self, forKey: .description)
        diamonds = try values.decode(Int.self, forKey: .diamonds)
        image = try values.decode(String.self, forKey: .image)
    }
}
