//
//  KMRightSideController.swift
//  PDF Reader Pro
//
//  Created by Niehaoyu on 2024/11/12.
//

import Cocoa
import KMComponentLibrary

@objc protocol KMRightSideControllerDelegate: AnyObject {
    
    @objc optional func kmRightSideControllerDidContendVCUpdated(_ controller: KMRightSideController)
    
}

class KMRightSideController: NSViewController {
    
    @IBOutlet var contendView: NSView!
    @IBOutlet var contendLeftDivider: ComponentDivider!
    
    @IBOutlet var headerBGView: NSView!
    @IBOutlet var titleLabel: NSTextField!
    @IBOutlet var headerRightButton: ComponentButton!
    
    @IBOutlet var infoContendView: NSView!
    
    @IBOutlet var emptyView: ComponentEmpty!
    
    var pdfView: CPDFListView?
    var viewManager: KMPDFViewManager?
    
    //Controller
    //Markup
    var highlight_Controller: KMHighlightController?
    
    var note_Controller: KMNoteController?
    var pen_Controller: KMPenController?
    var eraser_Controller: KMEraserController?
    var rectangle_Controller: KMRectangleController?
    var line_Controller: KMLineController?
    var freeText_Controller: KMTextBoxController?
    
    //Edit
    var edit_textController: KMEditPDFTextPropertyViewController?
    var edit_imageController: KMEditImageController?
    var edit_linkController: KMLinkViewController?
    var edit_cropController: KMCropPropertyController?
    
    //Form
    
    //Fill
    
    //
    
    var contentViewController: NSViewController?
    
    weak open var delegate: KMRightSideControllerDelegate?
    
    //MARK: - func
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do view setup here.
        
        setupUI()
        
        setupContentController()
    }
    
    //MARK: - Get
    
    func getValidAnnotations() -> [CPDFAnnotation] {
        
        
        return []
    }
    
    //MARK: - Set
    func setupUI() {
        contendView.wantsLayer = true
        contendView.layer?.backgroundColor = ComponentLibrary.shared.getComponentColorFromKey("colorBg/layout-middle").cgColor
        
        contendLeftDivider.properties = ComponentDividerProperty(type: .vertical)
        
        titleLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("colorText/2")
        titleLabel.font = ComponentLibrary.shared.getFontFromKey("mac/body-m-bold")
        
        emptyView.properties = ComponentEmptyProperty(emptyType: .noWatermark, text: KMLocalizedString("No identical attributes"), subText: "")
    }
    
    func setEmptyView(isHidden hidden: Bool) {
        //        if hidden {
        infoContendView.isHidden = false
        headerBGView.isHidden = false
        
        emptyView.isHidden = true
        //        } else {
        //            headerBGView.isHidden = true
        //            infoContendView.isHidden = true
        //
        //            emptyView.isHidden = false
        //        }
    }
    
    func updateTitleLabel() {
        let subToolMode = viewManager?.subToolMode ?? .None
        
        let annotations: [CPDFAnnotation] = self.pdfView?.activeAnnotations as? [CPDFAnnotation] ?? []
        var firstAnnotation: CPDFAnnotation?
        if let firstObject = annotations.first {
            firstAnnotation = firstObject
        }
        
        if annotations.count == 1 {
            
        }
        titleLabel.stringValue = ""
        
        if contentViewController is KMHighlightController {
            titleLabel.stringValue = KMLocalizedString("Highlight")
            if let annotation = firstAnnotation, annotation is CPDFMarkupAnnotation {
                let markupAnnotation = firstAnnotation as! CPDFMarkupAnnotation
                if markupAnnotation.markupType() == .underline {
                    titleLabel.stringValue = KMLocalizedString("Underline")
                } else if markupAnnotation.markupType() == .squiggly {
                    titleLabel.stringValue = KMLocalizedString("Wavyline")
                } else if markupAnnotation.markupType() == .strikeOut {
                    titleLabel.stringValue = KMLocalizedString("Strikethrough")
                }
            } else {
                if viewManager?.subToolMode == .Underline {
                    titleLabel.stringValue = KMLocalizedString("Underline")
                } else if viewManager?.subToolMode == .Waveline {
                    titleLabel.stringValue = KMLocalizedString("Wavyline")
                } else if viewManager?.subToolMode == .Strikethrough {
                    titleLabel.stringValue = KMLocalizedString("Strikethrough")
                }
            }
        } else if (contentViewController is KMNoteController) {
            titleLabel.stringValue = KMLocalizedString("Note")
        } else if (contentViewController is KMPenController) {
            titleLabel.stringValue = KMLocalizedString("Pen")
        } else if (contentViewController is KMEraserController) {
            titleLabel.stringValue = KMLocalizedString("Eraser")
        } else if (contentViewController is KMLineController) {
            if let annotation = firstAnnotation, annotation is CPDFLineAnnotation {
                let lineAnnotation = firstAnnotation as! CPDFLineAnnotation
                if lineAnnotation.type == "Line" {
                    titleLabel.stringValue = KMLocalizedString("Line")
                } else if lineAnnotation.type == "Arrow" {
                    titleLabel.stringValue = KMLocalizedString("Arrow")
                }
            } else if subToolMode == .Arrow {
                titleLabel.stringValue = KMLocalizedString("Arrow")
            } else if subToolMode == .Line {
                titleLabel.stringValue = KMLocalizedString("Line")
            }
        } else if (contentViewController is KMRectangleController) {
            if let annotation = firstAnnotation, annotation is CPDFSquareAnnotation {
                titleLabel.stringValue = KMLocalizedString("Rectangle")
            } else if let annotation = firstAnnotation, annotation is CPDFCircleAnnotation {
                titleLabel.stringValue = KMLocalizedString("Circle")
            } else if subToolMode == .Rectangle {
                titleLabel.stringValue = KMLocalizedString("Rectangle")
            } else if subToolMode == .Circle {
                titleLabel.stringValue = KMLocalizedString("Circle")
            }
        } else if (contentViewController is KMTextBoxController) {
            titleLabel.stringValue = KMLocalizedString("Text Box")
        } else if (contentViewController is KMEditPDFTextPropertyViewController) {
            titleLabel.stringValue = KMLocalizedString("Text")
        } else if (contentViewController is KMEditImageController) {
            titleLabel.stringValue = KMLocalizedString("Image")
        } else if (contentViewController is KMLinkViewController) {
            titleLabel.stringValue = KMLocalizedString("Link")
        } else if (contentViewController is KMCropPropertyController) {
            titleLabel.stringValue = KMLocalizedString("Crop")
        }
        
    }
    
    func setupContentController() {
        /**
         Case1:选中指定模式:显示指定模式的属性设置界面,例如橡皮擦。
         Case2:未选中模式:根据选中的注释显示指定属性设置界面
         
         1、筛选出指定模式下对应的右边界面,进行显示。
         2、再判断是否有选中注释,多选不同类型注释时,判断为未选中注释。
         3、判断选中指定类型的注释,或者选中的模式,都展示对应的界面。
         
         */
        
        /**
         只在指定模式下可以选中特定注释:
         编辑模式下:可以选中编辑块跟Link注释
         Form模式下:可以选中Form注释
         */
        
        contentViewController?.view.removeFromSuperview()
        contentViewController = nil
        
        setEmptyView(isHidden: true)
        
        let toolMode = viewManager?.toolMode ?? .None
        let subToolMode = viewManager?.subToolMode ?? .None
        
        let annotations: [CPDFAnnotation] = self.pdfView?.activeAnnotations as? [CPDFAnnotation] ?? []
        
        if toolMode == .Edit {
            //MARK: -Edit编辑
            setEmptyView(isHidden: true)
            if subToolMode != .None {
                if subToolMode == .Edit_text {
                    if pdfView?.km_editingImageAreas().isEmpty == true && pdfView?.km_editingTextAreas().isEmpty == false {
                        //编辑文字
                        if edit_textController == nil {
                            edit_textController = KMEditPDFTextPropertyViewController.init()
                        }
                        edit_textController?.pdfView = self.pdfView
                        
                        contentViewController = edit_textController
                        
                    }
                } else if subToolMode == .Edit_Image {
                    
                } else if subToolMode == .Edit_Link {
                    //链接
                    if edit_linkController == nil {
                        edit_linkController = KMLinkViewController.init()
                    }
                    edit_linkController?.pdfView = self.pdfView
                    contentViewController = edit_linkController
                } else if subToolMode == .Edit_Crop {
                    if edit_cropController == nil {
                        edit_cropController = KMCropPropertyController.init()
                    }
                    contentViewController = edit_cropController
                }
            } else {
                if pdfView?.km_EditingAreas().isEmpty == true {
                    //未选中文字跟图片
                    setEmptyView(isHidden: false)
                    
                } else if pdfView?.km_editingImageAreas().isEmpty == true && pdfView?.km_editingTextAreas().isEmpty == false {
                    //编辑文字
                    if edit_textController == nil {
                        edit_textController = KMEditPDFTextPropertyViewController.init()
                    }
                    edit_textController?.pdfView = self.pdfView
                    
                    contentViewController = edit_textController
                    
                } else if pdfView?.km_editingImageAreas().isEmpty == false && pdfView?.km_editingTextAreas().isEmpty == true {
                    //编辑图片
                    if edit_imageController == nil {
                        edit_imageController = KMEditImageController.init()
                    }
                    contentViewController = edit_imageController
                    
                } else if pdfView?.km_editingImageAreas().isEmpty == false && pdfView?.km_editingTextAreas().isEmpty == false {
                    //混选
                    setEmptyView(isHidden: false)
                }
            }
            
        } else if toolMode == .Form {
            
        } else {
            let exitMulitAnnotation = pdfView?.isMultiAnnotation(annotations)
            if exitMulitAnnotation == true {
                setEmptyView(isHidden: false)
                
                return
            }
            
            var firstAnnotation: CPDFAnnotation?
            if annotations.count > 0 {
                firstAnnotation = annotations.first
            }
            
            if firstAnnotation is CPDFMarkupAnnotation || subToolMode == .Highlight || subToolMode == .Underline || subToolMode == .Waveline || subToolMode == .Strikethrough {
                if highlight_Controller == nil {
                    highlight_Controller = KMHighlightController.init()
                }
                highlight_Controller?.pdfView = self.pdfView
                
                contentViewController = highlight_Controller
            } else if firstAnnotation is CPDFFreeTextAnnotation || subToolMode == .Text {
                if freeText_Controller == nil {
                    freeText_Controller = KMTextBoxController.init()
                }
                freeText_Controller?.pdfView = self.pdfView
                
                contentViewController = freeText_Controller
            } else if firstAnnotation is CPDFTextAnnotation || subToolMode == .Note {
                if note_Controller == nil {
                    note_Controller = KMNoteController.init()
                }
                note_Controller?.pdfView = self.pdfView
                
                contentViewController = note_Controller
            } else if firstAnnotation is CPDFInkAnnotation || subToolMode == .Pen {
                if pen_Controller == nil {
                    pen_Controller = KMPenController.init()
                }
                pen_Controller?.pdfView = self.pdfView
                
                contentViewController = pen_Controller
            } else if subToolMode == .Eraser {
                if eraser_Controller == nil {
                    eraser_Controller = KMEraserController.init()
                }
                contentViewController = eraser_Controller
                
            } else if firstAnnotation is CPDFCircleAnnotation || firstAnnotation is CPDFSquareAnnotation || subToolMode == .Rectangle || subToolMode == .Circle {
                if rectangle_Controller == nil {
                    rectangle_Controller = KMRectangleController.init()
                }
                rectangle_Controller?.pdfView = self.pdfView
                
                contentViewController = rectangle_Controller
            } else if firstAnnotation is CPDFLineAnnotation || subToolMode == .Line || subToolMode == .Arrow {
                if line_Controller == nil {
                    line_Controller = KMLineController.init()
                }
                line_Controller?.pdfView = self.pdfView
                
                contentViewController = line_Controller
            } else {
                
            }
            
        }
        
        
        
        if let contendVC = contentViewController {
            contendVC.view.frame = infoContendView.bounds
            contendVC.view.autoresizingMask = [.width, .height]
            infoContendView.addSubview(contendVC.view)
            
            delegate?.kmRightSideControllerDidContendVCUpdated?(self)
        }
        
        updateTitleLabel()
        
        
        
        
    }
    
    func reloadData() {
        let toolMode = viewManager?.toolMode ?? .None
        
        let subToolMode = viewManager?.subToolMode ?? .None
        
        let annotations: [CPDFAnnotation] = self.pdfView?.activeAnnotations as? [CPDFAnnotation] ?? []
        
        if (contentViewController is KMHighlightController) {
            (contentViewController as? KMHighlightController)?.viewManager = viewManager
            (contentViewController as? KMHighlightController)?.reloadData()
            
        } else if (contentViewController is KMNoteController) {
            (contentViewController as? KMNoteController)?.reloadData()
            
        } else if (contentViewController is KMPenController) {
            (contentViewController as? KMPenController)?.reloadData()
            
        } else if (contentViewController is KMEraserController) {
            (contentViewController as? KMEraserController)?.reloadData()
            
        } else if (contentViewController is KMLineController) {
            (contentViewController as? KMLineController)?.reloadData()
            
        } else if (contentViewController is KMRectangleController) {
            (contentViewController as? KMRectangleController)?.viewManager = viewManager
            (contentViewController as? KMRectangleController)?.reloadData()
            
        } else if (contentViewController is KMTextBoxController) {
            (contentViewController as? KMTextBoxController)?.reloadData()
            
        }
        
        if toolMode == .Markup {
            if (subToolMode == .Highlight ||
                subToolMode == .Underline ||
                subToolMode == .Waveline ||
                subToolMode == .Strikethrough) && (contentViewController is KMHighlightController) {
                (contentViewController as? KMHighlightController)?.reloadData()
            }
        } else if toolMode == .Edit {
            //图片&文字
            if pdfView?.km_EditingAreas().isEmpty == true {
                
            } else if pdfView?.km_editingImageAreas().isEmpty == true && pdfView?.km_editingTextAreas().isEmpty == false {
                //编辑文字
                edit_textController?.pdfView = self.pdfView
                edit_textController?.reloadData()
            } else if pdfView?.km_editingImageAreas().isEmpty == false && pdfView?.km_editingTextAreas().isEmpty == true {
                //编辑图片
                edit_imageController?.pdfView = self.pdfView
                edit_imageController?.reloadData()
                
            } else {
                //多选
            }
            
            //Link
            if viewManager?.subToolMode == .Edit_Link && (contentViewController is KMLinkViewController) {
                if (contentViewController as! KMLinkViewController).pdfView != self.pdfView {
                    (contentViewController as! KMLinkViewController).pdfView = self.pdfView
                }
                var linkAnnotations: [CPDFLinkAnnotation] = []
                for annotation in annotations {
                    if annotation is CPDFLinkAnnotation {
                        linkAnnotations.append((annotation as! CPDFLinkAnnotation))
                    }
                }
                (contentViewController as! KMLinkViewController).annotations = linkAnnotations
                (contentViewController as! KMLinkViewController).reloadData()
            } else if viewManager?.subToolMode == .Edit_Crop && (contentViewController is KMCropPropertyController) {
                (contentViewController as! KMCropPropertyController).reloadData()
            }
            
        }
        
        
        
    }
    
    public func reloadDataWithPDFView(pdfView: CPDFListView) {
        self.pdfView = pdfView
        
        setupContentController()
        
        reloadData()
        
    }
    
    //MARK: - 重新刷新编辑中内容
    public func reloadEditingAreas() {
        if contentViewController is KMEditPDFTextPropertyViewController {
            (contentViewController as! KMEditPDFTextPropertyViewController).reloadData()
        } else if contentViewController is KMEditImageController {
            (contentViewController as! KMEditImageController).reloadData()
        }
    }
    
    //MARK: - 裁剪模式下刷新文档
    public func reloadCropDocument(_ pdfview: CPDFListView?) {
        if viewManager?.subToolMode == .Edit_Crop && (contentViewController is KMCropPropertyController) {
            (contentViewController as! KMCropPropertyController).pdfView = pdfview
            (contentViewController as! KMCropPropertyController).reloadData()
        }
    }
    
}