//
//  KMOutlineEditViewController.swift
//  EaseUS PDF Editor
//
//  Created by lxy on 2022/11/9.
//

import Cocoa

class KMOutlineEditViewController: NSViewController {
    @IBOutlet var outlineNameTextView: NSTextView!
    @IBOutlet weak var outlineNameLabel: NSTextField!
    @IBOutlet weak var outlineTargetPageIndexTextField: NSTextField!
    @IBOutlet weak var pageButton: NSButton!
    @IBOutlet weak var totalPageCountLabel: NSTextField!
    @IBOutlet weak var outlineURLTextField: NSTextField!
    @IBOutlet weak var urlButton: NSButton!
    @IBOutlet weak var mailAddressTextField: NSTextField!
    @IBOutlet weak var mailButton: NSButton!
    
    weak var outline : CPDFOutline?
    weak var pdfView : CPDFListView?
    var originalURLString : String = ""
    weak var originalDestination : CPDFDestination?
    var originalPageIndex = -1
    var originalLabel : String = ""
    var currentPageIndex : Int = 0
    
    convenience init(outline: CPDFOutline?, document: CPDFListView?) {
        self.init()
        
        self.outline = outline
        self.pdfView = document
    }
    
    override func loadView() {
        super.loadView()
        
        self.localizedLanguage()
        
        self.setONButton(button: self.pageButton)
        self.enableTextField(textField: self.outlineTargetPageIndexTextField)
        
        self.setDelegateAndFormatter()
        if let action = self.outline?.action {
            self.adjustUIWithAction(action: action)
        }
    }
    
    //MARK: - Private Methods
    
    private func localizedLanguage () {
        self.outlineNameLabel.stringValue = "\(NSLocalizedString("Label", comment: ""))"
        self.pageButton.title = "\(NSLocalizedString("Page", comment: ""))"
        self.urlButton.title = "\(NSLocalizedString("URL:", comment: ""))"
        self.outlineURLTextField.placeholderString = "\(NSLocalizedString("https://www.pdfreaderpro.com", comment: ""))"
        self.mailButton.title = "Email:"
        self.mailAddressTextField.placeholderString = "\(NSLocalizedString("support@easeus.com", comment: ""))"
        self.outlineNameTextView.string = self.outline?.label ?? ""
    }
    
    private func adjustUIWithAction(action:CPDFAction!) {
        guard let doc = self.pdfView?.document else {
            return
        }
        
        if action == nil {
            self.totalPageCountLabel.stringValue = " \(doc.pageCount)"
            self.outlineTargetPageIndexTextField.stringValue = " \(self.currentPageIndex + 1)"
        } else {
            guard let outL  = self.outline else {
                return
            }
            if action.isKind(of: CPDFURLAction.self) {
                var newAction : CPDFURLAction = self.outline?.action as! CPDFURLAction
                var urlString = newAction.url() ?? ""
                self.originalURLString = urlString
                
                if urlString.hasPrefix("mailto:") {
                    self.setONButton(button: self.mailButton)
                    self.enableTextField(textField: self.mailAddressTextField)
                    urlString = String(urlString.suffix(from: "mailto:".endIndex))
                    self.mailAddressTextField.stringValue = urlString
                } else {
                    self.setONButton(button: self.urlButton)
                    self.enableTextField(textField: self.outlineURLTextField)
                    self.outlineURLTextField.stringValue = urlString
                }
                self.currentPageIndex = Int(doc.index(for: doc.page(at: UInt(self.pdfView!.currentPageIndex))))
            } else {
                self.setONButton(button: self.pageButton)
                self.enableTextField(textField: self.outlineTargetPageIndexTextField)
                self.currentPageIndex = Int(doc.index(for: doc.page(at: UInt(outL.destination.pageIndex))))
                self.originalDestination = outL.destination
                self.originalPageIndex = self.originalDestination?.pageIndex ?? -1
            }
            self.originalLabel = outL.label ?? ""
            self.totalPageCountLabel.stringValue = " /\(doc.pageCount)"
            self.outlineTargetPageIndexTextField.stringValue = "\(self.currentPageIndex + 1)"
        }
    }
    
    private func setDelegateAndFormatter () {
        self.outlineTargetPageIndexTextField.delegate = self
        self.outlineNameTextView.delegate = self
        
        var formatter = NumberFormatter()
        formatter.numberStyle = .none
        formatter.maximum = NSNumber(value: self.pdfView?.document?.pageCount ?? 0)
        formatter.minimum = NSNumber(value: 1)
        self.outlineTargetPageIndexTextField.formatter = formatter
    }
    
    private func setONButton(button:NSButton) {
        self.pageButton.state = NSControl.StateValue.off
        self.urlButton.state = NSControl.StateValue.off
        self.mailButton.state = NSControl.StateValue.off
        
        button.state = NSControl.StateValue.on
    }
    
    private func enableTextField(textField:NSTextField) {
        self.outlineTargetPageIndexTextField.isEditable = false
        self.outlineTargetPageIndexTextField.isSelectable = false
        self.outlineURLTextField.isEditable = false
        self.outlineURLTextField.isSelectable = false
        self.mailAddressTextField.isEditable = false
        self.mailAddressTextField.isSelectable = false
        
        self.outlineTargetPageIndexTextField.textColor = KMAppearance.Layout.h0Color()
        self.outlineURLTextField.textColor = KMAppearance.Layout.h0Color()
        self.mailAddressTextField.textColor = KMAppearance.Layout.h0Color()
        
        textField.isEditable = true
        textField.isSelectable = true
        textField.textColor = KMAppearance.Layout.h0Color()
    }
    
    //MARK: Button Action
    @IBAction func buttonClicked_GotoAction(_ sender: Any) {
        self.setONButton(button: self.pageButton)
        self.enableTextField(textField: self.outlineTargetPageIndexTextField)
        
        self.view.window?.makeFirstResponder(self.outlineTargetPageIndexTextField)
    }
    
    @IBAction func buttonClicked_URLAction(_ sender: Any) {
        self.setONButton(button: self.urlButton)
        self.enableTextField(textField: self.outlineURLTextField)
        
        self.view.window?.makeFirstResponder(self.outlineURLTextField)
        if (self.outlineTargetPageIndexTextField.stringValue == "0" || self.outlineTargetPageIndexTextField.stringValue.lengthOfBytes(using: String.Encoding(rawValue: String.Encoding.utf16.rawValue)) < 1){
            self.outlineTargetPageIndexTextField.stringValue = "\(self.currentPageIndex + 1)"
        }
    }
    
    @IBAction func buttonClicked_MailAction(_ sender: Any) {
        self.setONButton(button: self.mailButton)
        self.enableTextField(textField: self.mailAddressTextField)
        
        self.view.window?.makeFirstResponder(self.mailAddressTextField)
        if (self.outlineTargetPageIndexTextField.stringValue == "0" || self.outlineTargetPageIndexTextField.stringValue.lengthOfBytes(using: String.Encoding(rawValue: String.Encoding.utf16.rawValue)) < 1){
            self.outlineTargetPageIndexTextField.stringValue = "\(self.currentPageIndex + 1)"
        }
    }
    
}

extension KMOutlineEditViewController : NSTextFieldDelegate,NSTextViewDelegate {
    func controlTextDidChange(_ obj: Notification) {
        if self.outlineTargetPageIndexTextField.isEqual(obj.object) {
            let number = NSNumber(value: Int(self.outlineTargetPageIndexTextField.stringValue) ?? 0)
            let string = self.outlineTargetPageIndexTextField.formatter?.string(for: number)
            let s = Int(string ?? "")
            if s != 0 {
                self.currentPageIndex = (s ?? 0) - 1
            }
            self.outlineTargetPageIndexTextField.stringValue = string ?? ""
        }
    }
}