//
//  KCPCertViewController.swift
//  Example
//
//  Created by
//  Copyright © 2023 NHN COMMERCE Corp. All rights reserved.
//
    

import Foundation
import WebKit

class KCPCertViewController: UIViewController {
    lazy var wkWebView: WKWebView = {
        var view = WKWebView()
        view.backgroundColor = UIColor.clear
        
        return view
    }()
    
    var formData: String
    
    init(formData: String) {
        self.formData = formData
        super.init(nibName: nil, bundle: nil)
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    deinit {
        wkWebView.removeObserver(self, forKeyPath: #keyPath(WKWebView.title))
    }
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)

    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        setupView()
        loadFormData()
    }

    private func setupView() {
        self.title = "휴대폰 본인인증"
        self.view.backgroundColor = .white
        self.view.addSubview(wkWebView)
        wkWebView.navigationDelegate = self
        wkWebView.uiDelegate = self
        wkWebView.configuration.preferences.javaScriptCanOpenWindowsAutomatically = true
        wkWebView.addObserver(self, forKeyPath: #keyPath(WKWebView.title), options: .new, context: nil)
        
        wkWebView.translatesAutoresizingMaskIntoConstraints = false
        wkWebView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
        wkWebView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
        wkWebView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true
        wkWebView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor).isActive = true
        
    }
    
    // webview내 dom 생성이 완료되고 html <title>에 정보가 담기면 evaluateJavaScript를 시도함
    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        if keyPath == "title" {
            if let title = wkWebView.title, title == "KCPCert" {
                jsInjectScript()
            }
        }
    }
    
    private func loadFormData() {
        let htmlString = """
        <html><title>KCPCert</title>
        <body>\(self.formData)</body>
        </html>
        """
        wkWebView.loadHTMLString(htmlString, baseURL: Bundle.main.bundleURL)
    }
    
    // form submit evaluateJavaScript
    private func jsInjectScript() {
        let injectJavaScript: String = """
        document.getElementById("form_auth").submit();
        """
        var jsStr = injectJavaScript.trimmingCharacters(in: .whitespaces)
        jsStr = jsStr.trimmingCharacters(in: .whitespacesAndNewlines)
        jsStr = jsStr.trimmingCharacters(in: .newlines)
        wkWebView.evaluateJavaScript(jsStr, completionHandler: nil)
    }
    
    // URI 파싱
    private func parseReturnUrl(requestURL: URL) {
        if let urlComponent = URLComponents(url: requestURL, resolvingAgainstBaseURL: true) {
            let queryItems = urlComponent.queryItems
            if let key = queryItems?.first(where: { $0.name == "key" })?.value {
                print("key: \(key)")
            }
        }
    }
    
    
}

extension KCPCertViewController: WKNavigationDelegate, WKUIDelegate {

    @available(iOS 13.0, *)
    public func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, preferences: WKWebpagePreferences, decisionHandler: @escaping (WKNavigationActionPolicy, WKWebpagePreferences) -> Void) {
        var policy = WKNavigationActionPolicy.allow
        if let requestURL = navigationAction.request.url {
            if (requestURL.host == "itunes.apple.com" || requestURL.scheme == "tel" || requestURL.scheme == "sms" || requestURL.scheme == "mailto") && UIApplication.shared.canOpenURL(requestURL) {
                UIApplication.shared.open(requestURL, options: [:], completionHandler: nil)
                policy = .cancel
            } else if requestURL.scheme != "http" && requestURL.scheme != "https" {
  
                if requestURL.scheme == "file" {
                    policy = .allow
                } else {
                    if requestURL.scheme == "shopbyexample"  {
                        if let host = requestURL.host, host == "form" {
                            if let _ = requestURL.query as String? {
                                // URI 파싱 key값 추출
                                parseReturnUrl(requestURL: requestURL)
                            }
                            policy = .allow
                            decisionHandler(policy, preferences)
                            return
                        }
                    }
                    UIApplication.shared.open(requestURL, options: [:], completionHandler: nil)
                    policy = .cancel
                }
            }
        }
        decisionHandler(policy, preferences)
    }
    
    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        
    }
    // 새창 띄우기
    func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
        let createWebView = WKWebView(frame: self.wkWebView.frame, configuration: configuration)
        createWebView.navigationDelegate = self
        createWebView.uiDelegate = self
        self.view.addSubview(createWebView)
        return createWebView
    }
    

}


