//
//  RegisteredApplication.swift
//  Pachyderm
//
//  Created by Shadowfacts on 9/9/18.
//  Copyright © 2018 Shadowfacts. All rights reserved.
//

import Foundation

public struct RegisteredApplication: Decodable, Sendable {
    public let id: String
    public let clientID: String
    public let clientSecret: String
    
    public init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        
        // Pixelfed API returns id/client_id as numbers instead of strings
        func decodeStringOrInt(key: CodingKeys) throws -> String {
            if let str = try? container.decode(String.self, forKey: key) {
                return str
            } else if let int = try? container.decode(Int.self, forKey: key) {
                return int.description
            } else {
                throw DecodingError.typeMismatch(String.self, DecodingError.Context(codingPath: container.codingPath + [CodingKeys.id], debugDescription: ""))
            }
        }
        
        self.id = try decodeStringOrInt(key: .id)
        self.clientID = try decodeStringOrInt(key: .clientID)
        self.clientSecret = try container.decode(String.self, forKey: .clientSecret)
    }
    
    private enum CodingKeys: String, CodingKey {
        case id
        case clientID = "client_id"
        case clientSecret = "client_secret"
    }
}
