
// MARK: - 设置页退出登录跟注销账号提示视图

/// 设置页退出登录跟注销账号提示视图
open class PQRemindView: UIView {
    public var isBanned: Bool = false // 是否是拉黑用户提示
    public var isBlank: Bool = false { // 是否是黑色弹窗
        didSet {
            if isBlank {
                contentView.backgroundColor = UIColor.hexColor(hexadecimal: "#212223")
                titleLab.textColor = UIColor.white
                contentLab.textColor = UIColor.white
                cancelBtn.setTitleColor(UIColor.white, for: .normal)
                confirmBtn.setTitleColor(UIColor.white, for: .normal)
            } else {
                contentView.backgroundColor = UIColor.white
                contentLab.textColor = UIColor.hexColor(hexadecimal: "#666666")
                titleLab.textColor = UIColor.black
                cancelBtn.setTitleColor(UIColor.black, for: .normal)
                confirmBtn.setTitleColor(UIColor.black, for: .normal)
            }
        }
    }

    public var remindBlock: ((_ sender: UIButton, _ remindData: PQBaseModel?) -> Void)?

    lazy public var contentView: UIView = {
        let contentView = UIView()
        contentView.backgroundColor = UIColor.white
        contentView.addCorner(corner: 4)
        return contentView
    }()

    lazy public var titleLab: UILabel = {
        let titleLab = UILabel()
        titleLab.font = UIFont.systemFont(ofSize: 18, weight: .medium)
        titleLab.textAlignment = .center
        titleLab.numberOfLines = 0
        titleLab.textColor = UIColor.black
        return titleLab
    }()

    lazy public var contentLab: UILabel = {
        //        let contentLab = TYAttributedLabel.init()
        //        contentLab.textAlignment = CTTextAlignment.center
        //        contentLab.verticalAlignment = .center
        //        contentLab.highlightedLinkBackgroundColor = UIColor.white
        //        contentLab.numberOfLines = 0
        //        contentLab.font = UIFont.systemFont(ofSize: 14)
        //        contentLab.textColor = UIColor.hexColor(hexadecimal: "#666666")
        let contentLab = UILabel()
        contentLab.font = UIFont.systemFont(ofSize: 16)
        contentLab.textAlignment = .center
        contentLab.numberOfLines = 0
        contentLab.textColor = UIColor.hexColor(hexadecimal: "#666666")
        return contentLab
    }()

    lazy public var cancelBtn: UIButton = {
        let cancelBtn = UIButton(type: .custom)
        cancelBtn.setTitle("取消", for: .normal)
        cancelBtn.setTitleColor(UIColor.black, for: .normal)
        cancelBtn.tag = 1
        cancelBtn.addTarget(self, action: #selector(btnClck(sender:)), for: .touchUpInside)
        cancelBtn.titleLabel?.font = UIFont.systemFont(ofSize: 16, weight: .medium)
        return cancelBtn
    }()

    lazy public var confirmBtn: UIButton = {
        let confirmBtn = UIButton(type: .custom)
        confirmBtn.setTitle("确定", for: .normal)
        confirmBtn.setTitleColor(UIColor.black, for: .normal)
        confirmBtn.tag = 2
        confirmBtn.addTarget(self, action: #selector(btnClck(sender:)), for: .touchUpInside)
        confirmBtn.titleLabel?.font = UIFont.systemFont(ofSize: 16, weight: .medium)
        return confirmBtn
    }()

    lazy public var verticalLine: UIView = {
        let verticalLine = UIView()
        verticalLine.backgroundColor = UIColor.hexColor(hexadecimal: "#E5E5E5")
        return verticalLine
    }()

    lazy public var horizonLine: UIView = {
        let horizonLine = UIView()
        horizonLine.backgroundColor = UIColor.hexColor(hexadecimal: "#E5E5E5")
        return horizonLine
    }()

    override public init(frame: CGRect) {
        super.init(frame: frame)
        addSubview(contentView)
        contentView.addSubview(titleLab)
        contentView.addSubview(contentLab)
        contentView.addSubview(cancelBtn)
        contentView.addSubview(confirmBtn)
        contentView.addSubview(verticalLine)
        contentView.addSubview(horizonLine)
        backgroundColor = cShadowColor
    }

    required public init?(coder _: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    public var  remindData: PQBaseModel? {
        didSet {
            addData()
            addLayout()
        }
    }

    open func addData() {
        titleLab.text = remindData?.title
        contentLab.text = remindData?.summary
        cancelBtn.setTitleColor(isBanned ? (isBlank ? UIColor.white : UIColor.black) : (isBlank ? UIColor.white : UIColor.hexColor(hexadecimal: "#666666")), for: .normal)
        if isBanned {
            titleLab.textAlignment = .center
        } else {
            titleLab.textAlignment = .left
        }
    }

   open func addLayout() {
        var summH: CGFloat = 0
        var titleH: CGFloat = 0
        if (remindData?.summary?.count ?? 0) > 0 {
            summH = sizeWithText(text: remindData?.summary ?? "", font: UIFont.systemFont(ofSize: 16, weight: .medium), size: CGSize(width: cScreenWidth - cDefaultMargin * 12, height: CGFloat.greatestFiniteMagnitude)).height + cDefaultMargin
        }
        if (remindData?.title?.count ?? 0) > 0 {
            titleH = sizeWithText(text: remindData?.title ?? "", font: UIFont.systemFont(ofSize: 18, weight: .medium), size: CGSize(width: cScreenWidth - cDefaultMargin * 12, height: CGFloat.greatestFiniteMagnitude)).height + cDefaultMargin
            if titleH < cDefaultMargin * 2 {
                titleH = cDefaultMargin * 2
            }
        }
        let contentH: CGFloat = cDefaultMargin * 2 + (titleH > 0 ? titleH + cDefaultMargin : 0) + (summH > 0 ? summH + cDefaultMargin : 0) + cDefaultMargin * 3 + (isBanned ? cDefaultMargin * 2 : 0)
        contentView.snp.makeConstraints { make in
            make.left.equalTo(self).offset(cDefaultMargin * 4)
            make.right.equalTo(self).offset(-cDefaultMargin * 4)
            make.height.equalTo(contentH)
            make.center.equalTo(self)
        }
        titleLab.snp.makeConstraints { make in
            make.left.equalTo(contentView).offset(cDefaultMargin * 2)
            make.right.equalTo(contentView).offset(-cDefaultMargin * 2)
            make.height.equalTo(titleH)
            make.top.equalTo(contentView).offset(cDefaultMargin * 2)
        }
        contentLab.snp.makeConstraints { make in
            make.top.equalTo(titleLab.snp_bottom).offset(summH > 0 ? cDefaultMargin : 0)
            make.left.right.equalTo(titleLab)
            make.height.equalTo(summH)
        }
        if isBanned {
            let btnW: CGFloat = (cScreenWidth - 1 - cDefaultMargin * 8) / 2
            verticalLine.snp.makeConstraints { make in
                make.top.equalTo(contentLab.snp_bottom).offset(cDefaultMargin)
                make.height.equalTo(1)
                make.left.width.equalToSuperview()
            }
            cancelBtn.snp.makeConstraints { make in
                make.left.equalToSuperview()
                make.top.equalTo(verticalLine.snp_bottom)
                make.width.equalTo(btnW)
                make.bottom.equalTo(contentView)
            }
            horizonLine.snp.makeConstraints { make in
                make.left.equalTo(cancelBtn.snp_right)
                make.height.top.equalTo(cancelBtn)
                make.width.equalTo(1)
            }
            confirmBtn.snp.makeConstraints { make in
                make.right.equalToSuperview()
                make.height.width.bottom.equalTo(cancelBtn)
            }
        } else {
            confirmBtn.snp.makeConstraints { make in
                make.right.equalTo(titleLab)
                make.height.equalTo(cDefaultMargin * 4)
                make.width.equalTo(cDefaultMargin * 6)
                make.bottom.equalTo(contentView).offset(-cDefaultMargin)
            }
            cancelBtn.snp.makeConstraints { make in
                make.right.equalTo(confirmBtn.snp_left).offset(-cDefaultMargin)
                make.height.equalTo(cDefaultMargin * 4)
                make.width.equalTo(cDefaultMargin * 6)
                make.bottom.equalTo(confirmBtn)
            }
        }
    }

    @objc open func btnClck(sender: UIButton) {
        removeFromSuperview()
        if remindBlock != nil {
            remindBlock!(sender, remindData!)
        }
    }
}

// MARK: 空白提示页

/// 空白提示页
open class PQEmptyRemindView: UIView {
    // 回调
    public var fullRefreshBloc: ((_ isNetConnected: Bool, _ emptyData: PQEmptyModel?) -> Void)?

    lazy public var imageView: UIImageView = {
        let imageView = UIImageView()
        imageView.backgroundColor = UIColor.clear
        imageView.contentMode = .scaleAspectFit
        return imageView
    }()

    lazy public var remindLab: UILabel = {
        let remindLab = UILabel()
        remindLab.font = UIFont.systemFont(ofSize: 16)
        remindLab.numberOfLines = 1
        remindLab.textAlignment = NSTextAlignment.center
        remindLab.textColor = UIColor.white
        return remindLab
    }()

//    lazy public var shimmeringView: FBShimmeringView = {
//        let shimmeringView = FBShimmeringView()
//        shimmeringView.isShimmering = false
//        shimmeringView.shimmeringBeginFadeDuration = 0.3
//        shimmeringView.shimmeringEndFadeDuration = 0.1
//        shimmeringView.shimmeringOpacity = 0.2
//        shimmeringView.shimmeringSpeed = 300
//        shimmeringView.contentView = remindLab
//        return shimmeringView
//    }()

    lazy public var remindSubLab: UILabel = {
        let remindSubLab = UILabel()
        remindSubLab.font = UIFont.systemFont(ofSize: 14)
        remindSubLab.numberOfLines = 1
        remindSubLab.textAlignment = NSTextAlignment.center
        remindSubLab.textColor = UIColor.hexColor(hexadecimal: "#999999")
        return remindSubLab
    }()

    lazy public var refreshBtn: UIButton = {
        let refreshBtn = UIButton(type: .custom)
        refreshBtn.backgroundColor = UIColor.hexColor(hexadecimal: "#EE0051")
        refreshBtn.titleLabel?.font = UIFont.systemFont(ofSize: 15)
        refreshBtn.setTitleColor(UIColor.white, for: .normal)
        refreshBtn.setTitle("刷新", for: .normal)
        refreshBtn.setTitle("重新连接网络", for: .selected)
        refreshBtn.addCorner(corner: cDefaultMargin * 2)
        refreshBtn.isHidden = true
        refreshBtn.addTarget(self, action: #selector(fullRefresh), for: .touchUpInside)
        return refreshBtn
    }()

    override public init(frame: CGRect) {
        super.init(frame: frame)
        addSubview(imageView)
//        addSubview(shimmeringView)
        addSubview(remindSubLab)
        addSubview(refreshBtn)
        let ges = UITapGestureRecognizer(target: self, action: #selector(fullRefresh))
        addGestureRecognizer(ges)
        backgroundColor = PQBFConfig.shared.styleBackGroundColor
    }

    required public init?(coder _: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    @objc public var emptyData: PQEmptyModel? {
        didSet {
            addData()
            addLayout()
        }
    }
}

extension PQEmptyRemindView {
    public func addData() {
        if !isNetConnected() {
            remindLab.text = "网络连接失败，请检查网络后重试"
            remindSubLab.isHidden = true
            refreshBtn.isHidden = false
            refreshBtn.backgroundColor = UIColor.hexColor(hexadecimal: "#EE0051")
            refreshBtn.setTitleColor(UIColor.white, for: .normal)
            refreshBtn.setTitle("刷新", for: .normal)
            imageView.image = UIImage.init().BF_Image(named:  "pic_network")
        } else {
            if emptyData?.emptyImage != nil, emptyData?.emptyImage?.count ?? 0 > 0 {
                imageView.image = UIImage.init().BF_Image(named:  emptyData?.emptyImage ?? "")
            } else {
                imageView.image = nil
            }
            remindLab.text = emptyData?.title
            remindSubLab.text = emptyData?.summary
            refreshBtn.isHidden = emptyData?.isRefreshHidden ?? true
            if emptyData?.refreshImage != nil, (emptyData?.refreshImage?.count ?? 0) > 0 {
                refreshBtn.setImage(UIImage.init().BF_Image(named:  emptyData?.refreshImage ?? ""), for: .normal)
            } else {
                refreshBtn.setImage(nil, for: .normal)
            }
            refreshBtn.setAttributedTitle(emptyData?.refreshTitle, for: .normal)
            if emptyData?.refreshBgColor != nil {
                refreshBtn.backgroundColor = emptyData?.refreshBgColor
            }
        }
    }

    override public var isHidden: Bool {
        didSet {
            addData()
            addLayout()
        }
    }

    public func addLayout() {
        var imageH: CGFloat = cDefaultMargin * 7
        var contentH: CGFloat = 0

        if (emptyData?.emptyImage != nil &&  emptyData?.emptyImage?.count ?? 0 > 0) || !isNetConnected() {
            contentH = contentH + imageH + cDefaultMargin
        } else {
            imageH = 0
        }
        if emptyData?.title != nil, emptyData?.title?.count ?? 0 > 0 {
            contentH = contentH + cDefaultMargin * 2 + cDefaultMargin
        }
        if emptyData?.summary != nil, emptyData?.summary?.count ?? 0 > 0 {
            contentH = contentH + cDefaultMargin * 2 + cDefaultMargin
        }
        if !refreshBtn.isHidden {
            contentH = contentH + cDefaultMargin + cDefaultMargin * 4
        }
        let topY = (frame.height - contentH) / 2
        imageView.snp.remakeConstraints { make in
            make.top.equalTo(topY)
            make.centerX.equalTo(self)
            make.height.equalTo(imageH)
        }
//        shimmeringView.snp.makeConstraints { make in
//            make.left.right.equalTo(self)
//            make.top.equalTo(imageView.snp_bottom).offset(cDefaultMargin)
//        }
        remindLab.snp.remakeConstraints { make in
            make.size.equalToSuperview()
        }
        remindSubLab.snp.makeConstraints { make in
            make.left.right.equalTo(self)
            make.top.equalTo(remindLab.snp_bottom).offset(cDefaultMargin)
        }
        refreshBtn.snp.makeConstraints { make in
            make.width.equalTo(cDefaultMargin * 13)
            make.height.equalTo(cDefaultMargin * 4)
            make.top.equalTo(remindSubLab.snp_bottom).offset(cDefaultMargin)
            make.centerX.equalToSuperview()
        }
    }

    @objc func fullRefresh() {
        let isConnected: Bool = isNetConnected()
        if !isConnected {
            cShowHUB(superView: nil, msg: "网络不给力")
        }
        if fullRefreshBloc != nil {
            fullRefreshBloc!(isConnected, emptyData)
        }
    }

    func addShimmeringView() {}

    func removeShimmeringView() {}
}

// MARK: - 上传提示框

/// 上传提示框
public class PQUploadRemindView: PQRemindView {
    public var canMoreOpration: Bool = false // 是否还有更多操作
    public var confirmTitle: String = "我知道了"
    public var cancelTitle: String = "取消"
    public var cacelColor: UIColor = UIColor.hexColor(hexadecimal: "#666666")
    public var attributedTitle: NSAttributedString?

    override public func addData() {
        titleLab.textAlignment = .center
        if attributedTitle != nil {
            titleLab.attributedText = attributedTitle
        } else {
            titleLab.text = remindData?.title
        }
        if remindData?.attributedTitle != nil {
            contentLab.attributedText = remindData?.attributedTitle
        } else {
            contentLab.text = remindData?.summary
        }
        cancelBtn.setTitleColor(cacelColor, for: .normal)
        confirmBtn.setTitleColor(UIColor.hexColor(hexadecimal: "#EE0051"), for: .normal)
        confirmBtn.setTitle(confirmTitle, for: .normal)
        cancelBtn.setTitle(cancelTitle, for: .normal)
        let ges = UITapGestureRecognizer(target: self, action: #selector(removeView))
        addGestureRecognizer(ges)
    }

    override public func addLayout() {
        let titleH: CGFloat = ((remindData?.title != nil && (remindData?.title?.count ?? 0) > 0) || attributedTitle != nil) ? cDefaultMargin * 2 : 0

        let summH: CGFloat = sizeTextFits(attributedText: remindData?.attributedTitle != nil ? remindData?.attributedTitle : NSMutableAttributedString(string: remindData?.summary ?? ""), text: nil, numberOfLines: 0, font: UIFont.systemFont(ofSize: 14), maxSize: CGSize(width: cScreenWidth - cDefaultMargin * 12, height: CGFloat.greatestFiniteMagnitude)).height + cDefaultMargin

        let contentH: CGFloat = (titleH == 0 ? 0 : cDefaultMargin * 3) + cDefaultMargin * 2 + summH + cDefaultMargin + cDefaultMargin * 5

        contentView.snp.makeConstraints { make in
            make.left.equalTo(self).offset(cDefaultMargin * 3)
            make.right.equalTo(self).offset(-cDefaultMargin * 3)
            make.height.equalTo(contentH)
            make.center.equalTo(self)
        }
        titleLab.snp.makeConstraints { make in
            make.left.equalTo(contentView).offset(cDefaultMargin * 2)
            make.right.equalTo(contentView).offset(-cDefaultMargin * 2)
            make.height.equalTo(titleH)
            make.top.equalTo(contentView).offset(titleH == 0 ? 0 : cDefaultMargin * 2)
        }
        contentLab.snp.makeConstraints { make in
            make.top.equalTo(titleLab.snp_bottom).offset(cDefaultMargin)
            make.left.right.equalTo(titleLab)
            make.height.equalTo(summH)
        }
        if canMoreOpration {
            let btnW: CGFloat = (cScreenWidth - 1 - cDefaultMargin * 8) / 2
            verticalLine.snp.makeConstraints { make in
                make.top.equalTo(contentLab.snp_bottom).offset(cDefaultMargin)
                make.height.equalTo(1)
                make.left.width.equalToSuperview()
            }
            cancelBtn.snp.makeConstraints { make in
                make.left.equalToSuperview()
                make.top.equalTo(verticalLine.snp_bottom)
                make.width.equalTo(btnW)
                make.bottom.equalTo(contentView)
            }
            horizonLine.snp.makeConstraints { make in
                make.left.equalTo(cancelBtn.snp_right)
                make.height.top.equalTo(cancelBtn)
                make.width.equalTo(1)
            }
            confirmBtn.snp.makeConstraints { make in
                make.right.equalToSuperview()
                make.height.width.bottom.equalTo(cancelBtn)
            }
        } else {
            verticalLine.snp.makeConstraints { make in
                make.top.equalTo(contentLab.snp_bottom).offset(cDefaultMargin)
                make.height.equalTo(1)
                make.left.width.equalToSuperview()
            }
            confirmBtn.snp.makeConstraints { make in
                make.right.left.equalTo(titleLab)
                make.top.equalTo(verticalLine.snp_bottom)
                make.bottom.equalTo(contentView)
            }
        }
    }

    @objc func removeView() {
        removeFromSuperview()
    }

    @objc public override func btnClck(sender: UIButton) {
        removeFromSuperview()
        if remindBlock != nil {
            remindBlock!(sender, remindData!)
        }
    }

    /// 快速生成
    /// - Parameters:
    ///   - title: <#title description#>
    ///   - summary: <#summary description#>
    ///   - confirmTitle: <#confirmTitle description#>
    ///   - remindHandle: <#remindHandle description#>
    /// - Returns: <#description#>
    class public func showUploadRemindView(title: String?, attributedTitle: NSAttributedString? = nil, summary: String, canMoreOpration: Bool = false, confirmTitle: String?, cancelTitle: String? = nil, cancelColor: UIColor? = nil, remindHandle: @escaping (_ sender: UIButton, _ baseModel: PQBaseModel?) -> Void) {
        if UIApplication.shared.keyWindow?.viewWithTag(cUploadViewRemindTag) != nil {
            UIApplication.shared.keyWindow?.viewWithTag(cUploadViewRemindTag)?.removeFromSuperview()
        }
        let remindData = PQBaseModel()
        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.lineSpacing = 3.0
        paragraphStyle.alignment = .center
        remindData.title = title
        remindData.attributedTitle = NSMutableAttributedString(string: summary, attributes: [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 14), NSAttributedString.Key.foregroundColor: UIColor.hexColor(hexadecimal: "#666666"), NSAttributedString.Key.paragraphStyle: paragraphStyle])
        let remindView = PQUploadRemindView(frame: CGRect(x: 0, y: 0, width: cScreenWidth, height: cScreenHeigth))
        remindView.canMoreOpration = canMoreOpration
        if confirmTitle != nil {
            remindView.confirmTitle = confirmTitle!
        }
        if cancelTitle != nil {
            remindView.cancelTitle = cancelTitle!
        }
        if cancelColor != nil {
            remindView.cacelColor = cancelColor!
        }
        if attributedTitle != nil {
            remindView.attributedTitle = attributedTitle
        }
        remindView.remindBlock = { sender, baseModel in
            remindHandle(sender, baseModel)
        }
        remindView.tag = cUploadViewRemindTag
        UIApplication.shared.keyWindow?.addSubview(remindView)
        remindView.remindData = remindData
    }
}
