//
//  ArticleIconSchemeHandler.swift
//  NetNewsWire-iOS
//
//  Created by Maurice Parker on 1/27/20.
//  Copyright © 2020 Ranchero Software. All rights reserved.
//

import Foundation
import WebKit
@preconcurrency import Images

protocol ArticleIconSchemeHandlerDelegate: AnyObject {
	
	func iconImage(for articleID: String) -> IconImage?
}

final class ArticleIconSchemeHandler: NSObject, WKURLSchemeHandler {

	weak var delegate: ArticleIconSchemeHandlerDelegate?

	init(delegate: ArticleIconSchemeHandlerDelegate) {
		self.delegate = delegate
	}
	
	func webView(_ webView: WKWebView, start urlSchemeTask: WKURLSchemeTask) {

		guard let url = urlSchemeTask.request.url, let delegate else {
			urlSchemeTask.didFailWithError(URLError(.fileDoesNotExist))
			return
		}

		guard let components = URLComponents(url: url, resolvingAgainstBaseURL: false) else {
			return
		}
		let articleID = components.path
		guard let iconImage = delegate.iconImage(for: articleID) else {
			urlSchemeTask.didFailWithError(URLError(.fileDoesNotExist))
			return
		}

		Task { @MainActor in

			let iconView = IconView(frame: CGRect(x: 0, y: 0, width: 48, height: 48))
			iconView.iconImage = iconImage
			let renderedImage = iconView.asImage()

			guard let data = renderedImage.dataRepresentation() else {
				urlSchemeTask.didFailWithError(URLError(.fileDoesNotExist))
				return
			}
			
			let headerFields = ["Cache-Control": "no-cache"]
			if let response = HTTPURLResponse(url: url, statusCode: 200, httpVersion: nil, headerFields: headerFields) {
				urlSchemeTask.didReceive(response)
				urlSchemeTask.didReceive(data)
				urlSchemeTask.didFinish()
			}
		}
	}
	
	func webView(_ webView: WKWebView, stop urlSchemeTask: WKURLSchemeTask) {
		urlSchemeTask.didFailWithError(URLError(.unknown))
	}
}