//
//  ShareViewController.swift
//  NetNewsWire iOS Share Extension
//
//  Created by Maurice Parker on 9/8/19.
//  Copyright © 2019 Ranchero Software. All rights reserved.
//

import UIKit
import MobileCoreServices
import Account
import Social
import Tree
import UniformTypeIdentifiers

class ShareViewController: SLComposeServiceViewController, ShareFolderPickerControllerDelegate {
	
	private var url: URL?
	private var extensionContainers: ExtensionContainers?
	private var flattenedContainers: [ExtensionContainer]!
	private var selectedContainer: ExtensionContainer?
	private var folderItem: SLComposeSheetConfigurationItem!
	
	override func viewDidLoad() {
		
		extensionContainers = ExtensionContainersFile.read()
		flattenedContainers = extensionContainers?.flattened ?? [ExtensionContainer]()
		if let extensionContainers = extensionContainers {
			selectedContainer = ShareDefaultContainer.defaultContainer(containers: extensionContainers)
		}

		title = "NetNewsWire"
		placeholder = "Feed Name (Optional)"
		if let button = navigationController?.navigationBar.topItem?.rightBarButtonItem {
			button.title = "Add Feed"
			button.isEnabled = true
		}

		// Hack the bottom table rows to be smaller since the controller itself doesn't have enough sense to size itself correctly
		if let nav = self.children.first as? UINavigationController, let tableView = nav.children.first?.view.subviews.first as? UITableView {
			tableView.rowHeight = 38
		}

		var provider: NSItemProvider? = nil

		// Try to get any HTML that is maybe passed in
		for item in self.extensionContext!.inputItems as! [NSExtensionItem] {
			for itemProvider in item.attachments! {
				if itemProvider.hasItemConformingToTypeIdentifier(UTType.propertyList.identifier) {
					provider = itemProvider
				}
			}
		}

		if provider != nil  {
			provider!.loadItem(forTypeIdentifier: UTType.propertyList.identifier, options: nil, completionHandler: { [weak self] (pList, error) in
				if error != nil {
					return
				}
				guard let dataGraph = pList as? NSDictionary else {
					return
				}
				guard let results = dataGraph["NSExtensionJavaScriptPreprocessingResultsKey"] as? NSDictionary else {
					return
				}
				if let url = URL(string: results["url"] as! String) {
					self?.url = url
				}
			})
			return
		}

		// Try to get the URL if it is passed in
		for item in self.extensionContext!.inputItems as! [NSExtensionItem] {
			for itemProvider in item.attachments! {
				if itemProvider.hasItemConformingToTypeIdentifier(UTType.url.identifier) {
					provider = itemProvider
				}
			}
		}

		if provider != nil  {
			provider!.loadItem(forTypeIdentifier: UTType.url.identifier, options: nil, completionHandler: { [weak self] (urlCoded, error) in
				if error != nil {
					return
				}
				guard let url = urlCoded as? URL else {
					return
				}
				self?.url = url
				return
			})
		}
		
		// Reddit in particular doesn't pass the URL correctly and instead puts it in the contentText
		url = URL(string: contentText)
	}
	
	override func isContentValid() -> Bool {
		return url != nil && selectedContainer != nil
	}
	
	override func didSelectPost() {
		guard let url = url, let selectedContainer = selectedContainer, let containerID = selectedContainer.containerID else {
			self.extensionContext!.completeRequest(returningItems: [], completionHandler: nil)
			return
		}

		var name: String? = nil
		if !contentText.mayBeURL {
			name = contentText.isEmpty ? nil : contentText
		}
		
		let request = ExtensionFeedAddRequest(name: name, feedURL: url, destinationContainerID: containerID)
		ExtensionFeedAddRequestFile.save(request)
		
		self.extensionContext!.completeRequest(returningItems: [], completionHandler: nil)
	}
	
	func shareFolderPickerDidSelect(_ container: ExtensionContainer) {
		ShareDefaultContainer.saveDefaultContainer(container)
		self.selectedContainer = container
		updateFolderItemValue()
		self.popConfigurationViewController()
	}

	override func configurationItems() -> [Any]! {
		
		// To add configuration options via table cells at the bottom of the sheet, return an array of SLComposeSheetConfigurationItem here.
		guard let urlItem = SLComposeSheetConfigurationItem() else { return nil }
		urlItem.title = "URL"
		urlItem.value = url?.absoluteString ?? ""
		
		folderItem = SLComposeSheetConfigurationItem()
		folderItem.title = "Folder"
		updateFolderItemValue()
		
		folderItem.tapHandler = {
			
			let folderPickerController = ShareFolderPickerController()
			
			folderPickerController.navigationController?.title = NSLocalizedString("Folder", comment: "Folder")
			folderPickerController.delegate = self
			folderPickerController.containers = self.flattenedContainers
			folderPickerController.selectedContainerID = self.selectedContainer?.containerID
			
			self.pushConfigurationViewController(folderPickerController)
			
		}
		
		return [folderItem!, urlItem]
		
	}
	
}

private extension ShareViewController {
	
	func updateFolderItemValue() {
		if let account = selectedContainer as? ExtensionAccount {
			self.folderItem.value = account.name
		} else if let folder = selectedContainer as? ExtensionFolder {
			self.folderItem.value = "\(folder.accountName) / \(folder.name)"
		}
	}
	
}