import Cache
import Foundation
import Logging
import SwiftyJSON

struct BaseCacheModel {
    static var shared = Self()

    static let jsonToDataTransformer: (JSON) -> Data = { try! $0.rawData() }
    static let jsonFromDataTransformer: (Data) -> JSON = { try! JSON(data: $0) }
    static let jsonTransformer = Transformer(toData: jsonToDataTransformer, fromData: jsonFromDataTransformer)

    static let imageCache = URLCache(memoryCapacity: 512 * 1000 * 1000, diskCapacity: 10 * 1000 * 1000 * 1000)

    var models: [CacheModel] {
        [
            FeedCacheModel.shared,
            VideosCacheModel.shared,
            ChannelsCacheModel.shared,
            PlaylistsCacheModel.shared,
            ChannelPlaylistsCacheModel.shared,
            SubscribedChannelsModel.shared
        ]
    }

    func clear() {
        models.forEach { $0.clear() }

        Self.imageCache.removeAllCachedResponses()
    }

    var totalSize: Int {
        models.compactMap { $0.storage?.totalDiskStorageSize }.reduce(0, +) + Self.imageCache.currentDiskUsage
    }

    var totalSizeFormatted: String {
        byteCountFormatter.string(fromByteCount: Int64(totalSize))
    }

    private var byteCountFormatter: ByteCountFormatter { .init() }
}