//
//  YHFormPickerView.swift
//  galaxy
//
//  Created by edy on 2024/1/29.
//  Copyright © 2024 https://www.galaxy-immi.com. All rights reserved.
//

// 【 用法  Usage】
/*
 
 // (1) 直接传type
 YHFormPickerView.show(type: .certificate, selectType: .certificate(.otherStatelessTravelPassport)) { selectType in
     // 选择类型的标题
     print(selectType.title)
 }
 
 // (2) 直接传字符串值
 YHFormPickerView.show(type: .certificate, selectTitle: "公务通行证") { selectType in
     // 选择类型的标题
     print(selectType.title)
 }
 
 */


import UIKit

enum YHFormPickerViewType: Int {
    // 按自然顺序递增
    case none = 0
    // 学位
    case degree = 1
    // 婚姻
    case marriage = 2
    // 授课形式
    case edution = 3
    // 职业
    case occupation = 4
    // 性别
    case gender = 5
    // 证件
    case certificate = 6
}

enum YHFormPickerViewSubType {
    
    case none
    case marriage(YHPickerViewMarriageType)
    case degree(YHPickerViewDegreeType)
    case education(YHPickerViewEducationType)
    case occupation(YHPickerViewOccupationType)
    case gender(YHPickerViewGenderType)
    case certificate(YHPickerViewCertificateType)
    
    var title:String {
        switch self {
            
        case .none:
            return "".local
            
        case .marriage(.unmarriage):
            return "未婚".local
        case .marriage(.marriaged):
            return "已婚".local
        case .marriage(.separated):
            return "分居".local
        case .marriage(.divorced):
            return "离婚".local
        case .marriage(.widowed):
            return "丧偶".local
            
        case .degree(.bachelor):
            return "学士学位".local
        case .degree(.master):
            return "硕士学位".local
        case .degree(.doctor):
            return "博士学位".local
        
        case .education(.fullTime):
            return "全日制".local
        case .education(.partTime):
            return "兼职制".local
        case.education(.distanceCourses):
            return "遥距课程".local
        
        case .occupation(.onTheJob):
             return "在职".local
        case .occupation(.retire):
             return "退休".local
        case .occupation(.unemployed):
             return "无业".local
        case .occupation(.student):
             return "学生".local
        
        case .gender(.male):
            return "男".local
        case .gender(.female):
            return "女".local
            
        case .certificate(.passport):
            return "护照".local
        case .certificate(.travelPassport):
            return "旅游通行证".local
        case .certificate(.diplomaticPassport):
            return "外交护照".local
        case .certificate(.chineseStatelessTravelPassport):
            return "中国发无国籍旅游证件".local
        case .certificate(.otherStatelessTravelPassport):
            return "其他无国籍旅行证件".local
        case .certificate(.unitedNationsPassport):
            return "联合国通行证".local
        case .certificate(.officialPassport):
            return "公务护照".local
            
            
        }
    }
    
    static func getType(_ title: String?) -> YHFormPickerViewSubType {
        
        guard let title = title else { return .none }
        
        if title == "未婚".local {
            return .marriage(.unmarriage)
        } else if title == "已婚".local {
            return .marriage(.marriaged)
        } else if title == "分居".local {
            return .marriage(.separated)
        } else if title == "离婚".local {
            return .marriage(.divorced)
        } else if title == "丧偶".local {
            return .marriage(.widowed)
            
        } else if title == "学士学位".local {
            return .degree(.bachelor)
        } else if title == "硕士学位".local {
            return .degree(.master)
        } else if title == "硕士学位".local {
            return .degree(.doctor)
            
        } else if title == "全日制".local {
           return .education(.fullTime)
        } else if title == "兼读制".local {
           return .education(.partTime)
        } else if title == "遥距课程".local {
            return .education(.distanceCourses)
            
            
        } else if title == "在职".local {
            return .occupation(.onTheJob)
        } else if title == "退休".local {
            return .occupation(.retire)
        } else if title == "无业".local {
            return .occupation(.unemployed)
        } else if title == "学生".local {
            return .occupation(.student)
        
        } else if title == "男".local {
            return .gender(.male)
        } else if title == "女".local {
            return .gender(.female)
            
        } else if title == "护照".local {
            return .certificate(.passport)
        } else if title == "外交护照".local {
            return .certificate(.diplomaticPassport)
        } else if title == "旅游通行证".local {
            return .certificate(.travelPassport)
        } else if title == "公务护照".local {
            return .certificate(.officialPassport)
        } else if title == "中国发无国籍旅游证件".local {
            return .certificate(.chineseStatelessTravelPassport)
        } else if title == "其他无国籍旅行证件".local {
            return .certificate(.otherStatelessTravelPassport)
        } else if title == "联合国通行证".local {
            return .certificate(.unitedNationsPassport)
        }
        
        return .none
    }
}
    

enum YHPickerViewMarriageType {
    // 未婚
    case unmarriage
    // 已婚
    case marriaged
    // 离婚
    case divorced
    // 分居
    case separated
    // 丧偶
    case widowed
}

enum YHPickerViewDegreeType {
    // 学士
    case bachelor
    // 硕士
    case master
    // 博士
    case doctor
}

enum YHPickerViewEducationType {
    // 全日制
    case fullTime
    // 兼读制
    case partTime
    // 遥距课程
    case distanceCourses
}

enum YHPickerViewOccupationType {
    // 在职
    case onTheJob
    // 退休
    case retire
    // 无业
    case unemployed
    // 学生
    case student
}

enum YHPickerViewGenderType {
    // 男
    case male
    // 女
    case female
}

enum YHPickerViewCertificateType {
    // 护照
    case passport
    // 外交护照
    case diplomaticPassport
    // 公务护照
    case officialPassport
    // 中国发无国籍旅游证件
    case chineseStatelessTravelPassport
    // 旅游通行证
    case travelPassport
    // 联合国通行证
    case unitedNationsPassport
    // 其他无国籍旅行证件
    case otherStatelessTravelPassport

}


class YHFormPickerViewItem {
    
    let type: YHFormPickerViewSubType
    lazy var title = {
        return type.title
    }()
    
    init(type: YHFormPickerViewSubType) {
        self.type = type
    }
}

class YHFormPickerView: UIView {

    let type: YHFormPickerViewType
    
    var selectType:YHFormPickerViewSubType?
    var selectTitle:String? {
        didSet {
            let type:YHFormPickerViewSubType = YHFormPickerViewSubType.getType(selectTitle)
            selectType = type
        }
    }
    var selectBlock:((YHFormPickerViewSubType)->Void)?
    
    var title: String? {
        didSet {
            titleLabel.text = title
        }
    }
    
    lazy var pickerView:UIPickerView = {
        let view = UIPickerView()
        view.dataSource = self
        view.delegate = self
        return view
    }()
    
    lazy var blackMaskView: UIView = {
        let view = UIView()
        view.backgroundColor = UIColor(hex: 0x0F1214, alpha: 0.5)
        let tap = UITapGestureRecognizer(target: self, action: #selector(dismiss))
        view.addGestureRecognizer(tap)
        return view
    }()
    
    lazy var whiteContentView: UIView = {
        let view = UIView()
        view.backgroundColor = .white
        return view
    }()
    
    lazy var topView:UIView = {
        let view = UIView()
        view.addSubview(titleLabel)
        view.addSubview(cancelBtn)
        view.addSubview(confirmBtn)
        titleLabel.snp.makeConstraints { make in
            make.edges.equalToSuperview()
        }
        cancelBtn.snp.makeConstraints { make in
            make.left.top.bottom.equalToSuperview()
            make.width.equalTo(60)
        }
        confirmBtn.snp.makeConstraints { make in
            make.right.top.bottom.equalToSuperview()
            make.width.equalTo(60)
        }
        return view
    }()
    
    lazy var titleLabel: UILabel = {
        let label = UILabel()
        label.textColor = UIColor(hexString:"#222222")
        label.textAlignment = .center
        label.font = UIFont.PFSC_R(ofSize: 16)
        label.text = "请选择"
        return label
    }()
    
    lazy var cancelBtn: UIButton = {
        let btn = UIButton()
        btn.setTitle("取消".local, for: .normal)
        btn.titleLabel?.font = UIFont.PFSC_R(ofSize: 14)
        btn.setTitleColor(UIColor(hex: 0x222222), for: .normal)
        btn.addTarget(self, action: #selector(didClickCancelButton), for: .touchUpInside)
        return btn
    }()
    
    lazy var confirmBtn: UIButton = {
        let btn = UIButton()
        btn.setTitle("确定".local, for: .normal)
        btn.titleLabel?.font = UIFont.PFSC_R(ofSize: 14)
        btn.setTitleColor(UIColor(hex: 0x4487F9), for: .normal)
        btn.addTarget(self, action: #selector(didClickConfirmButton), for: .touchUpInside)
        return btn
    }()
    
    lazy var dataDict:[ YHFormPickerViewType: [YHFormPickerViewItem]] = {
       return [
            
            // 此处顺序需遵循 YHFormPickerViewType 枚举顺序
        
            // 默认无
            .none:[],
            
            // 学位
            .degree:
            [YHFormPickerViewItem(type: .degree(.bachelor)),
             YHFormPickerViewItem(type: .degree(.master)),
             YHFormPickerViewItem(type: .degree(.doctor))],
            
            // 婚姻
            .marriage:
            [YHFormPickerViewItem(type: .marriage(.unmarriage)),
             YHFormPickerViewItem(type: .marriage(.marriaged)),
             YHFormPickerViewItem(type: .marriage(.divorced)),
             YHFormPickerViewItem(type: .marriage(.separated)),
             YHFormPickerViewItem(type: .marriage(.widowed))],
            
            // 教育
            .edution:
            [YHFormPickerViewItem(type: .education(.fullTime)),
             YHFormPickerViewItem(type: .education(.partTime)),
             YHFormPickerViewItem(type: .education(.distanceCourses))],
            
            // 职业
            .occupation:
            [YHFormPickerViewItem(type: .occupation(.onTheJob)),
             YHFormPickerViewItem(type: .occupation(.retire)),
             YHFormPickerViewItem(type: .occupation(.unemployed)),
             YHFormPickerViewItem(type: .occupation(.student))],
            
            // 性别
            .gender:
            [YHFormPickerViewItem(type: .gender(.male)),
             YHFormPickerViewItem(type: .gender(.female))],
            
            // 证件
            .certificate:
            [YHFormPickerViewItem(type: .certificate(.passport)),
             YHFormPickerViewItem(type: .certificate(.diplomaticPassport)),
             YHFormPickerViewItem(type: .certificate(.officialPassport)),
             YHFormPickerViewItem(type: .certificate(.chineseStatelessTravelPassport)),
             YHFormPickerViewItem(type: .certificate(.travelPassport)),
             YHFormPickerViewItem(type: .certificate(.unitedNationsPassport)),
             YHFormPickerViewItem(type: .certificate(.otherStatelessTravelPassport))],
        ]
    }()
    
    
    init(type: YHFormPickerViewType) {
        self.type = type
        super.init(frame: UIScreen.main.bounds)
        self.createUI()
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    func show() {
        showSelectType(&selectType)
        UIApplication.shared.yhKeyWindow()?.addSubview(self)
    }
    
    static func show(type:YHFormPickerViewType, selectType:YHFormPickerViewSubType,  callBack: @escaping ((YHFormPickerViewSubType)->Void)) {
        
        let picker = YHFormPickerView(type: type)
        picker.selectType = selectType
        picker.selectBlock = callBack
        picker.show()
    }
    
    static func show(type:YHFormPickerViewType, selectTitle:String?, callBack: @escaping ((YHFormPickerViewSubType)->Void)) {
        
        let picker = YHFormPickerView(type: type)
        picker.selectTitle = selectTitle
        picker.selectBlock = callBack
        picker.show()
    }
    
    
    
    @objc func dismiss() {
        self.removeFromSuperview()
    }
    
    func createUI() {
        
        self.addSubview(blackMaskView)
        self.addSubview(whiteContentView)
        whiteContentView.addSubview(topView)
        whiteContentView.addSubview(pickerView)
        
        let corner = UIRectCorner(rawValue: UIRectCorner.topLeft.rawValue | UIRectCorner.topRight.rawValue)
        let path = UIBezierPath(roundedRect:bounds,byRoundingCorners: corner,cornerRadii:CGSizeMake(16.0, 16.0));
        let layer = CAShapeLayer();
        layer.frame = whiteContentView.bounds;
        layer.path = path.cgPath;
        whiteContentView.layer.mask = layer;
        
        if let title = title {
            titleLabel.text = title
        } else {
            titleLabel.text = getTitle(type: type)
        }
        
        blackMaskView.snp.makeConstraints { make in
            make.edges.equalToSuperview()
        }
        
        whiteContentView.snp.makeConstraints { make in
            make.left.right.bottom.equalToSuperview()
            make.top.equalToSuperview().offset(KScreenHeight*2/3.0)
        }
        
        topView.snp.makeConstraints { make in
            make.left.right.top.equalToSuperview()
            make.height.equalTo(52)
        }
        
        pickerView.snp.makeConstraints { make in
            make.top.equalTo(topView.snp.bottom)
            make.left.right.bottom.equalToSuperview()
        }
    }
    
    @objc func didClickCancelButton() {
        dismiss()
    }
    
    @objc func didClickConfirmButton() {
        if let selectBlock = selectBlock  {
            if let selectType = selectType {
                selectBlock(selectType)
            } else {
                // 默认选中第一行
                let arr = dataDict[type]
                if let arr = arr, !arr.isEmpty {
                    let item:YHFormPickerViewItem = arr[0]
                    selectType = item.type
                    selectBlock(item.type)
                }
            }
        }
        dismiss()
    }
    
    func showSelectType(_ selectType: inout YHFormPickerViewSubType?) {
        // 处理从外部传入的选中第几行的参数
        // 是否找到选中行数据
        var selectIndex:Int = -1
        if let selectType = selectType, let arr = dataDict[type], !arr.isEmpty {
            for (index, item) in arr.enumerated() {
                if selectType.title == item.type.title {
                    selectIndex = index
                    break
                }
            }
        }
        
        if selectIndex != -1 { // 找到了选择行
            pickerView.selectRow(selectIndex, inComponent: 0, animated: true)
        } else { // 未找到选中行数据则滚动至第一行
            if dataDict[type]?.isEmpty == true { return }
            if let arr = dataDict[type], !arr.isEmpty {
                let item = arr[0]
                selectType = item.type
                pickerView.selectRow(0, inComponent: 0, animated: true)
            }
        }
    }
    
    func getTitle(type: YHFormPickerViewType)-> String {
        
        switch type {
        case .none:
            return ""
        case .degree:
            return "选择学位"
        case .marriage:
            return "选择婚姻状况"
        case .edution:
            return "选择学位"
        case .occupation:
            return "选择职业"
        case .gender:
            return "选择性别"
        case .certificate:
            return "选择证件"
        }
    }
}

extension YHFormPickerView: UIPickerViewDelegate, UIPickerViewDataSource {
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }
    
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        if let arr = dataDict[type], !arr.isEmpty {
            return arr.count
        }
        return 0
    }
    
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        if let arr = dataDict[type] {
            if 0 <= row && row < arr.count {
                let item :YHFormPickerViewItem = arr[row]
                return item.title
            }
        }
        return ""
    }
    
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        if let arr = dataDict[type] {
            if 0 <= row && row < arr.count {
                let item :YHFormPickerViewItem = arr[row]
                print(item.title)
                selectType = item.type
            }
        }
    }
    
    func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView {

        let label = UILabel()
        label.textColor = UIColor(hexString:"#222222")
        label.textAlignment = .center
        label.font = UIFont.PFSC_R(ofSize: 14)
        label.text = ""
        if let arr = dataDict[type] {
            if 0 <= row && row < arr.count {
                let item :YHFormPickerViewItem = arr[row]
                label.text = item.title
            }
        }
        // 选中背景色
        if #available(iOS 14.0, *), pickerView.subviews.count > 1 {
           pickerView.subviews[1].backgroundColor = UIColor(hex: 0x4487F9, alpha: 0.06)
        }
        return label
    }
}
