//
//  Poll.swift
//  CoreDataStack
//
//  Created by MainasuK Cirno on 2021-3-2.
//

import Foundation
import CoreData

public final class Poll: NSManagedObject {
    public typealias ID = String
    
    @NSManaged public private(set) var id: ID
    @NSManaged public private(set) var expiresAt: Date?
    @NSManaged public private(set) var expired: Bool
    @NSManaged public private(set) var multiple: Bool
    @NSManaged public private(set) var votesCount: NSNumber
    @NSManaged public private(set) var votersCount: NSNumber?
    
    @NSManaged public private(set) var createdAt: Date
    @NSManaged public private(set) var updatedAt: Date
    
    // one-to-one relationship
    @NSManaged public private(set) var toot: Toot
    
    // one-to-many relationship
    @NSManaged public private(set) var options: Set<PollOption>
}

extension Poll {
    
    public override func awakeFromInsert() {
        super.awakeFromInsert()
        createdAt = Date()
    }
    
    @discardableResult
    public static func insert(
        into context: NSManagedObjectContext,
        property: Property,
        options: [PollOption]
    ) -> Poll {
        let poll: Poll = context.insertObject()
        
        poll.id = property.id
        poll.expiresAt = property.expiresAt
        poll.expired = property.expired
        poll.multiple = property.multiple
        poll.votesCount = property.votesCount
        poll.votersCount = property.votersCount
        
        poll.updatedAt = property.networkDate
        poll.mutableSetValue(forKey: #keyPath(Poll.options)).addObjects(from: options)
        
        return poll
    }
    
}

extension Poll {
    public struct Property {
        public let id: ID
        public let expiresAt: Date?
        public let expired: Bool
        public let multiple: Bool
        public let votesCount: NSNumber
        public let votersCount: NSNumber?
        
        public let networkDate: Date

        public init(
            id: Poll.ID,
            expiresAt: Date?,
            expired: Bool,
            multiple: Bool,
            votesCount: Int,
            votersCount: Int?,
            networkDate: Date
        ) {
            self.id = id
            self.expiresAt = expiresAt
            self.expired = expired
            self.multiple = multiple
            self.votesCount = NSNumber(value: votesCount)
            self.votersCount = votersCount.flatMap { NSNumber(value: $0) }
            self.networkDate = networkDate
        }
    }
}

extension Poll: Managed {
    public static var defaultSortDescriptors: [NSSortDescriptor] {
        return [NSSortDescriptor(keyPath: \Poll.createdAt, ascending: false)]
    }
}