import TinkLink
//import TinkMoneyManagerUI

@objc(ReactNativeTink)
class ReactNativeTink: UIViewController {
    
    @objc func connectAccount(_ clientId: String, redirectUri: String, authorizationCode: String, market: String, locale: String, resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) {
        DispatchQueue.main.async {
            print("I am in the function connect accounts")
            let marketUse = TinkLink.Market(code: market)
            let authCode: TinkLink.AuthorizationCode = TinkLink.AuthorizationCode(authorizationCode)
            let localeUse: Locale = Locale(identifier: locale)
            
            let configuration = Configuration(clientID: clientId, redirectURI: redirectUri, baseDomain: .eu)
            
            let controller = Tink.Transactions.connectAccountsForContinuousAccess(configuration: configuration, market: marketUse, locale: localeUse, authorizationCode: authCode, completion: { resut in
                switch resut {
                case .success(let credentialsId):
                    DispatchQueue.main.asyncAfter(deadline: .now()+3, execute: {
                        UIApplication.shared.windows.first?.rootViewController?.dismiss(animated: true)
                    })
                    return resolve(credentialsId.value)
                case .failure(let error):
                    print(String(describing: error.code))
                    DispatchQueue.main.asyncAfter(deadline: .now(), execute: {
                        UIApplication.shared.windows.first?.rootViewController?.dismiss(animated: true)
                    })
                    let tinkError: TinkLinkError = TinkLinkError(trackingID: error.trackingID, credentials: error.credentials, providerName: error.providerName, paymentRequestID: error.paymentRequestID, errorDescription: error.errorDescription)
                    
                    return reject("tink_failed", tinkError.convertToString, nil)
                }
            })
            UIApplication.shared.windows.first?.rootViewController?.present(controller, animated: true)
            
        }
    }
    
    @objc func updateConsent(_ clientId: String,
                             redirectUri: String,
                             authorizationCode: String,
                             credentialID: String,
                             resolver resolve: @escaping RCTPromiseResolveBlock,
                             rejecter reject: @escaping RCTPromiseRejectBlock
    ) {
        DispatchQueue.main.async {
            let configuration = Configuration(clientID: clientId, redirectURI: redirectUri, baseDomain: .eu)
            
            let viewController = Tink.Transactions.updateConsent(
                configuration: configuration,
                authorizationCode: AuthorizationCode(authorizationCode),
                credentialsID: Credentials.ID(credentialID)) { res in
                    switch res {
                    case .success(let credentialsID):
                        DispatchQueue.main.asyncAfter(deadline: .now()+3, execute: {
                            UIApplication.shared.windows.first?.rootViewController?.dismiss(animated: true)
                        })
                        resolve(credentialsID)
                    case .failure(let error):
                        DispatchQueue.main.asyncAfter(deadline: .now(), execute: {
                            UIApplication.shared.windows.first?.rootViewController?.dismiss(animated: true)
                        })
                        let tinkError: TinkLinkError = TinkLinkError(trackingID: error.trackingID, credentials: error.credentials, providerName: error.providerName, paymentRequestID: error.paymentRequestID, errorDescription: error.errorDescription, errorStatus: String(describing: error.code))
                    
                        return reject("tink_failed", tinkError.convertToString, nil)
                        // reject("renewCredentials failed", error.localizedDescription, nil)
                    }
                }
            
            UIApplication.shared.windows.first?.rootViewController?.present(viewController, animated: true)
        }
    }
    
    @objc func displayInsights(_ clientId: String,
                               accessToken: String,
                               userId: String,
                               idHint: String,
                               resolver resolve: @escaping RCTPromiseResolveBlock,
                               rejecter reject: @escaping RCTPromiseRejectBlock) {
        
//        DispatchQueue.main.async {
//            let insightDelegate = InsightDelegate(
//                clientId: clientId,
//                clientAccessToken: accessToken,
//                userId: userId,
//                idHint: idHint,
//                redirectUri: ""
//            )
            
//            let configuration = TinkMoneyManagerConfiguration(clientID: clientId)
//            Tink.configure(with: configuration)
//            Tink.shared.userSession = .accessToken(accessToken)
//            
//            let actionableInsightsViewController = ActionableInsightsViewController(delegate: insightDelegate)
//            let navigationController = UINavigationController(rootViewController: actionableInsightsViewController)
//            UIApplication.shared.windows.first?.rootViewController?.present(navigationController, animated: true)
//            resolve("Success")
//        }
    }
}
