//
//  PayPageConfigCache.swift
//  suixinkan
//

import Foundation

/// 收款页品牌配置缓存协议，供 ViewModel 注入持久化实现或测试替身。
protocol PayPageConfigCaching {
    /// 读取指定景区的品牌配置。
    func config(scenicId: Int) -> PayPageConfig?

    /// 保存指定景区的完整品牌配置。
    func save(_ config: PayPageConfig, scenicId: Int)
}

/// 使用 UserDefaults 按接口环境与景区隔离的收款页品牌配置缓存。
final class PayPageConfigCache: PayPageConfigCaching {
    private static let version = "v1"

    private let defaults: UserDefaults
    private let environmentNamespace: String
    private let encoder = JSONEncoder()
    private let decoder = JSONDecoder()

    /// 使用指定持久化容器和 API 环境创建缓存。
    init(
        defaults: UserDefaults = .standard,
        environment: APIEnvironment = .current
    ) {
        self.defaults = defaults
        environmentNamespace = environment.baseURL.host ?? environment.baseURL.absoluteString
    }

    func config(scenicId: Int) -> PayPageConfig? {
        guard scenicId > 0,
              let data = defaults.data(forKey: key(scenicId: scenicId)) else {
            return nil
        }
        return try? decoder.decode(PayPageConfig.self, from: data)
    }

    func save(_ config: PayPageConfig, scenicId: Int) {
        guard scenicId > 0, let data = try? encoder.encode(config) else { return }
        defaults.set(data, forKey: key(scenicId: scenicId))
    }

    private func key(scenicId: Int) -> String {
        "payment.pay_page_config.\(Self.version).\(environmentNamespace).\(scenicId)"
    }
}
