//
//  KMEditPDFModel.swift
//  PDF Reader Pro
//
//  Created by tangchao on 2024/6/25.
//

import Cocoa

class KMEditPDFModel: NSObject {
//
//    var cFont: CPDFFont?
    var editingAreas: [CPDFEditArea]?
    
    var textAreas: [CPDFEditTextArea]? {
        get {
            guard let areas = self.editingAreas else {
                return nil
            }
            var datas: [CPDFEditTextArea] = []
            for area in areas {
                if let data = area as? CPDFEditTextArea {
                    datas.append(data)
                    continue
                }
            }
            return datas
        }
    }
    
    var imageAreas: [CPDFEditImageArea]? {
        get {
            guard let areas = self.editingAreas else {
                return nil
            }
            var datas: [CPDFEditImageArea] = []
            for area in areas {
                if let data = area as? CPDFEditImageArea {
                    datas.append(data)
                    continue
                }
            }
            return datas
        }
    }
    
    var fontColors: [NSColor] = []
    var fontNames: [String] = []
    var fontSizes: [CGFloat] = []
    var fontBolds: [Bool] = []
    var fontItalics: [Bool] = []
    var textAlignments: [NSTextAlignment] = []
    var boundsArray: [NSRect] = []
    var rotates: [CGFloat] = []
    var opacitys: [CGFloat] = []
    
    func editAreasFontColorIsEqual() -> Bool {
        let datas = self.fontColors
        if datas.isEmpty {
            return false
        }
        if datas.count == 1 {
            return true
        }
        let color = datas.first
        for (i, d) in datas.enumerated() {
            if i == 0 {
                continue
            }
            if d != color {
                return false
            }
        }
        return true
    }
    
    func editAreasFontNameIsEqual() -> Bool {
        let datas = self.fontNames
        if datas.isEmpty {
            return false
        }
        if datas.count == 1 {
            return true
        }
        let data = datas.first
        for (i, d) in datas.enumerated() {
            if i == 0 {
                continue
            }
            if d != data {
                return false
            }
        }
        return true
    }
    
    func editAreasFontSizeIsEqual() -> Bool {
        let datas = self.fontSizes
        if datas.isEmpty {
            return false
        }
        if datas.count == 1 {
            return true
        }
        let data = datas.first
        for (i, d) in datas.enumerated() {
            if i == 0 {
                continue
            }
            if d != data {
                return false
            }
        }
        return true
    }
    
    func editAreasFontBoldIsEqual() -> Bool {
        let datas = self.fontBolds
        if datas.isEmpty {
            return false
        }
        if datas.count == 1 {
            return true
        }
        let data = datas.first
        for (i, d) in datas.enumerated() {
            if i == 0 {
                continue
            }
            if d != data {
                return false
            }
        }
        return true
    }
    
    func editAreasFontItalicIsEqual() -> Bool {
        let datas = self.fontItalics
        if datas.isEmpty {
            return false
        }
        if datas.count == 1 {
            return true
        }
        let data = datas.first
        for (i, d) in datas.enumerated() {
            if i == 0 {
                continue
            }
            if d != data {
                return false
            }
        }
        return true
    }
    
    func editAreasTextAlignmentIsEqual() -> Bool {
        let datas = self.textAlignments
        if datas.isEmpty {
            return false
        }
        if datas.count == 1 {
            return true
        }
        let data = datas.first?.rawValue ?? 0
        for (i, d) in datas.enumerated() {
            if i == 0 {
                continue
            }
            if d.rawValue != data {
                return false
            }
        }
        return true
    }
    
    func editAreasBoundsIsEqualForWidth() -> Bool {
        let datas = self.boundsArray
        if datas.isEmpty {
            return false
        }
        if datas.count == 1 {
            return true
        }
        let width = datas.first?.width ?? 0
        for (i, rect) in datas.enumerated() {
            if i == 0 {
                continue
            }
            if width != rect.size.width {
                return false
            }
        }
        return true
    }
    
    func editAreasBoundsIsEqualForHeight() -> Bool {
        let datas = self.boundsArray
        if datas.isEmpty {
            return false
        }
        if datas.count == 1 {
            return true
        }
        let height = datas.first?.height ?? 0
        for (i, rect) in datas.enumerated() {
            if i == 0 {
                continue
            }
            if height != rect.size.height {
                return false
            }
        }
        return true
    }
    
    func editAreasRotateIsEqual() -> Bool {
        let datas = self.rotates
        if datas.isEmpty {
            return false
        }
//        if self.editAreasHavTextArea() {
//            return false
//        }
//        let datas = self._editAreasRotates()
        if datas.count == 1 {
            return true
        }
        let data = datas.first ?? 0
        for (i, d) in datas.enumerated() {
            if i == 0 {
                continue
            }
            if data != d {
                return false
            }
        }
        return true
    }
    
    func editAreasOpacityIsEqual() -> Bool {
        let datas = self.opacitys
        if datas.isEmpty {
            return false
        }
        if datas.count == 1 {
            return true
        }
        let data = datas.first ?? 0
        for (i, d) in datas.enumerated() {
            if i == 0 {
                continue
            }
            if data != d {
                return false
            }
        }
        return true
    }
}