//
//  MPCoreDataHandlerManager.swift
//  MusicPlayer
//
//  Created by Mr.Zhou on 2024/4/1.
//

import Foundation
import CoreData

///CoreData数据库处理器
class MP_CoreDataHandlerManager {
    //单例工具
    static let shared = MP_CoreDataHandlerManager()
    //数据仓库
    lazy var persistentContainer: NSPersistentContainer = {
        //数据仓库名为XXX.cdatamodeld中的XXX
        let container = NSPersistentContainer(name: "relax.offline.mp3")
        container.loadPersistentStores { (_, error) in
            if let error = error {
                //加载数据仓库失败
                fatalError("Failed to load persistent stores: \(error)")
            }else {
                //加载数据仓库成功
                print("Successfully to load persistent stores")
            }
        }
        return container
    }()
    //主线程托管（映射）对象空间
    var context: NSManagedObjectContext {
        return persistentContainer.viewContext
    }
    // 全局后台托管对象空间
    var backgroundContext: NSManagedObjectContext{
        return persistentContainer.newBackgroundContext()
    }
    private init() {
        
        // 在应用启动或合适的地方设置监听
        NotificationCenter.default.addObserver(self,
                                               selector: #selector(mergeChangesFromBackgroundContext),
                                               name: .NSManagedObjectContextDidSave,
                                               object: nil)
    }
    deinit{
        NotificationCenter.default.removeObserver(self)
    }
    //主线程保存对象空间
    func saveContext() {
        //线程安全
        context.perform {
            [weak self] in
            guard let self = self else {return}
            if context.hasChanges {
                do {
                    //保存对象空间
                    try context.save()
                } catch {
                    //保存失败
                    print("数据库更新失败，错误详情:\(error.localizedDescription)")
                }
            }
        }
    }
    ///后台保存对象空间
    func saveContextInBackground() {
        
        backgroundContext.perform {
            [weak self] in
            guard let self = self else { return }
            if backgroundContext.hasChanges {
                do {
                    try backgroundContext.save()
                    // 后台保存成功后发送通知
                    NotificationCenter.default.post(name: .NSManagedObjectContextDidSave, object: backgroundContext)
                } catch {
                    // 记录错误信息，而不是打印
                    let nserror = error as NSError
                    // 这里可以使用日志系统记录错误
                    // 例如：self.logError(nserror)
                    print("后台保存失败: \(nserror), \(nserror.userInfo)")
                }
            }
        }
    }
    @objc func mergeChangesFromBackgroundContext(notification: Notification) {
        DispatchQueue.main.async {
            // 从通知中获取上下文
            guard let backgroundContext = notification.object as? NSManagedObjectContext else {
                return
            }
            // 合并更改
            self.context.perform {
                self.context.mergeChanges(fromContextDidSave: notification)
            }
        }
    }
}
