//
//  KMUserInfoVCModel.swift
//  PDF Reader Pro
//
//  Created by wanjun on 2024/10/31.
//

import Foundation
import Combine

@objc enum memberEquityType : Int {
    case advancedSixMonthPlan = 0      // 高级版半年订阅
    case advancedYearMonthPlan      // 高级版年订阅
}

typealias UserInfoComplete = (_ success: Bool,_ msg: String,_ resDic:KMMemberCenterResult?) -> Void

@objcMembers
class KMUserInfoVCModel: ObservableObject {
    
    /**
     @abstract 刷新个人权益
     @param
     */
    func refreshUserInfo(networkAlert: Bool = true ,_ complete: @escaping UserInfoComplete) -> Void {
        if KMMemberCenterManager.manager.isConnectionAvailable() == false && networkAlert {
            let alert = NSAlert()
            alert.alertStyle = .critical
            alert.messageText = NSLocalizedString("Error Information", comment: "")
            alert.informativeText = NSLocalizedString("Please make sure your internet connection is available.", comment: "")
            alert.addButton(withTitle: NSLocalizedString("OK", comment: ""))
            alert.runModal()
            return
        }
        KMMemberCenterManager.manager.userInfo { success, result in
            guard let result = result else { return }
            let resultDict = result as KMMemberCenterResult
            let msg = resultDict.msg
            let code = resultDict.code

            if success {
                let userInfo = resultDict.userInfo
                guard let userInfo = resultDict.userInfo else { return }
                KMMemberInfo.shared.memberUserInfo(model: userInfo)
                complete(true, "",resultDict)
            } else {
                complete(false, "",resultDict)
                if(code == 304) {
                    KMMemberInfo.shared.clearMemberInfoCache()
                    KMMemberInfo.shared.isLogin = false
                    KMMemberInfo.shared.access_token = ""
                    NotificationCenter.default.post(name: NSNotification.Name(rawValue: "MemberCenterLogoutSuccess"), object: nil)

                }
            }
        }
    }
    
    /**
     @abstract 根据用户支持的平台返回外部视图需要的平台图片数组
     @param
     */
    func getPlatformsImages() -> [NSImage] {
        var images: [NSImage] = []
        for platform in userPlatforms() {
            if KMMemberInfo.shared.userScenarioType == .lite_type4 ||
                KMMemberInfo.shared.userScenarioType == .lite_type5 ||
                KMMemberInfo.shared.userScenarioType == .lite_type6 ||
                KMMemberInfo.shared.userScenarioType == .lite_type8 ||
                KMMemberInfo.shared.userScenarioType == .lite_type12 ||
                KMMemberInfo.shared.userScenarioType == .lite_type13 ||
                KMMemberInfo.shared.userScenarioType == .pro_type2 ||
                KMMemberInfo.shared.userScenarioType == .pro_type4 ||
                (KMMemberInfo.shared.userScenarioType == .lite_type9 &&
                 (KMMemberInfo.shared.vip_paymentModel == "2" && KMMemberInfo.shared.vip_levels != "1"))  ||
                (KMMemberInfo.shared.userScenarioType == .pro_type1 &&
                 (KMMemberInfo.shared.vip_paymentModel == "2" && KMMemberInfo.shared.vip_levels != "1"))  ||
                KMMemberInfo.shared.userScenarioType == .pro_type5 ||
                KMMemberInfo.shared.userScenarioType == .dmg_type5 ||
                KMMemberInfo.shared.userScenarioType == .dmg_type6 ||
                KMMemberInfo.shared.userScenarioType == .dmg_type7 ||
                KMMemberInfo.shared.userScenarioType == .dmg_type28 ||
                KMMemberInfo.shared.userScenarioType == .dmg_type29 ||
                KMMemberInfo.shared.userScenarioType == .dmg_type30 ||
                KMMemberInfo.shared.userScenarioType == .dmg_type43 ||
                KMMemberInfo.shared.userScenarioType == .dmg_type44 ||
                KMMemberInfo.shared.userScenarioType == .dmg_type45 ||
                KMMemberInfo.shared.userScenarioType == .dmg_type8 ||
                KMMemberInfo.shared.userScenarioType == .dmg_type9 ||
                KMMemberInfo.shared.userScenarioType == .dmg_type10 ||
                KMMemberInfo.shared.userScenarioType == .dmg_type12 ||
                KMMemberInfo.shared.userScenarioType == .dmg_type13 ||
                KMMemberInfo.shared.userScenarioType == .dmg_type14 ||
                KMMemberInfo.shared.userScenarioType == .dmg_type15 ||
                KMMemberInfo.shared.userScenarioType == .dmg_type16 ||
                KMMemberInfo.shared.userScenarioType == .dmg_type17 ||
                KMMemberInfo.shared.userScenarioType == .dmg_type20 ||
                KMMemberInfo.shared.userScenarioType == .dmg_type21 ||
                KMMemberInfo.shared.userScenarioType == .dmg_type23 ||
                KMMemberInfo.shared.userScenarioType == .dmg_type24 ||
                KMMemberInfo.shared.userScenarioType == .dmg_type25 ||
                KMMemberInfo.shared.userScenarioType == .dmg_type26 ||
                KMMemberInfo.shared.userScenarioType == .dmg_type27 ||
                KMMemberInfo.shared.userScenarioType == .dmg_type31 ||
                KMMemberInfo.shared.userScenarioType == .dmg_type32 ||
                KMMemberInfo.shared.userScenarioType == .dmg_type35 ||
                KMMemberInfo.shared.userScenarioType == .dmg_type36 ||
                KMMemberInfo.shared.userScenarioType == .dmg_type38 ||
                KMMemberInfo.shared.userScenarioType == .dmg_type39 ||
                KMMemberInfo.shared.userScenarioType == .dmg_type40 ||
                KMMemberInfo.shared.userScenarioType == .dmg_type41 ||
                KMMemberInfo.shared.userScenarioType == .dmg_type42 ||
                KMMemberInfo.shared.userScenarioType == .dmg_type46 ||
                KMMemberInfo.shared.userScenarioType == .dmg_type47 {
                if platform == "mac" {
                    images.append(NSImage(named: "MacOSPlatformImage2")!)
                } else if platform == "ios" {
                    images.append(NSImage(named: "iOSPlatformImage2")!)
                } else if platform == "windows" {
                    images.append(NSImage(named: "WindowsPlatformImage2")!)
                } else if platform == "android" {
                    images.append(NSImage(named: "AndroidPlatformImage2")!)
                }
            } else {
                if platform == "mac" {
                    images.append(NSImage(named: "MacOSPlatformImage3")!)
                } else if platform == "ios" {
                    images.append(NSImage(named: "iOSPlatformImage3")!)
                } else if platform == "windows" {
                    images.append(NSImage(named: "WindowsPlatformImage3")!)
                } else if platform == "android" {
                    images.append(NSImage(named: "AndroidPlatformImage3")!)
                }
            }
        }
        return images
    }
    
    /**
     @abstract 跳转官网用户中心;1、官网未登录,则跳转到登录页面;2、官网已登录,则跳转到官网-个人中心;
     */
    func skipAccountCenter() -> Void {
        var urlPath = ""
        if kTestMode == 1{
            urlPath = "http://test-pdf-pro.kdan.cn:3021/user-center/account-benefits"
        } else {
            urlPath = "https://pdfreaderpro.com/user-center/account-benefits"
        }
        NSWorkspace.shared.open(URL(string: urlPath)!)
    }
    
    /**
     @abstract 退出登录;
     */
    func signOutAction() -> Void {
        NotificationCenter.default.post(name: NSNotification.Name("CloseMenuNotification"), object: nil)
        
        DispatchQueue.main.asyncAfter(deadline: .now()+0.3) {
            KMMemberPromptWC.shared.showWindow(nil)
            KMMemberPromptWC.shared.window?.makeKeyAndOrderFront(nil)
            KMMemberPromptWC.shared.tipType = .logout
        }
    }
    
    /**
     @abstract 注销账户;
     */
    func closeAccountAction() -> Void {
        if KMMemberCenterManager.manager.isConnectionAvailable() == false {
            let alert = NSAlert()
            alert.alertStyle = .critical
            alert.messageText = NSLocalizedString("Error Information", comment: "")
            alert.informativeText = NSLocalizedString("Please make sure your internet connection is available.", comment: "")
            alert.addButton(withTitle: NSLocalizedString("OK", comment: ""))
            alert.runModal()
            return
        }
        if KMMemberInfo.shared.validFlag == "5" {
            // 撤销注销申请
            KMMemberCenterManager.manager.userRevokeCancel { success, result in
                guard let result = result else { return }
                let resultDict = result as KMMemberCenterResult
                let msg = resultDict.msg
                if success {
                    self.refreshUserInfo { success, msg,resdic  in
                        DispatchQueue.main.asyncAfter(deadline: .now()+0.3) {
                            KMMemberPromptWC.shared.showWindow(nil)
                            KMMemberPromptWC.shared.window?.makeKeyAndOrderFront(nil)
                            KMMemberPromptWC.shared.tipType = .cancelSignout
                        }
                    }
                } else {
                    print(msg as Any)
                    KMMemberCenterManager.showAlert(code: .init(rawValue: result.code), message: result.msg, callback: nil)
                }
            }
        } else {
            if (KMMemberInfo.shared.vip_payType == 1) ||
                (KMMemberInfo.shared.ai_payType == 1) {
                // 在续订中用户提示退订
                NotificationCenter.default.post(name: NSNotification.Name("CloseMenuNotification"), object: nil)
                DispatchQueue.main.asyncAfter(deadline: .now()+0.3) {
                    KMMemberPromptWC.shared.showWindow(nil)
                    KMMemberPromptWC.shared.window?.makeKeyAndOrderFront(nil)
                    KMMemberPromptWC.shared.tipType = .unsubscribe
                }
            } else {
                // 手动注销
                NotificationCenter.default.post(name: NSNotification.Name("CloseMenuNotification"), object: nil)
                DispatchQueue.main.asyncAfter(deadline: .now()+0.3) {
                    KMMemberPromptWC.shared.showWindow(nil)
                    KMMemberPromptWC.shared.window?.makeKeyAndOrderFront(nil)
                    KMMemberPromptWC.shared.tipType = .signout
                }
            }
        }
    }
    
    /**
     @abstract 展开个人中心;
     */
    func expandPersonalCenter() -> Void {
        NotificationCenter.default.post(name: NSNotification.Name(rawValue: "ExpandPersonalCenter"), object: nil)
    }
    
    /**
     @abstract 确认退出;
     */
    func confirmExitAction() -> Void {
        if KMMemberCenterManager.manager.isConnectionAvailable() == false {
            let alert = NSAlert()
            alert.alertStyle = .critical
            alert.messageText = NSLocalizedString("Error Information", comment: "")
            alert.informativeText = NSLocalizedString("Please make sure your internet connection is available.", comment: "")
            alert.addButton(withTitle: NSLocalizedString("OK", comment: ""))
            alert.runModal()
            return
        }

        KMMemberCenterManager.manager.userLogout { success, result in
            guard let result = result else { return }
            let resultDict = result as KMMemberCenterResult
            let msg = resultDict.msg
            if success {
                let islogout: Bool = resultDict.result!
                if islogout {
                    KMMemberInfo.shared.clearMemberInfoCache()
                    KMMemberInfo.shared.isLogin = false
                    KMMemberInfo.shared.access_token = ""
                    NotificationCenter.default.post(name: NSNotification.Name(rawValue: "MemberCenterLogoutSuccess"), object: nil)
                }
            } else {
                print(msg as Any)
                KMMemberCenterManager.showAlert(code: .init(rawValue: result.code), message: result.msg, callback: nil)
            }
        }
    }
    
    /**
     @abstract 注销账户 警告弹窗;
     */
    func closeAccountWarningWC() -> Void {
        KMCloseAccountWC.shared.showWindow(nil)
    }
    
    /**
     @abstract 删除我的账户 弹窗;
     */
    func deleteAccountWC() -> Void {
        KMCloseVerificationWC.shared.showWindow(nil)
    }
    
    /**
     @abstract 注销账户申请 弹窗;
     */
    func closeAccountApplyWC(code: String,callback: ((Bool?, KMMemberCenterResult?)->Void)?) -> Void {
        if KMMemberCenterManager.manager.isConnectionAvailable() == false {
            let alert = NSAlert()
            alert.alertStyle = .critical
            alert.messageText = NSLocalizedString("Error Information", comment: "")
            alert.informativeText = NSLocalizedString("Please make sure your internet connection is available.", comment: "")
            alert.addButton(withTitle: NSLocalizedString("OK", comment: ""))
            alert.runModal()
            
            callback?(false,nil)
            return
        }
        KMMemberCenterManager.manager.userLogOffForUser(code: code) { success, result in
            guard let result = result else { return }
            let resultDict = result as KMMemberCenterResult            
            callback?(success,resultDict)
        }
    }
    
    /**
     @abstract 跳转比较表;
     */
    func skipCompare(_ type: KMCompareTableType) -> Void {
        NotificationCenter.default.post(name: NSNotification.Name("CloseMenuNotification"), object: nil)
        
        KMProductCompareWC.shared.orientation = true
        KMProductCompareWC.shared.orientationType = type
        KMProductCompareWC.shared.showWindow(nil)
    }
    
    /**
     @abstract 购买全平台年订阅;
     */
    func buyFullPlatformSubscription(_ type: memberEquityType) -> Void {
        if KMMemberInfo.shared.isLogin && KMMemberInfo.shared.validFlag == "5" {
            KMMemberPromptWC.shared.showWindow(nil)
            KMMemberPromptWC.shared.tipType = .signouting
        } else {
            if type == .advancedSixMonthPlan {
                IAPProductsManager.default().makeSubProduct(IAPProductsManager.default().fourDevicesAllAccessPackNew6Months_lite, discount: IAPProductsManager.default().isCancelAutoRenew())
            } else if type == .advancedYearMonthPlan {
                IAPProductsManager.default().makeSubProduct(IAPProductsManager.default().fourDevicesAllAccessPackNew12months_lite, discount: IAPProductsManager.default().isCancelAutoRenew())
            }
        }
    }
    
    // MARK: Private Method
    
    /**
     @abstract 获取用户支持的最大设备数
     @param
     */
    private func maxDeviceNum() -> Int {
        return KMMemberInfo.shared.vip_maxDeviceNum
    }
    
    /**
     @abstract 用户支持的平台
     @param
     */
    private func userPlatforms() -> [String] {
        let platforms = KMMemberInfo.shared.vip_platforms
        let platformsArray = platforms
            .components(separatedBy: ",")
            .map { $0.trimmingCharacters(in: .whitespaces) }
        
        
        let containsMac = platforms.contains("mac")
        let containsiOS = platforms.contains("ios")
        let containsWin = platforms.contains("windows")
        let containsAn = platforms.contains("android")
        var newPlatforms:[String] = []
        if(containsMac == true){
            newPlatforms.append("mac")
        }
        
        if(containsWin == true){
            newPlatforms.append("windows")
        }
        
        if(containsiOS == true){
            newPlatforms.append("ios")
        }
        
        if(containsAn == true){
            newPlatforms.append("android")
        }
        return newPlatforms
    }

}