import Foundation
import Capacitor
import UIKit

@objc(AiffWebViewPlugin)
public class AiffWebViewPlugin: CAPPlugin {
    
    private var webViewController: WKWebViewController?
    private var currentCall: CAPPluginCall?
    
    // MARK: - Plugin Methods
    
    @objc func openWebView(_ call: CAPPluginCall) {
        guard let urlString = call.getString("url") else {
            call.reject("URL is required")
            return
        }
        
        guard let url = URL(string: urlString) else {
            call.reject("Invalid URL format")
            return
        }
        
        let options = parseOptions(from: call)
        let source = WKWebSource.remote(url)
        
        DispatchQueue.main.async {
            self.presentWebView(source: source, options: options, call: call)
        }
    }
    
    @objc func openFile(_ call: CAPPluginCall) {
        guard let filePath = call.getString("path") else {
            call.reject("File path is required")
            return
        }
        
        let options = parseOptions(from: call)
        let fileURL = URL(fileURLWithPath: filePath)
        let source = WKWebSource.file(fileURL, access: fileURL.deletingLastPathComponent())
        
        DispatchQueue.main.async {
            self.presentWebView(source: source, options: options, call: call)
        }
    }
    
    @objc func openHTML(_ call: CAPPluginCall) {
        guard let html = call.getString("html") else {
            call.reject("HTML content is required")
            return
        }
        
        let options = parseOptions(from: call)
        let baseURL = call.getString("baseURL").flatMap { URL(string: $0) }
        let source = WKWebSource.string(html, base: baseURL)
        
        DispatchQueue.main.async {
            self.presentWebView(source: source, options: options, call: call)
        }
    }
    
    @objc func closeWebView(_ call: CAPPluginCall) {
        DispatchQueue.main.async {
            self.webViewController?.dismiss(animated: true) {
                call.resolve()
            }
        }
    }
    
    @objc func executeScript(_ call: CAPPluginCall) {
        guard let code = call.getString("code") else {
            call.reject("Script code is required")
            return
        }
        
        DispatchQueue.main.async {
            self.webViewController?.executeScript(code)
            call.resolve()
        }
    }
    
    @objc func postMessage(_ call: CAPPluginCall) {
        guard let data = call.getObject("data") else {
            call.reject("Message data is required")
            return
        }
        
        DispatchQueue.main.async {
            self.webViewController?.postMessageToJS(data)
            call.resolve()
        }
    }
    
    @objc func setUrl(_ call: CAPPluginCall) {
        guard let urlString = call.getString("url") else {
            call.reject("URL is required")
            return
        }
        
        DispatchQueue.main.async {
            self.webViewController?.setURL(urlString)
            call.resolve()
        }
    }
    
    @objc func reload(_ call: CAPPluginCall) {
        DispatchQueue.main.async {
            self.webViewController?.reload()
            call.resolve()
        }
    }
    
    // MARK: - Private Methods
    
    private func parseOptions(from call: CAPPluginCall) -> WebViewOptions {
        var options = WebViewOptions()
        
        options.title = call.getString("title") ?? options.title
        options.toolbarType = parseToolbarType(call.getString("toolbarType"))
        options.showReloadButton = call.getBool("showReloadButton") ?? options.showReloadButton
        options.closeModal = call.getBool("closeModal") ?? options.closeModal
        options.closeModalTitle = call.getString("closeModalTitle") ?? options.closeModalTitle
        options.closeModalDescription = call.getString("closeModalDescription") ?? options.closeModalDescription
        options.closeModalOk = call.getString("closeModalOk") ?? options.closeModalOk
        options.closeModalCancel = call.getString("closeModalCancel") ?? options.closeModalCancel
        options.toolbarColor = call.getString("toolbarColor") ?? options.toolbarColor
        options.visibleTitle = call.getBool("visibleTitle") ?? options.visibleTitle
        options.showArrow = call.getBool("showArrow") ?? options.showArrow
        options.isAnimated = call.getBool("isAnimated") ?? options.isAnimated
        options.isInspectable = call.getBool("isInspectable") ?? options.isInspectable
        options.isPresentAfterPageLoad = call.getBool("isPresentAfterPageLoad") ?? options.isPresentAfterPageLoad
        options.ignoreUntrustedSSLError = call.getBool("ignoreUntrustedSSLError") ?? options.ignoreUntrustedSSLError
        options.preShowScript = call.getString("preShowScript")
        
        if let headers = call.getObject("headers") as? [String: String] {
            options.headers = headers
        }
        
        if let credentials = call.getObject("credentials") {
            if let username = credentials["username"] as? String,
               let password = credentials["password"] as? String {
                options.credentials = Credentials(username: username, password: password)
            }
        }
        
        return options
    }
    
    private func parseToolbarType(_ typeString: String?) -> ToolbarType {
        guard let typeString = typeString else { return .default }
        return ToolbarType(rawValue: typeString) ?? .default
    }
    
    private func presentWebView(source: WKWebSource, options: WebViewOptions, call: CAPPluginCall) {
        guard let viewController = bridge?.viewController else {
            call.reject("No view controller available")
            return
        }
        
        webViewController = WKWebViewController(source: source, options: options)
        
        // 设置回调
        webViewController?.onUrlChange = { [weak self] url in
            self?.notifyListeners("urlChange", data: ["url": url])
        }
        
        webViewController?.onClose = { [weak self] url in
            self?.notifyListeners("close", data: ["url": url])
            self?.webViewController = nil
        }
        
        webViewController?.onPageLoaded = { [weak self] in
            self?.notifyListeners("pageLoaded", data: [:])
        }
        
        webViewController?.onPageLoadError = { [weak self] in
            self?.notifyListeners("pageLoadError", data: [:])
        }
        
        webViewController?.onMessage = { [weak self] message in
            self?.notifyListeners("message", data: ["message": message])
        }
        
        // 设置模态呈现样式
        webViewController?.modalPresentationStyle = .fullScreen
        if #available(iOS 15.0, *) {
            if let sheet = webViewController?.sheetPresentationController {
                sheet.detents = [.large()]
                sheet.prefersGrabberVisible = false
            }
        }
        
        viewController.present(webViewController!, animated: options.isAnimated) {
            call.resolve(["success": true])
        }
    }
    
    // MARK: - Plugin Registration
    
    override public func load() {
        super.load()
        
        // 注册插件方法
        bridge?.register(plugin: self)
    }
}