//
//  KMSplitView.swift
//  PDF Reader Pro
//
//  Created by wanjun on 2023/10/7.
//

import Cocoa

private let CPDFOfficeSplitViewAnimationDidEndNotification = NSNotification.Name(rawValue: "CPDFOfficeSplitViewAnimationDidEndNotification")
let CPDFOfficeDisableAnimationsKey = "CPDFOfficeDisableAnimationsKey"

class KMSplitView: NSSplitView {
    
    static let animationDidEndNotification = CPDFOfficeSplitViewAnimationDidEndNotification

    var animating: Bool = false
    
    override class func defaultAnimation(forKey key: NSAnimatablePropertyKey) -> Any? {
        if key == NSAnimatablePropertyKey("firstSplitPosition") || key == NSAnimatablePropertyKey("secondSplitPosition") {
            return CABasicAnimation()
        } else {
            return super.defaultAnimation(forKey: key)
        }
    }
    
    override var dividerColor: NSColor {
        return NSColor.white
    }
    
    @objc dynamic var firstSplitPosition: CGFloat {
        get {
            if let view = subviews.first, !isSubviewCollapsed(view) {
                if isVertical {
                    return view.frame.maxX
                } else {
                    return view.frame.maxY
                }
            }
            return minPossiblePositionOfDivider(at: 0)
        }
        set {
            self.setPosition(newValue, ofDividerAt: 0)
        }
    }
    
    @objc dynamic var secondSplitPosition: CGFloat {
        get {
            if subviews.count > 1 {
                let view = subviews[1]
                if !isSubviewCollapsed(view) {
                    if isVertical {
                        return view.frame.maxX
                    } else {
                        return view.frame.maxY
                    }
                }
            }
            return minPossiblePositionOfDivider(at: 1)
        }
        set {
            self.setPosition(newValue, ofDividerAt: 1)
        }
    }


    func setPosition(_ position: CGFloat, ofDividerAt dividerIndex: Int, animate: Bool = false) {
        if UserDefaults.standard.bool(forKey: SKDisableAnimationsKey) || dividerIndex > 1 {
            return
        }

        if animating {
            return
        } else if !animate {
            setPosition(position, ofDividerAt: dividerIndex)
        } else {
            animating = true
            NSAnimationContext.runAnimationGroup { context in
                if dividerIndex == 0 {
                    self.animator().firstSplitPosition = position
                } else if dividerIndex == 1 {
                    self.animator().secondSplitPosition = position
                } else {
                    setPosition(position, ofDividerAt: dividerIndex)
                }
            } completionHandler: {
                self.animating = false
                NotificationCenter.default.post(name: CPDFOfficeSplitViewAnimationDidEndNotification , object: self)
            }
        }
    }
}