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

import Foundation

public struct Notification: Decodable, Sendable {
    public let id: String
    public let kind: Kind
    public let createdAt: Date
    public let account: Account
    public let status: Status?
    
    public init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        
        self.id = try container.decode(String.self, forKey: .id)
        if let kind = try? container.decode(Kind.self, forKey: .kind) {
            self.kind = kind
        } else {
            self.kind = .unknown
        }
        self.createdAt = try container.decode(Date.self, forKey: .createdAt)
        self.account = try container.decode(Account.self, forKey: .account)
        self.status = try container.decodeIfPresent(Status.self, forKey: .status)
    }

    public static func dismiss(id notificationID: String) -> Request<Empty> {
        return Request<Empty>(method: .post, path: "/api/v1/notifications/\(notificationID)/dismiss")
    }
    
    private enum CodingKeys: String, CodingKey {
        case id
        case kind = "type"
        case createdAt = "created_at"
        case account
        case status
    }
}

extension Notification {
    public enum Kind: String, Decodable, CaseIterable, Sendable {
        case mention
        case reblog
        case favourite
        case follow
        case followRequest = "follow_request"
        case poll
        case update
        case status
        case unknown
    }
}

extension Notification: Identifiable {}
