//
//  Toast.swift
//  PaiaiUIKit
//
//  Created by ffib on 2019/1/21.
//  Copyright © 2019 yb. All rights reserved.
//

import Foundation

private let globalInstance = Toast()

public class Toast {
    public enum ToastType {
        case text(String)
        case image(UIImage)
        case imageWithText(UIImage, String)
        case activityIndicator
    }
    
    public enum PresentationStyle {
        case center
        case custom(animator: ToastAnimator)
        
        var animator: ToastAnimator {
            switch self {
            case .center:
                return FadeToastAnimator()
            case let .custom(animator):
                return animator
            }
        }
    }
    
    public struct Config {
        public init() {}
        
        public var toastType: ToastType = .text("")
        public var presentationStyle: PresentationStyle = .center
        
        public static var `default`: Config {
            return Config()
        }
    }
    
    private var _toastView: ToastView?
    private var _config: Config = .default
    
    
}

/// MARK: - APIS
public extension Toast {
    func show(config: Config = .default, in view: UIView? = UIApplication.shared.keyWindow) {
        let toastView = ToastView(option: .default, type: config.toastType)
        view?.addSubview(toastView)
        self._toastView = toastView
        showAnimation()
    }
    
    func show(message: String, in view: UIView? = UIApplication.shared.keyWindow) {
        var config = Config()
        config.toastType = .text(message)
        show(config: config, in: view)
    }
    
    func hide() {
        hideAnimation()
    }
    
    private func showAnimation() {
        guard let _toastView = _toastView else { return }
        _config.presentationStyle.animator.toastIn(in: _toastView) {[weak self] _ in
            guard let `self` = self else { return }
            DispatchQueue.main.asyncAfter(deadline: .now() + 1, execute: {
                self.hide()
            })
        }
    }
    
    private func hideAnimation() {
        guard let _toastView = _toastView else { return }
        _config.presentationStyle.animator.toastOut(in: _toastView) {[weak self] (flag) in
            guard let `self` = self else { return }
            self._toastView?.removeFromSuperview()
        }
    }
}

/// MARK: - Static APIS
public extension Toast {
    static var share: Toast {
        return globalInstance
    }
    
    static func show(config: Config = .default, in view: UIView? = UIApplication.shared.keyWindow) {
        globalInstance.show(config: config, in: view)
    }
    
    static func show(message: String, in view: UIView? = UIApplication.shared.keyWindow) {
        globalInstance.show(message: message, in: view)
    }
    
    static func hide() {
        globalInstance.hide()
    }
}