//
//  AddContainerViewController.swift
//  NetNewsWire
//
//  Created by Maurice Parker on 4/16/19.
//  Copyright © 2019 Ranchero Software, LLC. All rights reserved.
//

import UIKit

protocol AddContainerViewControllerChild: UIViewController {
	var delegate: AddContainerViewControllerChildDelegate? {get set}
	func cancel()
	func add()
}

protocol AddContainerViewControllerChildDelegate: UIViewController {
	func readyToAdd(state: Bool)
	func processingDidBegin()
	func processingDidCancel()
	func processingDidEnd()
}

class AddContainerViewController: UIViewController {

	static let preferredContentSizeForFormSheetDisplay = CGSize(width: 460.0, height: 400.0)
	
	@IBOutlet weak var cancelButton: UIBarButtonItem!
	@IBOutlet weak var activityIndicatorView: UIActivityIndicatorView!
	@IBOutlet weak var addButton: UIBarButtonItem!
	@IBOutlet weak var typeSelectorSegmentedControl: UISegmentedControl!
	@IBOutlet weak var containerView: UIView!
	
	private var currentViewController: AddContainerViewControllerChild?
	
	var initialControllerType: AddControllerType?
	var initialFeed: String?
	var initialFeedName: String?
	
	override func viewDidLoad() {
		
        super.viewDidLoad()
		activityIndicatorView.color = UIColor.label
		activityIndicatorView.isHidden = true

		typeSelectorSegmentedControl.selectedSegmentIndex = initialControllerType?.rawValue ?? 0
		switch initialControllerType {
		case .feed:
			switchToFeed()
		case .folder:
			switchToFolder()
		default:
			assertionFailure()
		}
		
    }

	@IBAction func typeSelectorChanged(_ sender: UISegmentedControl) {
		switch sender.selectedSegmentIndex {
		case 0:
			switchToFeed()
		default:
			switchToFolder()
		}
	}
	
	@IBAction func cancel(_ sender: Any) {
		currentViewController?.cancel()
		dismiss(animated: true)
	}
	
	@IBAction func add(_ sender: Any) {
		currentViewController?.add()
	}
	
}

extension AddContainerViewController: AddContainerViewControllerChildDelegate {
	
	func readyToAdd(state: Bool) {
		addButton.isEnabled = state
	}
	
	func processingDidBegin() {
		addButton.isEnabled = false
		typeSelectorSegmentedControl.isEnabled = false
		activityIndicatorView.isHidden = false
		activityIndicatorView.startAnimating()
	}
	
	func processingDidCancel() {
		addButton.isEnabled = true
		typeSelectorSegmentedControl.isEnabled = true
		activityIndicatorView.isHidden = true
		activityIndicatorView.stopAnimating()
	}
	
	func processingDidEnd() {
		dismiss(animated: true)
	}

}

private extension AddContainerViewController {
	
	func switchToFeed() {
		
		guard !(currentViewController is AddFeedViewController) else {
			return
		}
		
		navigationItem.title = NSLocalizedString("Add Feed", comment: "Add Feed")
		resetUI()
		hideCurrentController()
		
		let addFeedController = UIStoryboard.add.instantiateController(ofType: AddFeedViewController.self)
		addFeedController.initialFeed = initialFeed
		addFeedController.initialFeedName = initialFeedName

		displayContentController(addFeedController)
		
	}
	
	func switchToFolder() {
		
		guard !(currentViewController is AddFolderViewController) else {
			return
		}
		
		navigationItem.title = NSLocalizedString("Add Folder", comment: "Add Folder")
		resetUI()
		hideCurrentController()
		displayContentController(UIStoryboard.add.instantiateController(ofType: AddFolderViewController.self))
		
	}
	
	func resetUI() {
		addButton.isEnabled = false
	}
	
	func displayContentController(_ controller: AddContainerViewControllerChild) {
		
		currentViewController = controller
		controller.delegate = self
		
		addChild(controller)
		
		containerView.addSubview(controller.view)
		controller.view.translatesAutoresizingMaskIntoConstraints = false
		controller.view.topAnchor.constraint(equalTo: containerView.topAnchor).isActive = true
		controller.view.bottomAnchor.constraint(equalTo: containerView.bottomAnchor).isActive = true
		controller.view.leadingAnchor.constraint(equalTo: containerView.leadingAnchor).isActive = true
		controller.view.trailingAnchor.constraint(equalTo: containerView.trailingAnchor).isActive = true
		
		controller.didMove(toParent: self)
		
	}
	
	func hideCurrentController() {
		guard let currentViewController = currentViewController else {
			return
		}
		currentViewController.willMove(toParent: nil)
		currentViewController.view.removeFromSuperview()
		currentViewController.removeFromParent()
	}
	
}