//
//  RNGizUserManagerModule.swift
//  RNGizUserManagerModule
//
//  Copyright © 2022 Gizwits. All rights reserved.
//

import Foundation
import React
import GizwitsiOSSDK

struct UpdateAuthorizeDataParams: Decodable {
    public var token: String;
    public var uid: String;
}

struct AccountParams: Decodable {
    public var username: String;
    public var password: String;
}


@objc(RNGizUserManagerModule)
class RNGizUserManagerModule: RCTEventEmitter  {
    
    override func supportedEvents() -> [String]! {
        return []
    }
    
    @objc
    public func logout(_ options: NSDictionary, result: @escaping RCTResponseSenderBlock) {
        Task {
            let data = await GizUserManager.sharedInstance.logout()
            GizRNCallbackManager.callbackWithResult(callback: result, result: data)
        }
    }
    @objc
    public func updateAuthorizeData(_ options: NSDictionary, result: @escaping RCTResponseSenderBlock) {
        if let tokenInfo = RNGizParamsChecker.check(options: options, result: result, paramsType: UpdateAuthorizeDataParams.self) {
            GizUserManager.sharedInstance.updateAuthorizeData(token: tokenInfo.token, uid: tokenInfo.uid)
            GizRNCallbackManager.callbackWithResult(callback: result, result: GizResult<Int?, GizAPIException?>())
        }
    }
    @objc
    public func getAuthorizeData(_ options: NSDictionary, result: @escaping RCTResponseSenderBlock) {
        let authData = [
            "token": GizUserManager.sharedInstance.token ?? "",
            "uid": GizUserManager.sharedInstance.uid ?? "",
        ] as [String : String]
        let data = GizResult<[String : String], GizAPIException?>(data: authData, success: true)
        GizRNCallbackManager.callbackWithResult(callback: result, result: data)
    }
    @objc
    public func loginByAnonymous(_ options: NSDictionary, result: @escaping RCTResponseSenderBlock) {
        Task{
            let data = await GizUserManager.sharedInstance.loginByAnonymous()
            GizRNCallbackManager.callbackWithResult(callback: result, result: data)
        }
    }
    @objc
    public func registerWithAccount(_ options: NSDictionary, result: @escaping RCTResponseSenderBlock) {
        if let userinfo = RNGizParamsChecker.check(options: options, result: result, paramsType: AccountParams.self) {
            Task {
                let data = await GizUserManager.sharedInstance.registerWithAccount(username: userinfo.username, password: userinfo.password)
                GizRNCallbackManager.callbackWithResult(callback: result, result: data)
            }
        }
    }
    @objc
    public func loginWithAccount(_ options: NSDictionary, result: @escaping RCTResponseSenderBlock) {
        if let userinfo = RNGizParamsChecker.check(options: options, result: result, paramsType: AccountParams.self) {
            Task {
                let data = await GizUserManager.sharedInstance.loginWithAccount(username: userinfo.username, password: userinfo.password)
                GizRNCallbackManager.callbackWithResult(callback: result, result: data)
            }
        }
    }


    @objc
    override static func requiresMainQueueSetup() -> Bool {
        return true
    }
}
