import ContentsquareModule

protocol _ErrorAnalysisModule {
    func setURLMaskingPatterns(_ patterns: [String])
    func triggerNativeCrash()
    func reportJavascriptError(_ error: NSDictionary,
                               resolver resolve: @escaping RCTPromiseResolveBlock,
                               rejecter reject: @escaping RCTPromiseRejectBlock)
}

@objc(ErrorAnalysisSDKInterface)
public class ErrorAnalysisSDKInterface: NSObject, _ErrorAnalysisModule {
    @objc
    var bridge: RCTBridge?
    
    private let errorAnalysisType: _ErrorAnalysis.Type
    
    @objc
    public convenience override init() {
        self.init(ErrorAnalysis.self)
    }
    
    @objc
    init(_ eaType: _ErrorAnalysis.Type) {
        self.errorAnalysisType = eaType
    }
    
    @objc
    func methodQueue() -> DispatchQueue {
        return bridge?.uiManager.methodQueue ?? DispatchQueue.main
    }
    
    @objc
    static func requiresMainQueueSetup() -> Bool {
        return false
    }
    
    @objc
    public func setURLMaskingPatterns(_ patterns: [String]) -> Void {
        errorAnalysisType.setURLMaskingPatterns(patterns)
    }
    
    @objc
    public func triggerNativeCrash() -> Void {
        fatalError("This is purposely triggered native crash")
    }
    
    @objc
    public func reportJavascriptError(_ error: NSDictionary,
                               resolver resolve: @escaping RCTPromiseResolveBlock,
                               rejecter reject: @escaping RCTPromiseRejectBlock) -> Void
    {
        let selectorSendReactNativeError = NSSelectorFromString("_sendReactNativeError::")
        
        guard Contentsquare.responds(to: selectorSendReactNativeError) else {
            reject("Failed to report javascript error to native module",
                   "ErrorAnalysisModule does not respond to \(selectorSendReactNativeError.description) selector", nil)
            return
        }
        
        let block: @convention(block) () -> Void = {
            resolve("Reported javascript error to native module")
        }
        _ = Contentsquare.perform(selectorSendReactNativeError, with: error, with: block)
    }
}
