//
//  SendToMicroBlogCommand.swift
//  NetNewsWire
//
//  Created by Brent Simmons on 1/8/18.
//  Copyright © 2018 Ranchero Software. All rights reserved.
//

import AppKit
import Articles
import RSCore

// Not undoable.

final class SendToMicroBlogCommand: ExtensionPoint, SendToCommand {

	static var isSinglton = true
	static var isDeveloperBuildRestricted = false
	static var title: String =  NSLocalizedString("Micro.blog", comment: "Micro.blog")
	static var image = AppAssets.extensionPointMicroblog
	static var description: NSAttributedString = {
		let attrString = SendToMicroBlogCommand.makeAttrString("This extension enables share menu functionality to send selected article text to Micro.blog. You need the Micro.blog application for this to work.")
		let range = NSRange(location: 81, length: 10)
		attrString.beginEditing()
		attrString.addAttribute(NSAttributedString.Key.link, value: "https://micro.blog", range: range)
		attrString.addAttribute(NSAttributedString.Key.foregroundColor, value: NSColor.systemBlue, range: range)
		attrString.endEditing()
		return attrString

	}()

	let extensionPointID = ExtensionPointIdentifer.microblog
	
	var title: String {
		return extensionPointID.extensionPointType.title
	}
	
	var image: NSImage? {
		return microBlogApp.icon
	}

	private let microBlogApp = UserApp(bundleID: "blog.micro.mac")

	func canSendObject(_ object: Any?, selectedText: String?) -> Bool {

		microBlogApp.updateStatus()
		guard microBlogApp.existsOnDisk, let article = (object as? ArticlePasteboardWriter)?.article, let _ = article.preferredLink else {
			return false
		}

		return true
	}
	
	func sendObject(_ object: Any?, selectedText: String?) {

		guard canSendObject(object, selectedText: selectedText) else {
			return
		}
		guard let article = (object as? ArticlePasteboardWriter)?.article else {
			return
		}
		guard microBlogApp.launchIfNeeded(), microBlogApp.bringToFront() else {
			return
		}

		// TODO: get text from contentHTML or contentText if no title and no selectedText.
		// TODO: consider selectedText.

		let s = article.attributionString + article.linkString

		let urlQueryDictionary = ["text": s]
		guard let urlQueryString = urlQueryDictionary.urlQueryString else {
			return
		}
		guard let url = URL(string: "microblog://post?" + urlQueryString) else {
			return
		}

		NSWorkspace.shared.open(url)
	}
}

private extension Article {

	var attributionString: String {

		// Feed name, or feed name + author name (if author is specified per-article).
		// Includes trailing space.

		if let feedName = webFeed?.nameForDisplay, let authorName = authors?.first?.name {
			return feedName + ", " + authorName + ": "
		}
		if let feedName = webFeed?.nameForDisplay {
			return feedName + ": "
		}
		return ""
	}

	var linkString: String {

		// Title + link or just title (if no link) or just link if no title

		if let title = title, let link = preferredLink {
			return "[" + title + "](" + link + ")"
		}
		if let preferredLink = preferredLink {
			return preferredLink
		}
		if let title = title {
			return title
		}
		return ""
	}

}