//
//  CCSpatialDisplayTypeView.swift
//  SwiftProject
//
//  Created by Zhang, Joyce on 2024/3/2.
//

import UIKit


protocol CCSpatialDisplayTypeDelegate :NSObjectProtocol{
    func CCSpatialDisplayTypeDidSelectIndex(index:Int)
}


public enum CCSpatialDisplayTypeConfigure {
    case PopMenuTextFont(UIFont)            //菜单文字字体
    case PopMenuTextColor(UIColor)          //菜单文字颜色
    case PopMenuBackgroudColor(UIColor)     //菜单背景色
    case popMenuCornorRadius(CGFloat)            //菜单圆角
    case popMenuItemHeight(CGFloat)          //菜单行高度
    case popMenuSplitLineColor(UIColor)     //菜单分割线颜色
    case popMenuIconLeftMargin(CGFloat)          //icon左间距
    case popMenuMargin(CGFloat)              //菜单与屏幕边距
    case popMenuAlpha(CGFloat)              //菜单背景透明度
}

public class CCSpatialDisplayTypeView: UIView {
    
    //delegate
    weak var delegate : CCSpatialDisplayTypeDelegate?
    //block
    public var didSelectMenuBlock:((_ index:Int)->Void)?
    
    public var tapFooterActionBlock:(()->Void)?
    
    let KScrW:CGFloat = UIScreen.main.bounds.size.width
    let KScrH:CGFloat = UIScreen.main.bounds.size.height
    
    var selectedIndex:Int = 0
    
    
    let Footer_Height:CGFloat = 48
    
    //／*  -----------------------  外部参数 通过configure设置 ---------------------------- *／
    //区域外背景透明度
    private var popMenuOutAlpha:CGFloat = 0.3
    //背景色
    private var popMenuBgColor:UIColor = UIColor.white
    //圆角弧度
    private var popMenuCornorRadius:CGFloat = 6
    //文字颜色
    private var popMenuTextColor:UIColor = UIColor.black
    //字体大小等
    private var popMenuTextFont:UIFont = UIFont.systemFont(ofSize: 17)
    //菜单高度
    private var popMenuItemHeight:CGFloat = 44.0
    //菜单分割线颜色
    private var popMenuSplitLineColor:UIColor = UIColor(red: 222/255.0, green: 222/255.0, blue: 222/255.0, alpha: 0.5)
    //icon左间距
    private var popMenuIconLeftMargin:CGFloat = 15
    //菜单与屏幕边距
    private var popMenuMargin:CGFloat = 10
    
    //／*  -----------------------  外部参数 over------------------------------------------ *／
    
    private var arrowPoint : CGPoint = CGPoint.zero         //小箭头位置
    private var arrowViewWidth : CGFloat = 15               //三角箭头宽
    private var arrowViewHeight : CGFloat = 10               //三角箭头高
    private var popData:[(icon:String,title:String,isHiden:Bool)]!       //数据源
    
    static let cellID:String = "CCSpatialDisplayTypeCellID"
    private var myFrame:CGRect!     //tableview  frame
    private var arrowView : UIView! = nil
    
    var tableView:UITableView! = nil
    
    var isShowing:Bool = false//是否为显示状态
    var dissMissCallback:()->Void = {
        print("请初始化回调")
    }
    
    lazy var showBottomView: UIView = {
        var  view = UIView()
        view.layer.cornerRadius = 12
        view.layer.masksToBounds = true
        view.isHidden = true
        
        //增加点击手势
        let guesture = UITapGestureRecognizer(target: self, action: #selector(tapFooterAction))
        view.addGestureRecognizer(guesture)
        
        return view
    }()
    lazy var showBottomTextLabel: UILabel = {
  
        let label = UILabel()
//        label.frame = showBottomView.bounds
        label.backgroundColor = UIColor.clear
        label.textAlignment = .center
        label.font = KFont_Medium(12)
        label.textColor = .white
//        label.isUserInteractionEnabled = true
        
        
        return label
    }()

    
 ///   初始化菜单
 ///
 /// - Parameters:
 ///   - menuWidth: 菜单宽度
 ///   - arrow: 箭头位置是popmenu相对整个屏幕的位置
 ///   - datas: 数据源，icon允许传空，数据源没数据，不会显示菜单
 ///   - configure: 配置信息，可不传
    init(menuWidth:CGFloat,arrow:CGPoint,datas:[(icon:String,title:String,isHiden:Bool)],configures:[CCSpatialDisplayTypeConfigure] = [],dissMissCallback:@escaping ()->Void) {
        super.init(frame: UIScreen.main.bounds)
        self.frame = UIScreen.main.bounds
        self.dissMissCallback=dissMissCallback
        
        //读取配置
        configures.forEach { (config) in
            switch (config){
                case let .PopMenuTextFont(value):
                    popMenuTextFont = value
                case let .PopMenuTextColor(value):
                    popMenuTextColor = value
                case let .PopMenuBackgroudColor(value):
                    popMenuBgColor = value
                case let .popMenuCornorRadius(value):
                    popMenuCornorRadius = value
                case let .popMenuItemHeight(value):
                    popMenuItemHeight = value
                case let .popMenuSplitLineColor(value):
                    popMenuSplitLineColor = value
                case let .popMenuIconLeftMargin(value):
                    popMenuIconLeftMargin = value
                case let .popMenuMargin(value):
                    popMenuMargin = value
                case let .popMenuAlpha(value):
                    popMenuOutAlpha = value
//                case .popMenuAlpha(let a):
//                    popMenuOutAlpha = a
            }
        }
        
        popData = datas
        //设置myFrame size  ,original会在后面计算
        myFrame = CGRect(x: 0, y: 0, width: menuWidth, height: popMenuItemHeight*CGFloat(popData.count))
        myFrame.size.height = min(KScrH/2, myFrame.height)
        myFrame.size.width = min(KScrW-popMenuMargin*2, myFrame.width)
        
        //设置肩头，与屏幕间隔10
        arrowPoint = arrow
        arrowPoint.x = max(popMenuMargin, min(arrowPoint.x, KScrW-popMenuMargin))
    
    }
    
    required public init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    //MARK: - 设置数据源
    func setData(datas:[(icon:String,title:String,isHiden:Bool)]) {
        popData = datas
        if(isShowing){
            tableView.reloadData()
        }
    }
    
    //MARK: - 设置是否展示Footer
    func showFooterView(isShow:Bool,showText:String) {
       
        showBottomView.isHidden = !isShow
        showBottomTextLabel.text = showText
        if showText == "结束串流" {
            showBottomTextLabel.backgroundColor = UIColor(hexString: "#D23027")
            
        }else if showText == "开始串流" {
            showBottomTextLabel.backgroundColor = UIColor(hexString: "#03A449")
        }
     }
    
    //MARK: - 设置UI
    func initViews() {
        self.backgroundColor = UIColor.black.withAlphaComponent(popMenuOutAlpha)
        
        let arrowPs = getArrowPoints()
        myFrame.origin = arrowPs.3
        let isarrowUP = arrowPs.4
        print(arrowPs)
        //箭头
        arrowView=UIView(frame: CGRect(x: myFrame.origin.x, y: isarrowUP ? myFrame.origin.y-arrowViewHeight : myFrame.origin.y+myFrame.height, width: myFrame.width, height: arrowViewHeight))
        let layer=CAShapeLayer()
        let path=UIBezierPath()
        path.move(to: arrowPs.0)
        path.addLine(to: arrowPs.1)
        path.addLine(to: arrowPs.2)
        layer.path=path.cgPath
        layer.fillColor = popMenuBgColor.cgColor
        arrowView.layer.addSublayer(layer)
        self.addSubview(arrowView)
        
        tableView=UITableView(frame: CGRect(x: myFrame.origin.x,y: myFrame.origin.y,width: myFrame.width,height: myFrame.height), style: .grouped)
        tableView.register(CCSpatialDisplayTypeCell.classForCoder(), forCellReuseIdentifier: CCSpatialDisplayTypeView.cellID)
        tableView.backgroundColor = popMenuBgColor
        tableView.layer.cornerRadius = popMenuCornorRadius
        tableView.separatorStyle = .none
        tableView.layer.masksToBounds = true
        tableView.delegate = self
        tableView.dataSource = self
        tableView.bounces = false
        UIView.animate(withDuration: 0.3) {
            self.addSubview(self.tableView)
        }
        
        //展示【结束串流】和【开始串流】
        showBottomView.frame = CGRect(x: self.tableView.left, y: self.tableView.bottom + 8, width: self.tableView.width, height: 40)
        showBottomTextLabel.frame = showBottomView.bounds
        self.addSubview(showBottomView)
        showBottomView.addSubview(showBottomTextLabel)
        self.bringSubviewToFront(showBottomView)
        
    }
   
    
    /// 计算箭头位置
    ///
    /// - Returns: (三角箭头顶，三角箭头左，三角箭头右，tableview 原点，是否箭头朝上)
    func getArrowPoints() -> (CGPoint,CGPoint,CGPoint,CGPoint,Bool) {
        if arrowPoint.x <= popMenuMargin {
            arrowPoint.x = popMenuMargin
        }
        if arrowPoint.x >= KScrW - popMenuMargin{
            arrowPoint.x = KScrW - popMenuMargin
        }
        var originalPoint = CGPoint.zero
        
        //箭头中间距离左边距离
        var arrowMargin:CGFloat = popMenuMargin
        if arrowPoint.x < KScrW/2{
            if (arrowPoint.x > myFrame.width/2) {
                arrowMargin = myFrame.width/2
                originalPoint = CGPoint(x: arrowPoint.x - myFrame.width/2, y: arrowPoint.y+arrowViewHeight)
            }else{
                arrowMargin = arrowPoint.x-popMenuMargin
                originalPoint = CGPoint(x: popMenuMargin, y: arrowPoint.y+arrowViewHeight)
            }
            
        }else{
            
            if (KScrW-arrowPoint.x) < myFrame.width/2{
                arrowMargin = (myFrame.width - KScrW + arrowPoint.x )
                originalPoint = CGPoint(x: KScrW-popMenuMargin-myFrame.width, y: arrowPoint.y+arrowViewHeight)
                
                
            }else{
                arrowMargin = myFrame.width/2
                originalPoint = CGPoint(x: arrowPoint.x-myFrame.width/2, y: arrowPoint.y+arrowViewHeight)
            }
        }
        
        //箭头朝上
        if (KScrH - arrowPoint.y) > myFrame.height{
            
            return (CGPoint(x: arrowMargin, y: 0),CGPoint(x: arrowMargin-arrowViewWidth/2, y: arrowViewHeight),CGPoint(x: arrowMargin+arrowViewWidth/2, y: arrowViewHeight),originalPoint,true)
            
        }else{
            originalPoint.y = arrowPoint.y-myFrame.height-arrowViewHeight
            
            return (CGPoint(x: arrowMargin, y: arrowViewHeight),CGPoint(x: arrowMargin-arrowViewWidth/2, y: 0),CGPoint(x: arrowMargin+arrowViewWidth/2, y: 0),originalPoint,false)
        }
        
    }
    
    
    
}



// MARK: - 页面显示、隐藏
extension CCSpatialDisplayTypeView{
    
    override public func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        if touches.first?.view != tableView{
            dismiss()
        }
    }
    
    public func show() {
        isShowing = true
        if popData.isEmpty{
            return
        }
        initViews()
        UIApplication.shared.keyWindow?.addSubview(self)
    }
    
    public func dismiss() {
        isShowing = false
        self.dissMissCallback()
        self.removeFromSuperview()
    }

}

// MARK: - UITableViewDataSource,UITableViewDelegate
extension CCSpatialDisplayTypeView : UITableViewDataSource,UITableViewDelegate{
    
    public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return popData.count
    }
    
    public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        if popData.count>indexPath.row {
            let cell = tableView.dequeueReusableCell(withIdentifier: CCSpatialDisplayTypeView.cellID) as! CCSpatialDisplayTypeCell
            
            let model = popData[indexPath.row]
            cell.setConfig(_txtColor: popMenuTextColor, _lineColor: popMenuSplitLineColor, _txtFont: popMenuTextFont, _iconLeft: popMenuIconLeftMargin)
            
            
            
        if indexPath.row == popData.count - 1 {
                cell.fill(iconName: model.icon, title: model.title, islast: true,isHidenArrow: model.isHiden)
            }else{
                cell.fill(iconName: model.icon, title: model.title,isHidenArrow: model.isHiden)
            }
        
            
            if selectedIndex == indexPath.row {
                cell.arrowImage.isHidden = false
            }else{
                cell.arrowImage.isHidden = true
            }
            
            return cell
        }
        
        return UITableViewCell()
    }
    
    public func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return popMenuItemHeight
    }
    public func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        return 0
    }
    public func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        return nil
    }
    public func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
        return 0
    }
    
    public func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
        return nil
    }
    
    public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        
        selectedIndex = indexPath.row
        
        if self.delegate != nil{
            self.delegate?.CCSpatialDisplayTypeDidSelectIndex(index: indexPath.row)
        }
        if didSelectMenuBlock != nil {
            didSelectMenuBlock!(indexPath.row)
        }
        
        dismiss()
    }
    
    
    //MARK: - 点击Footer
    @objc func tapFooterAction() -> Void {
        self.tapFooterActionBlock?()
    }
    
    
}



/// UITableViewCell
class CCSpatialDisplayTypeCell: UITableViewCell {
    var arrowImage:UIImageView!
    var lblTitle:UILabel!
    var line:UIView!
    
    //自定义属性
    var lineColor:UIColor = UIColor(red: 222/255.0, green: 222/255.0, blue: 222/255.0, alpha: 0.5)
    var txtColor:UIColor = UIColor.black
    var txtFont:UIFont = KFont_Medium(12)
    var iconLeft:CGFloat = 15
    
    var iconIsHidenStatus:Bool = false
    
    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        self.backgroundColor = UIColor.clear
        
        arrowImage = UIImageView()
        arrowImage.image = UIImage(named: "type_check")
        self.contentView.addSubview(arrowImage)
        self.selectionStyle = .none
        
        lblTitle = UILabel()
        self.contentView.addSubview(lblTitle)
        
        line = UIView()
        self.contentView.addSubview(line)
        
        
    }
    
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    
    func fill(iconName:String,title:String,islast:Bool = false,isHidenArrow:Bool) {
        self.iconIsHidenStatus = isHidenArrow
        
        if iconIsHidenStatus {
            //隐藏箭头
            self.arrowImage.isHidden = true
        }else{
            //不隐藏箭头
            self.arrowImage.isHidden = false
        }
        
        arrowImage.image = UIImage(named: iconName)
        lblTitle.text = title
        line.isHidden = islast
        
    }
    
    func setConfig(_txtColor:UIColor,_lineColor:UIColor,_txtFont:UIFont,_iconLeft:CGFloat) {
        txtColor = _txtColor
        txtFont = _txtFont
        lineColor = _lineColor
        iconLeft = _iconLeft
        
        line.backgroundColor = lineColor
        lblTitle.textColor = txtColor
        lblTitle.font = txtFont
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()

//        self.lblTitle.frame = CGRect(x: 20+iconLeft*2, y: 0, width: self.bounds.size.width - 40, height: self.bounds.size.height)
//        self.line.frame = CGRect(x: 0, y: self.frame.size.height - 1, width: self.frame.size.width, height: 1)
        
        
        if !self.iconIsHidenStatus {
            //有图片
            self.lblTitle.textAlignment = .left
            self.lblTitle.frame = CGRect(x: 16, y: 0, width: self.frame.size.width - 42, height: self.frame.size.height)
            self.line.frame = CGRect(x: 0, y: self.frame.size.height - 1, width: self.frame.size.width, height: 1)
            
            self.arrowImage.frame = CGRect(x: self.bounds.size.width - 26, y: (self.bounds.size.height - 12)/2, width: 12, height: 12)
            
        }else{
            //无图片
            self.lblTitle.textAlignment = .center
            self.lblTitle.frame = CGRect(x: 16, y: 0, width: self.frame.size.width - 32, height: self.frame.size.height)
            self.line.frame = CGRect(x: 0, y: self.frame.size.height - 1, width: self.frame.size.width, height: 1)
        }
        
    }
    
    
}
