//
//  GuideUserInfoViewController.swift
//  Lookfit
//
//  Created by lemo. on 2020/3/11.
//  Copyright © 2020 Sheldon. All rights reserved.
//

import UIKit
import AVFoundation

class GuideUserInfoViewController: ViewController {

    @IBOutlet weak var headerBtn: UIButton!
    @IBOutlet weak var genderLabel: UILabel!
    @IBOutlet weak var maleBtn: UIButton!
    @IBOutlet weak var femaleBtn: UIButton!
    @IBOutlet weak var nickNameLabel: UILabel!
    @IBOutlet weak var nickNameTF: UITextField!
    @IBOutlet weak var heightLabel: UILabel!
    @IBOutlet weak var heightValueLabel: UILabel!
    @IBOutlet weak var weightLabel: UILabel!
    @IBOutlet weak var weightValueLabel: UILabel!
    @IBOutlet weak var birthdayLabel: UILabel!
    @IBOutlet weak var birthdayValueLabel: UILabel!
    @IBOutlet weak var saveBtn: UIButton!

    /// 默认生日
    lazy var birthdayValue: Int = {
        return DateClass.timeStrToTimestamp("1990-01-01", formatStr: "yyyy-MM-dd")
    }()
    /// 头像缓存
    var headerImage: Data?
    
    lazy var pickerView: PickerView = {
        let pickerView = PickerView()
        pickerView.currenValues = { [weak self] (value) in
            guard let `self` = self else { return }
            switch pickerView.type {
            case .height:
                self.heightValueLabel.text = "\(value) cm"
                
            case .weight:
                self.weightValueLabel.text = "\(value) kg"
                
            case .birthday:
                self.birthdayValue = value
                let dateStr = DateClass.timestampToStr(value, formatStr: "yyyy-MM-dd")
                self.birthdayValueLabel.text = dateStr
            
            default:
                break
            }
        }
        return pickerView
    }()
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    override func makeUI() {
        super.makeUI()
        // 按比例适配
        for subView in view.subviews {
            for constrain in subView.constraints {
                constrain.constant = kScaleWidth(constrain.constant)
            }
        }
        isTitleCenter = true
        navigationTitle = MultiLanguageKey.baseInfoFB.localized
        maleBtn.isEnabled = false
        maleBtn.setBackgroundImage(kHexColor(0xFFA11D).asImage(CGSize(width: kScaleWidth(60), height: kScaleWidth(24))), for: .disabled)
        maleBtn.setTitleColor(.white, for: .disabled)
        femaleBtn.setTitleColor(.white, for: .disabled)
        femaleBtn.setBackgroundImage(kHexColor(0xFFA11D).asImage(CGSize(width: kScaleWidth(60), height: kScaleWidth(24))), for: .disabled)
        nickNameTF.basePlaceholder(str: MultiLanguageKey.nicknameTipFB.localized)
        // 多语言
        genderLabel.text = MultiLanguageKey.genderFB.localized
        maleBtn.setTitle(MultiLanguageKey.maleFB.localized, for: .normal)
        femaleBtn.setTitle(MultiLanguageKey.femaleFB.localized, for: .normal)
        nickNameLabel.text = MultiLanguageKey.nicknameFB.localized
        heightLabel.text = MultiLanguageKey.heightFB.localized
        weightLabel.text = MultiLanguageKey.weightFB.localized
        birthdayLabel.text = MultiLanguageKey.birthdayFB.localized
        saveBtn.setTitle(MultiLanguageKey.saveFB.localized, for: .normal)
    }
    
    override func handleEvent() {
        headerBtn.rx.tap
            .subscribe(onNext: { [weak self] _ in
                guard let `self` = self else { return }
                self.setAvator()
            })
            .disposed(by: rx.disposeBag)
        Observable.of(maleBtn.rx.tap, femaleBtn.rx.tap)
            .merge()
            .subscribe(onNext: { [weak self] _ in
                guard let `self` = self else { return }
                self.maleBtn.isEnabled = !self.maleBtn.isEnabled
                self.femaleBtn.isEnabled = !self.femaleBtn.isEnabled
            })
            .disposed(by: rx.disposeBag)
        saveBtn.rx.tap
            .subscribe(onNext: { [weak self] _ in
                guard let `self` = self else { return }
                // 保存用户信息
                guard let nickname = self.nickNameTF.text, nickname != "" else {
                    SVProgressHUD.showInfo(withStatus: MultiLanguageKey.nicknameTipFB.localized)
                    return
                }
                let heightCM = Int(self.heightValueLabel.text?.components(separatedBy: " ").first ?? "170") ?? 170
                let weightKG = Int(self.weightValueLabel.text?.components(separatedBy: " ").first ?? "65") ?? 65
                let userInfo = UserInfo(nickname: nickname, avatar: self.headerImage, gender: self.maleBtn.isEnabled, heightCM: heightCM, weightKG: weightKG, birthday: self.birthdayValueLabel.text ?? "")
                UserDefaultsManager.saveUserInfo(userInfo: userInfo)
                kNotificationCenter.post(name: NSNotification.Name(UserInfoUpdateFireBoltt), object: nil)
                self.navigator.dismiss(sender: self)
            })
            .disposed(by: rx.disposeBag)
    }

    @IBAction func clickBtn(_ sender: UIButton) {
        switch sender.tag {
        case 0:
            let height = Int(heightValueLabel.text?.components(separatedBy: " ").first ?? "170") ?? 170
            pickerView.show(values: height, type: .height, view: view)
        case 1:
            let weight = Int(weightValueLabel.text?.components(separatedBy: " ").first ?? "65") ?? 65
            pickerView.show(values: weight, type: .weight, view: view)
        case 2:
            pickerView.show(values: birthdayValue, type: .birthday, view: view)
        default:
            break
        }
    }
    
}

extension GuideUserInfoViewController {
    func setAvator() {
        let alertC = UIAlertController.init(title: nil, message: nil, preferredStyle: .actionSheet)
        alertC.addAction(UIAlertAction.init(title: MultiLanguageKey.cancelFB.localized, style: UIAlertAction.Style.cancel, handler: nil))
        let camera = UIAlertAction.init(title: MultiLanguageKey.cameraFB.localized, style: UIAlertAction.Style.default, handler: {[weak self] (_) in
            guard let `self` = self else { return }

            let authStatus = AVCaptureDevice.authorizationStatus(for: AVMediaType.video)
            if authStatus == .denied || authStatus == .restricted {
                let alertVC = UIAlertController.init(title: MultiLanguageKey.tipFB.localized, message: MultiLanguageKey.carmaPowerFB.localized, preferredStyle: .alert)
                let goToAction = UIAlertAction.init(title: MultiLanguageKey.gotoFB.localized, style: .default) { (action) in
                    if let url = URL(string: UIApplication.openSettingsURLString) {
                        if UIApplication.shared.canOpenURL(url) {
                            UIApplication.shared.openURL(url)
                        }
                    }
                }
                let cancelAction = UIAlertAction(title: MultiLanguageKey.cancelFB.localized, style: .cancel, handler: nil)
                alertVC.addAction(goToAction)
                alertVC.addAction(cancelAction)
                self.present(alertVC, animated: true, completion: nil)
                return
            }
            self.cameraAction()
        })
        
        let gallery = UIAlertAction.init(title: MultiLanguageKey.photoSelectFB.localized, style: UIAlertAction.Style.default, handler: { [weak self](_) in
            guard let `self` = self else { return }
            self.galleryAction()
        })
        alertC.addAction(camera)
        alertC.addAction(gallery)
        self.present(alertC, animated: true, completion: nil)
    }
    
    func cameraAction() {
        UIImagePickerController.rx.createWithParent(self, animated: true) { (picker) in
            picker.allowsEditing = true
            picker.sourceType = .camera
            }
            .flatMap {
                $0.rx.didFinishPickingMediaWithInfo
            }
            .take(1)
            .map { info in
                return info[UIImagePickerController.InfoKey.editedImage.rawValue] as? UIImage
            }
            .subscribe(onNext: { [weak self](chooseImg) in
                guard let `self` = self, let chooseImg = chooseImg else { return }
                self.headerImage = chooseImg.jpegData(compressionQuality: 0.1)
                self.headerBtn.setImage(chooseImg, for: .normal)
            })
            .disposed(by: rx.disposeBag)
    }
    
    func galleryAction() {
        UIImagePickerController.rx.createWithParent(self, animated: true) { (picker) in
            picker.allowsEditing = true
            picker.sourceType = .photoLibrary
            }
            .flatMap {
                $0.rx.didFinishPickingMediaWithInfo
            }
            .take(1)
            .map { info in
                return info[UIImagePickerController.InfoKey.editedImage.rawValue]  as? UIImage
            }
            .subscribe(onNext: { [weak self](chooseImg) in
                guard let `self` = self, let chooseImg = chooseImg else { return }
                self.headerImage = chooseImg.jpegData(compressionQuality: 0.3)
                self.headerBtn.setImage(chooseImg, for: .normal)
            })
            .disposed(by: rx.disposeBag)
    }

}