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

import Foundation

public struct Relationship: RelationshipProtocol, Decodable, Sendable {
    public let accountID: String
    public let following: Bool
    public let followedBy: Bool
    public let blocking: Bool
    public let muting: Bool
    public let mutingNotifications: Bool
    public let followRequested: Bool
    public let domainBlocking: Bool
    public let showingReblogs: Bool
    public let endorsed: Bool
    
    public init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        self.accountID = try container.decode(String.self, forKey: .id)
        self.following = try container.decode(Bool.self, forKey: .following)
        self.followedBy = try container.decode(Bool.self, forKey: .followedBy)
        self.blocking = try container.decode(Bool.self, forKey: .blocking)
        self.muting = try container.decode(Bool.self, forKey: .muting)
        self.mutingNotifications = try container.decode(Bool.self, forKey: .mutingNotifications)
        self.followRequested = try container.decode(Bool.self, forKey: .followRequested)
        self.domainBlocking = try container.decode(Bool.self, forKey: .domainBlocking)
        self.showingReblogs = try container.decode(Bool.self, forKey: .showingReblogs)
        self.endorsed = try container.decodeIfPresent(Bool.self, forKey: .endorsed) ?? false
    }
    
    private enum CodingKeys: String, CodingKey {
        case id
        case following
        case followedBy = "followed_by"
        case blocking
        case muting
        case mutingNotifications = "muting_notifications"
        case followRequested = "requested"
        case domainBlocking = "domain_blocking"
        case showingReblogs = "showing_reblogs"
        case endorsed
    }
}
