//
//  SideViewController.swift
//  PaiAi
//
//  Created by ffib on 2018/12/12.
//  Copyright © 2018 yb. All rights reserved.
//

import UIKit

open class SideViewController: UIViewController {
    
    public var contentView: UIView?

    override open func viewDidLoad() {
        super.viewDidLoad()
        view.isUserInteractionEnabled = true
        view.backgroundColor = UIColor(red: 52 / 255, green: 52 / 255, blue: 52 / 255, alpha: 0.7)
        showSide()
    }
    
    func showSide() {
        scrollLeft()
        colorGradientAppear()
    }
    
    @objc func hideSide() {
        scrollRight()
        colorGradientDisappear()
    }
}

//animation
extension SideViewController {
    func scrollLeft() {
        let animation = CATransition()
        animation.duration = 0.2
        animation.delegate = self
        animation.type = .moveIn
        animation.subtype = .fromLeft
        
        contentView?.layer.add(animation, forKey: nil)
    }
    
    func scrollRight() {
        let fromPosition = contentView!.layer.position
        let toPosition = CGPoint(x: -contentView!.frame.width, y: contentView!.frame.height / 2)
        
        let animation = CABasicAnimation(keyPath: "position")
        animation.duration = 0.2
        animation.delegate = self
        animation.isRemovedOnCompletion = false
        animation.fillMode = .forwards
        animation.toValue = NSValue(cgPoint: toPosition)
        animation.fromValue = NSValue(cgPoint: fromPosition)
        
        contentView?.layer.add(animation, forKey: "hide")
    }
    
    func colorGradientAppear() {
        let animation = CABasicAnimation(keyPath: "backgroundColor")
        animation.duration = 0.2
        animation.isRemovedOnCompletion = false
        animation.toValue = UIColor(red: 52 / 255,
                                    green: 52 / 255,
                                    blue: 52 / 255,
                                    alpha: 0.7).cgColor
        animation.fromValue = UIColor(red: 52 / 255,
                                      green: 52 / 255,
                                      blue: 52 / 255,
                                      alpha: 0).cgColor
        
        view.layer.add(animation, forKey: nil)
    }
    
    func colorGradientDisappear() {
        let animation = CABasicAnimation(keyPath: "backgroundColor")
        animation.duration = 0.2
        animation.isRemovedOnCompletion = false
        animation.toValue = UIColor(red: 52 / 255,
                                    green: 52 / 255,
                                    blue: 52 / 255,
                                    alpha: 0).cgColor
        animation.fromValue = UIColor(red: 52 / 255,
                                      green: 52 / 255,
                                      blue: 52 / 255,
                                      alpha: 0.7).cgColor
        
        view.layer.add(animation, forKey: nil)
    }
}

extension SideViewController: CAAnimationDelegate {
    func animationDidStop(_ anim: CAAnimation, finished flag: Bool) {
        if anim == contentView?.layer.animation(forKey: "hide") {
            view.removeFromSuperview()
            removeFromParent()
            return
        }
        configurationGestures()
    }
}

//gesture
extension SideViewController {
    fileprivate func configurationGestures() {
        configurationTapGesture()
        configurationSwipeGesture()
    }
    
    fileprivate func configurationTapGesture() {
        let tap = UITapGestureRecognizer(target: self, action: #selector(hideSide))
        tap.delegate = self
        view.addGestureRecognizer(tap)
    }
    
    fileprivate func configurationSwipeGesture() {
        let swipe = UISwipeGestureRecognizer(target: self, action: #selector(hideSide))
        swipe.delegate = self
        swipe.direction = .left
        view.addGestureRecognizer(swipe)
    }
}

extension SideViewController: UIGestureRecognizerDelegate {
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
        if contentView?.frame.contains(touch.location(in: view)) ?? false { return false }
        return true
    }
}