//
//  History.swift
//  Pachyderm
//
//  Created by Shadowfacts on 4/2/22.
//  Copyright © 2022 Shadowfacts. All rights reserved.
//

import Foundation

public struct History: Codable, Sendable {
    public let day: Date
    public let uses: Int
    public let accounts: Int
    
    public init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        
        if let day = try? container.decode(Date.self, forKey: .day) {
            self.day = day
        } else if let unixTimestamp = try? container.decode(Double.self, forKey: .day) {
            self.day = Date(timeIntervalSince1970: unixTimestamp)
        } else if let str = try? container.decode(String.self, forKey: .day),
            let unixTimestamp = Double(str) {
            self.day = Date(timeIntervalSince1970: unixTimestamp)
        } else {
            throw DecodingError.dataCorruptedError(forKey: .day, in: container, debugDescription: "day must be either date or UNIX timestamp")
        }
        
        if let uses = try? container.decode(Int.self, forKey: .uses) {
            self.uses = uses
        } else if let str = try? container.decode(String.self, forKey: .uses),
            let uses = Int(str) {
            self.uses = uses
        } else {
            throw DecodingError.dataCorruptedError(forKey: .uses, in: container, debugDescription: "uses must either be int or string containing int")
        }
        
        if let accounts = try? container.decode(Int.self, forKey: .accounts) {
            self.accounts = accounts
        } else if let str = try? container.decode(String.self, forKey: .accounts),
            let accounts = Int(str) {
            self.accounts = accounts
        } else {
            throw DecodingError.dataCorruptedError(forKey: .accounts, in: container, debugDescription: "accounts must either be int or string containing int")
        }
    }

    private enum CodingKeys: String, CodingKey {
        case day
        case uses
        case accounts
    }
}
