import ExpoModulesCore
import SwiftUI
import SmileID

// SmartSelfie Enrollment View using ExpoView
final class SmileIDSmartSelfieEnrollmentView: ExpoView {
    let onResult = EventDispatcher()
    let onError = EventDispatcher()
    private let delegate: SmartSelfieDelegate
    private let hostingController: UIHostingController<SmartSelfieEnrollmentView>
    private var config: SmartSelfieParams?

    required init(appContext: AppContext? = nil) {
        delegate = SmartSelfieDelegate()
        hostingController = UIHostingController(
            rootView: SmartSelfieEnrollmentView(
                delegate: delegate,
                config: nil
            )
        )
        // Force light mode
        hostingController.overrideUserInterfaceStyle = .light

        super.init(appContext: appContext)
        
        // Set up delegate callbacks
        delegate.onResult = { [weak self] result in
            self?.onResult(result)
        }
        
        delegate.onError = { [weak self] error in
            self?.onError(["error": error.localizedDescription])
        }
        
        // Add the hosting controller's view
        addSubview(hostingController.view)
        hostingController.view.fillSuperview()
    }
    
    func updateConfig(_ config: SmartSelfieParams) {
        self.config = config
        hostingController.rootView = SmartSelfieEnrollmentView(
            delegate: delegate,
            config: config
        )
    }
}

// SwiftUI view that wraps the SmileID SmartSelfie enrollment screen
struct SmartSelfieEnrollmentView: View {
    let delegate: SmartSelfieDelegate
    let config: SmartSelfieParams?
    
    var body: some View {
        if let config = config {
            SmileID.smartSelfieEnrollmentScreen(
                userId: config.userId ?? generateUserId(),
                jobId: config.jobId ?? generateJobId(),
                allowNewEnroll: config.allowNewEnroll,
                allowAgentMode: config.allowAgentMode,
                showAttribution: config.showAttribution,
                showInstructions: config.showInstructions,
                smileSensitivity: SmileSensitivity(from: config.smileSensitivity),
                skipApiSubmission: config.skipApiSubmission,
                extraPartnerParams: config.extraPartnerParams,
                delegate: delegate
            )
        } else {
            Text("Configuration not provided")
                           .foregroundColor(.red)
        }
    }
}

// Delegate class for SmartSelfie enrollment
class SmartSelfieDelegate: SmartSelfieResultDelegate {
    var onResult: (([String: Any]) -> Void)?
    var onError: ((Error) -> Void)?
    
    func didSucceed(
        selfieImage: URL,
        livenessImages: [URL],
        apiResponse: SmartSelfieResponse?
    ) {
        let result: [String: Any] = [
            "selfie": selfieImage.absoluteString,
            "livenessImages": livenessImages.map { $0.absoluteString }
        ]
        onResult?(result)
    }

    
    func didError(error: Error) {
        onError?(error)
    }
}
