//
//  KMPageEditSplitSettingModel.swift
//  PDF Reader Pro
//
//  Created by tangchao on 2023/1/12.
//

import Cocoa

class KMPageEditSplitSettingModel: KMPageEditSettingBaseModel {
    var type: Int = 0
    var avgNumberForOneFile: Int = 1
    var avgSplitNumberFile: Int = 1
    var pageRangeType: Int = 1
    var pageRangeString: String = ""
    
    var origFileNameIsPrefix: Bool = true
    
    var hasTag: Bool = true
    var tagString: String = "part"
    
    var hasSep: Bool = true
    var sepString: String = "-"
    
    var getSplitIndexSets: Array<IndexSet>? {
        get {
            if (type < 0 || type > 2) {
                return nil
            }
            
            if (self.pageCount == NSNotFound) {
                return nil
            }
            
            let pageCount = self.pageCount
            if (self.type == 0) { /// 平均每几页拆分
                if (self.avgNumberForOneFile <= 0) {
                    return nil
                }
                
                let avgNumberPage = self.avgNumberForOneFile
                var fileCount: Int = (pageCount / avgNumberPage)
                if (pageCount % avgNumberPage != 0) {
                    fileCount += 1
                }
                var files: Array<IndexSet> = []
                for i in 0 ..< fileCount {
                    var indexs: IndexSet = []
                    for j in 0 ..< avgNumberPage {
                        if (i * avgNumberPage + j >= pageCount) {
                            break
                        }
                        indexs.insert(i * avgNumberPage + j)
                    }
                    files.append(indexs)
                }
                
                return files
            }
            
            if (self.type == 1) { /// 平均拆分几个文档
                if (self.avgSplitNumberFile <= 0) {
                    return nil
                }
                
                let fileCount: Int = self.avgSplitNumberFile
                
                var avgNumberPage = (pageCount / fileCount)
                let pageOffset = pageCount % fileCount
                var files: Array<IndexSet> = []
                for i in 0 ..< fileCount {
                    var indexs: IndexSet = []
                    let offset: Int = i < pageOffset ? 1 : 0
                    for j in 0 ..< (avgNumberPage+offset) {
                        if (i * avgNumberPage + j >= pageCount) {
                            break
                        }
                        indexs.insert(i * avgNumberPage + j)
                    }
                    files.append(indexs)
                }
                
                return files
            }
            
            if (self.type == 2) { /// 按页面范围
                var indexSet1: IndexSet = []
                var indexSet2: IndexSet = []
                if (self.pageRangeType == 0) { /// 奇数页
                    for i in 0 ..< pageCount {
                        if (i % 2 == 0) {
                            indexSet1.insert(i)
                        } else {
                            indexSet2.insert(i)
                        }
                    }
                } else if (self.pageRangeType == 1) { /// 偶数页
                    for i in 0 ..< pageCount {
                        if (i % 2 == 1) {
                            indexSet1.insert(i)
                        } else {
                            indexSet2.insert(i)
                        }
                    }
                } else { /// 自定义
                    let selectedPages = KMPageRangeTools.findSelectPage(pageRangeString: self.pageRangeString, pageCount: pageCount)
                    if (selectedPages.count <= 0) {
                        return nil
                    }
                    var tmpPages: [Int] = []
                    for page in selectedPages {
                        if (page > 0) {
                            tmpPages.append(page-1)
                        }
                    }
                    
                    for i in 0 ..< pageCount {
                        if (tmpPages.contains(i)) {
                            indexSet1.insert(i)
                        } else {
                            indexSet2.insert(i)
                        }
                    }
                }
                
                var files: Array<IndexSet> = []
                if (indexSet1.count > 0) {
                    files.append(indexSet1)
                }
                if (indexSet2.count > 0) {
                    files.append(indexSet2)
                }
                return files
            }
            return nil
        }
    }
    
    override var outputFileName: String {
        get {
            guard let _fileName = self.fileName, !_fileName.isEmpty else {
                return ""
            }
            
            var result: String = ""
            
            var newFileName: String = ""
    //        let pathExtension = _fileName.components(separatedBy: ".").last
            let files = _fileName.split(separator: ".")
            for i in 0 ..< files.count-1 {
                let file: String = String(files[i])
                newFileName.append(file)
                if (i < files.count-2) {
                    newFileName.append(".")
                }
            }
            
            if (self.origFileNameIsPrefix) {
                result.append(newFileName)
                if (self.hasSep) {
                    result.append(self.sepString)
                }
                if (self.hasTag) {
                    result.append("\(self.tagString)")
                }
            } else {
                if (self.hasTag) {
                    result.append("\(self.tagString)")
                } 
                if (self.hasSep) {
                    result.append(self.sepString)
                }
                result.append(newFileName)
            }
            
            self.outputFileNameDeletePathExtension = result
            
            result.append(".")
            result.append(self.pathExtension ?? "pdf")
            
            return result
        }
    }
    
    func getNewOutputFileName(index: Int) -> String {
        guard let _fileName = self.fileName, !_fileName.isEmpty else {
            return ""
        }
        
        var result: String = ""
        
        var newFileName: String = ""
        let files = _fileName.split(separator: ".")
        for i in 0 ..< files.count-1 {
            let file: String = String(files[i])
            newFileName.append(file)
            if (i < files.count-2) {
                newFileName.append(".")
            }
        }
        
        if (self.origFileNameIsPrefix) {
            result.append(newFileName)
            if (self.hasSep) {
                result.append(self.sepString)
            }
            if (self.hasTag) {
                result.append("\(self.tagString) \(index)")
            } else {
                result.append("\(index)")
            }
        } else {
            if (self.hasTag) {
                result.append("\(self.tagString) \(index)")
            } else {
                result.append("\(index)")
            }
            if (self.hasSep) {
                result.append(self.sepString)
            }
            result.append(newFileName)
        }
        // 文件名兼容 /
        result = result.replacingOccurrences(of: "/", with: ":")
        return result
    }
}