//
//  ExtensionsPreferencesViewController.swift
//  NetNewsWire
//
//  Created by Maurice Parker on 4/6/20.
//  Copyright © 2020 Ranchero Software. All rights reserved.
//

import AppKit

final class ExtensionPointPreferencesViewController: NSViewController {

	@IBOutlet weak var tableView: NSTableView!
	@IBOutlet weak var detailView: NSView!
	@IBOutlet weak var deleteButton: NSButton!
	
	private var activeExtensionPoints = [ExtensionPoint]()

	override func viewDidLoad() {
		super.viewDidLoad()

		tableView.delegate = self
		tableView.dataSource = self

		NotificationCenter.default.addObserver(self, selector: #selector(activeExtensionPointsDidChange(_:)), name: .ActiveExtensionPointsDidChange, object: nil)

		// Fix tableView frame — for some reason IB wants it 1pt wider than the clip view. This leads to unwanted horizontal scrolling.
		var rTable = tableView.frame
		rTable.size.width = tableView.superview!.frame.size.width
		tableView.frame = rTable
		
		showDefaultView()
	}
	
	@IBAction func enableExtensionPoints(_ sender: Any) {
		tableView.selectRowIndexes([], byExtendingSelection: false)
		showController(ExtensionPointAddViewController())
	}
	
	@IBAction func disableExtensionPoint(_ sender: Any) {
		guard tableView.selectedRow != -1 else {
			return
		}
		
		let extensionPoint = activeExtensionPoints[tableView.selectedRow]
		ExtensionPointManager.shared.deactivateExtensionPoint(extensionPoint.extensionPointID)

		showController(ExtensionPointAddViewController())
	}
}

// MARK: - NSTableViewDataSource

extension ExtensionPointPreferencesViewController: NSTableViewDataSource {

	func numberOfRows(in tableView: NSTableView) -> Int {
		return activeExtensionPoints.count
	}

	func tableView(_ tableView: NSTableView, objectValueFor tableColumn: NSTableColumn?, row: Int) -> Any? {
		return activeExtensionPoints[row]
	}
}

// MARK: - NSTableViewDelegate

extension ExtensionPointPreferencesViewController: NSTableViewDelegate {

	private static let cellIdentifier = NSUserInterfaceItemIdentifier(rawValue: "AccountCell")

	func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
		if let cell = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "Cell"), owner: nil) as? NSTableCellView {
			let extensionPoint = activeExtensionPoints[row]
			cell.textField?.stringValue = extensionPoint.title
			cell.imageView?.image = extensionPoint.templateImage
			return cell
		}
		return nil
	}

	func tableViewSelectionDidChange(_ notification: Notification) {
		
		let selectedRow = tableView.selectedRow
		if tableView.selectedRow == -1 {
			deleteButton.isEnabled = false
			return
		} else {
			deleteButton.isEnabled = true
		}

		let extensionPoint = activeExtensionPoints[selectedRow]
		let controller = ExtensionPointDetailViewController(extensionPoint: extensionPoint)
		showController(controller)
		
	}
	
}

// MARK: - Private

private extension ExtensionPointPreferencesViewController {
	
	@objc func activeExtensionPointsDidChange(_ note: Notification) {
		showDefaultView()
	}
	
	func showDefaultView() {
		activeExtensionPoints = Array(ExtensionPointManager.shared.activeExtensionPoints.values).sorted(by: { $0.title < $1.title })
		tableView.reloadData()
		showController(ExtensionPointAddViewController())
	}
	
	func showController(_ controller: NSViewController) {
		
		if let controller = children.first {
			children.removeAll()
			controller.view.removeFromSuperview()
		}
		
		addChild(controller)
		controller.view.translatesAutoresizingMaskIntoConstraints = false
		detailView.addSubview(controller.view)
		detailView.addFullSizeConstraints(forSubview: controller.view)
		
	}
	
}