import SwiftUI
import WebKit

struct WebView: UIViewRepresentable {
    let url: URL
    let blockNavigation: Bool

    func makeUIView(context: Context) -> WKWebView {
        let webView = WKWebView()
        webView.scrollView.contentInsetAdjustmentBehavior = .never 
        // Configurar el manejador de mensajes desde JavaScript
        let userContentController = webView.configuration.userContentController
        userContentController.add(context.coordinator, name: "navigate")

        webView.navigationDelegate = context.coordinator
        return webView
    }

    func updateUIView(_ uiView: WKWebView, context: Context) {
        if context.coordinator.shouldLoadURL(uiView.url, newURL: url) {
            let request = URLRequest(url: url)
            uiView.load(request)
        }
    }

    func makeCoordinator() -> Coordinator {
        Coordinator(self, blockNavigation: blockNavigation)
    }

    class Coordinator: NSObject, WKNavigationDelegate, WKScriptMessageHandler {
        var parent: WebView
        let blockNavigation: Bool

        init(_ parent: WebView, blockNavigation: Bool) {
            self.parent = parent
            self.blockNavigation = blockNavigation
        }

        // Verifica si una URL debe cargarse
        func shouldLoadURL(_ currentURL: URL?, newURL: URL) -> Bool {
            return currentURL != newURL
        }

        func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
            if navigationAction.navigationType == .linkActivated, let newURL = navigationAction.request.url {
                if blockNavigation {
                    // Bloquear navegación y enviar la URL al ContentView
                    DispatchQueue.main.async {
                        NotificationCenter.default.post(name: .navigateToURL, object: newURL)
                    }
                    decisionHandler(.cancel) // Bloquear la navegación
                } else {
                    decisionHandler(.allow) // Permitir navegación en la página animada
                }
            } else {
                decisionHandler(.allow) // Permitir otras navegaciones
            }
        }

        // Manejar mensajes desde JavaScript
        func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
            if message.name == "navigate", let targetURL = message.body as? String, let url = URL(string: targetURL) {
                DispatchQueue.main.async {
                    NotificationCenter.default.post(name: .navigateToURL, object: url)
                }
            }
        }
    }
}
