//
//  CustomPickerControllers.swift
//  FunDoHealth
//
//  Created by ecell on 2018/7/16.
//  Copyright © 2020年 ecell. All rights reserved.
//

import UIKit

enum ImagePickerButtonType {
    /// 取消
    case cancelCamera
    /// 拍照
    case takePhoto
    /// 闪关灯
    case flashClick
    /// 前后摄像头
    case switchCameras
}

typealias ImagePickerSelectedBtnClosure = (ImagePickerButtonType) -> Void
class CustomPickerControllers: UIImagePickerController {
    
    // 记录闪关灯的开关
    var isFlash: Bool = false
    var isCanTakePhoto: Bool = false
    var isCancelPhoto: Bool = false
    weak var flashBtn: UIButton!
    weak var switchBtn: UIButton!
    weak var cancelBtn: UIButton!
    weak var takeBtn: UIButton!
    
    var selectedClosure: ImagePickerSelectedBtnClosure?

    override func viewDidLoad() {
        super.viewDidLoad()

        setupUI()
        bindUI()
    }
    
    func setupUI() {
        self.modalTransitionStyle = UIModalTransitionStyle.crossDissolve
        self.allowsEditing = false
        self.showsCameraControls = false
        self.isCanTakePhoto = true
        self.cameraDevice = UIImagePickerController.CameraDevice.rear
        self.cameraFlashMode = UIImagePickerController.CameraFlashMode.off
        
        // 自定义拍照界面 - 闪光灯 切换前后摄像头 取消 photograph_btn_icon
        var cammeraY: CGFloat = 44.0;
        if isIPhoneX {
            cammeraY = 84.0;
        }
        self.cameraViewTransform = CGAffineTransform.init(translationX: 0, y: cammeraY)
        // 创建闪关灯按钮
        let flashBtn = UIButton.init(type: UIButton.ButtonType.custom)
        flashBtn.frame = CGRect(x: 7, y: isIPhoneX ? 52:12, width: 34, height: 34)
        flashBtn.setImage(UIImage(named: "lamplight-close_icon"), for: .normal)
        view.addSubview(flashBtn)
        self.flashBtn = flashBtn
        
        // 创建switch_canera_icon按钮
        let switchBtn = UIButton.init(type: UIButton.ButtonType.custom)
        switchBtn.frame = CGRect(x: kScreenW - 10 - 34, y: isIPhoneX ? 52:12, width: 34, height: 34)
        switchBtn.setImage(UIImage(named: "switch_canera_icon"), for: .normal)
        view.addSubview(switchBtn)
        self.switchBtn = switchBtn
        
        var bottomSpacing = kScaleHeight(20.0)
        if isIPhone5 || isIPhone4 {
            bottomSpacing = kScaleHeight(8.0)
        }else if (isIPhoneX) {
            bottomSpacing = kScaleHeight(20+34)
        }
        
        // 创建取消按钮
        let cancelBtn = UIButton.init(type: UIButton.ButtonType.custom)
        cancelBtn.frame = CGRect(x: 8, y: kScreenH - 50 - bottomSpacing, width: 80, height: 50)
        cancelBtn.setTitle(MultiLanguageKey_FB.cancelFB.localized, for: .normal)
        view.addSubview(cancelBtn)
        self.cancelBtn = cancelBtn
        
        // 创建拍照
        let takeBtn = UIButton.init(type: UIButton.ButtonType.custom)
        takeBtn.frame = CGRect(x: kScreenW/2.0 - 32.5, y: kScreenH - 65 - bottomSpacing, width: 65, height: 65)
        takeBtn.setImage(UIImage(named: "photograph_btn_icon"), for: .normal)
        view.addSubview(takeBtn)
        self.takeBtn = takeBtn
        
        // 照片标签
        let photoLabel = UILabel.init(frame: CGRect(x: 0, y: takeBtn.mj_y - kScaleHeight(25.0), width: kScreenW, height: 17.0))
        photoLabel.textAlignment = .center
        photoLabel.font = SystemRegularFont(15)
        photoLabel.text = MultiLanguageKey_FB.photoFB.localized
        photoLabel.textColor = UIColor.yellow
        view.addSubview(photoLabel)
        
    }
    
    func bindUI() {
        /**
         切换闪光灯模式
         */
        self.flashBtn.rx.tap
        .asObservable().subscribe(onNext: { [weak self] _ in
            guard let `self` = self else { return }
            self.flashBtn.setImage(self.loopFlashState(), for: .normal)
            if let selectedClosure = self.selectedClosure {
                selectedClosure(ImagePickerButtonType.flashClick)
            }
        }).disposed(by: rx.disposeBag)
        /**
         切换前后摄像头
         */
        self.switchBtn.rx.tap.asObservable()
        .subscribe(onNext: { [weak self] _ in
            guard let `self` = self else { return }
            if self.cameraDevice == UIImagePickerController.CameraDevice.rear {
                self.cameraDevice = UIImagePickerController.CameraDevice.front
            }else {
                self.cameraDevice = UIImagePickerController.CameraDevice.rear
            }
            
            UIView.animate(withDuration: 0.5, animations: {
                self.cameraViewTransform = CGAffineTransform.init(scaleX: -1.0, y: 1.0)
            })
            
            if let selectedClosure = self.selectedClosure {
                selectedClosure(ImagePickerButtonType.switchCameras)
            }
        }).disposed(by: rx.disposeBag)
        
        /**
         关闭相机
         */
        self.cancelBtn.rx.tap.asObservable()
        .subscribe(onNext: { [weak self] _ in
            guard let `self` = self else { return }
            guard self.isCanTakePhoto else { return }
            self.isCancelPhoto = false
            if let selectedClosure = self.selectedClosure {
                selectedClosure(ImagePickerButtonType.cancelCamera)
            }
        })
            .disposed(by: rx.disposeBag)
        
        /**
         拍照
         */
        self.takeBtn.rx.tap.asObservable()
        .subscribe(onNext: { [weak self] _ in
            guard let `self` = self else { return }
            self.cancelAble()
            self.takePicture()
            if let selectedClosure = self.selectedClosure {
                selectedClosure(ImagePickerButtonType.takePhoto)
            }
        })
            .disposed(by: rx.disposeBag)
        
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        
        // 防止默认每次进去默认lamplight-close_icon的问题
        if isFlash {
            self.cameraFlashMode = UIImagePickerController.CameraFlashMode.on
        }
        self.isCancelPhoto = true
    }
    
    
    /// 拍照
    func selfTakePicture() {
        if isFlash {
            guard self.isCanTakePhoto else { return }
            self.isCanTakePhoto = false
            
            DispatchQueue.main.asyncAfter(deadline: .now() + 3.0) { [weak self] in
                guard let `self` = self else  { return }
                self.isCanTakePhoto = true
            }
        }
        
        if self.isCancelPhoto {
            self.takePicture()
        }
    }
}

extension CustomPickerControllers {
    
    /// 循环闪光灯状态切换
    ///
    /// - Returns: 闪关按钮图片
    func loopFlashState() -> UIImage {
        isFlash = !isFlash
        var imageStr: String = ""
        if isFlash {
            self.cameraFlashMode = UIImagePickerController.CameraFlashMode.on
            imageStr = "lamplight-open_icon"
        }else {
            self.cameraFlashMode = UIImagePickerController.CameraFlashMode.off
            imageStr = "lamplight-close_icon"
        }
        return UIImage(named: imageStr)!
    }
    
    //退出按钮1秒后可以点击
    func cancelAble() {
        var seconds: Double = 1.0
        if self.cameraFlashMode == UIImagePickerController.CameraFlashMode.on {
            seconds = 5.0
        }
        self.view.window?.isUserInteractionEnabled = false
        
        DispatchQueue.main.asyncAfter(deadline: .now() + seconds) { [weak self] in
            guard let `self` = self else { return }
            self.view.window?.isUserInteractionEnabled = true
        }
    }
}