//
//  History.swift
//  CoreDataStack
//
//  Created by sxiaojian on 2021/2/1.
//

import CoreData
import Foundation

public final class History: NSManagedObject {
    public typealias ID = UUID
    @NSManaged public private(set) var identifier: ID
    @NSManaged public private(set) var createAt: Date

    @NSManaged public private(set) var day: Date
    @NSManaged public private(set) var uses: String
    @NSManaged public private(set) var accounts: String
    
    // many-to-one relationship
    @NSManaged public private(set) var tag: Tag
}

public extension History {
    override func awakeFromInsert() {
        super.awakeFromInsert()
        setPrimitiveValue(UUID(), forKey: #keyPath(History.identifier))
    }

    @discardableResult
    static func insert(
        into context: NSManagedObjectContext,
        property: Property
    ) -> History {
        let history: History = context.insertObject()
        history.day = property.day
        history.uses = property.uses
        history.accounts = property.accounts
        return history
    }
}

public extension History {
    func update(day: Date) {
        if self.day != day {
            self.day = day
        }
    }
    
    func update(uses: String) {
        if self.uses != uses {
            self.uses = uses
        }
    }
    
    func update(accounts: String) {
        if self.accounts != accounts {
            self.accounts = accounts
        }
    }
}

public extension History {
    struct Property {
        public let day: Date
        public let uses: String
        public let accounts: String

        public init(day: Date, uses: String, accounts: String) {
            self.day = day
            self.uses = uses
            self.accounts = accounts
        }
    }
}

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