//
//  RookDataSource.swift
//  Plugin
//
//  Created by Francisco Guerrero Escamilla on 04/07/24.
//  Copyright © 2024 Max Lynch. All rights reserved.
//

import Foundation
import RookSDK
import Capacitor

@objc public class RookDataSource: NSObject {

  private let dataSourceObjc: DataSourceManagerObjc = DataSourceManagerObjc()
  private let dataSource: DataSourcesManager = DataSourcesManager()

  @objc public func getDataSourcesAuthorized(call: CAPPluginCall) {
    Task {
      do {
        let userId: String? = call.getString("userId")
        let sources: [DataSourceStatus] = try await dataSource.getDataSourcesAuthorizedV2(userId: userId)
        call.resolve(["result" : mapAuthSources(sources)])
      } catch {
        call.reject(error.localizedDescription)
      }
    }
  }

  private func mapAuthSources(_ source: [DataSourceStatus]) -> [[String: Any]] {
    return source.map({
      ["source": $0.name,
       "status": $0.authorized,
       "imageUrl": $0.imageUrl.absoluteString]
    })
  }

  @objc public func getDataSourceAuthorizer(call: CAPPluginCall) {
    guard let source: String = call.getString("source") else {
      call.reject("missing source parameter")
      return
    }
    let userId: String? = call.getString("userId")
    let redirectURL: String? = call.getString("redirectUrl")
    dataSource.getDataSourceAuthorizer(userId: userId, dataSource: source, redirectUrl: redirectURL) { result in
      switch result {
      case .success(let sourceDetail):
        call.resolve(
          [
            "dataSource": sourceDetail.dataSource,
            "authorized": sourceDetail.authorized,
            "authorizationUrl": sourceDetail.authorizationUrl?.absoluteString ?? String()
          ]
        )
      case .failure(let error):
        call.reject(error.localizedDescription)
      }
    }
  }

  public func revokeDataSource(call: CAPPluginCall) {
    Task {
      guard let dataSourceString: String = call.getString("dataSource") else {
        return
      }
      let userId: String? = call.getString("userId")
      do {
        let result: Bool = try await dataSource.revokeDataSource(userId: userId, dataSource: dataSourceString)
        call.resolve(["result": result])
      } catch {
        call.reject(error.localizedDescription)
      }
    }
  }
}
