//
//  DefaultLoaderPlugin.swift
//  Astro
//
//  Created by Jeremy Wiebe on 2015-05-21.
//  Copyright (c) 2015 Mobify Research & Development Inc. All rights reserved.
//

import Foundation

open class DefaultLoaderPlugin: Plugin, LoaderPlugin {
    @objc public let viewController = UIViewController()
    @objc let loader = UIActivityIndicatorView()
    private let animationDuration = 0.25

    public required init(address: MessageAddress, messageBus: MessageBus, pluginResolver: PluginResolver, options: JSONObject?) {
        super.init(address: address, messageBus: messageBus, pluginResolver: pluginResolver, options: options)

        viewController.view.addSubview(loader)
        viewController.view.backgroundColor = UIColor.white
        viewController.view.translatesAutoresizingMaskIntoConstraints = false

        loader.translatesAutoresizingMaskIntoConstraints = false
        loader.centerInSuperview()
        loader.sizeToFit()

        // we want a big activity spinner, so we'll take the WhiteLarge one, and then change its
        // color...
        loader.style = UIActivityIndicatorView.Style.whiteLarge
        loader.color = UIColor.gray
        loader.isHidden = false
        loader.startAnimating()

        self.addRpcMethodShim("setColor") { params, respond in
            ////////// This will be autogenerated at some point //////////
            if let color: String = MethodShimUtils.getArg(params, key: "color", respond: respond) {
                self.setColor(color, respond: respond)
            }
            /////////////////////////////////////////////////////////////
        }

        self.addRpcMethodShim("setBackgroundColor") { params, respond in
            ////////// This will be autogenerated at some point //////////
            if let color: String = MethodShimUtils.getArg(params, key: "color", respond: respond) {
                self.setBackgroundColor(color, respond: respond)
            }
            /////////////////////////////////////////////////////////////
        }
    }

    @objc public func show(animated: Bool, completion: ((Bool) -> Void)?) {
        UIView.animate(withDuration: animated ? self.animationDuration : 0, animations: { () -> Void in
            self.loader.alpha = 1.0
            self.viewController.view.alpha = 1.0
            }, completion: completion)
    }

    @objc public func hide(animated: Bool, completion: ((Bool) -> Void)?) {
        UIView.animate(withDuration: animated ? self.animationDuration : 0,
            animations: {
                self.loader.alpha = 0.0
            },
            completion: { _ in
                UIView.animate(withDuration: animated ? self.animationDuration : 0, animations: { () -> Void in
                    self.viewController.view.alpha = 0.0
                    }, completion: completion)
            }
        )
    }

    // @RpcMethod
    func setColor(_ color: String, respond: RPCMethodCallback) {
        if let loaderColor = UIColor(hex: color) {
            loader.color = loaderColor
        } else {
            respond(.error("Invalid hex color provided: '\(color)'."))
        }
    }

    // @RpcMethod
    func setBackgroundColor(_ color: String, respond: RPCMethodCallback) {
        if let backgroundColor = UIColor(hex: color) {
            viewController.view.backgroundColor = backgroundColor
        } else {
            respond(.error("Invalid hex color provided: '\(color)'."))
        }
    }
}
