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

import UIKit

fileprivate enum Resuable {
    static let stepCell = ReusableCell<HealthStepCell>()
    static let sleeoHeartRateCell = ReusableCell<HealthSleeoHeartRateCell>()
    static let temperatureCell = ReusableCell<TemperatureCell>()
}

class HealthViewController: TableViewController {

    lazy var navigationBar: HealthNavigationBar = {
        let navbar = HealthNavigationBar()
        navbar.gradient(colors: [kHexColor(0xFFF0DE), kHexColor(0xFFFFFF)], locations: nil, autoLaoutFrame: CGRect(x: 0, y: 0, width: kScreenW, height: kScaleWidth(90)))
        return navbar
    }()
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // 未设置用户信息
        guard let _ = UserDefaultsManager.getUserInfo() else {
            // 未设置用户信息
            navigator.show(segue: .guideUserInfo, sender: self, transition: .modal)
            return
        }
    }
    
    override func makeUI() {
        super.makeUI()
        tableView.tableHeaderView = UIView()
        tableView.register(Resuable.stepCell)
        tableView.register(Resuable.sleeoHeartRateCell)
        tableView.register(Resuable.temperatureCell)
        tableView.rx.setDelegate(self).disposed(by: rx.disposeBag)
        view.addSubview(navigationBar)
        layout()
    }
    
    func layout() {
        navigationBar.snp.makeConstraints { (make) in
            make.top.equalToSuperview()
            make.width.equalTo(kScreenW)
            make.height.equalTo(kBatteryH + 70)
        }
        tableView.snp.makeConstraints { (make) in
            make.top.equalTo(navigationBar.snp.bottom)
            make.left.right.bottom.equalToSuperview()
        }
    }
    
    override func bindViewModel() {
        guard let viewModel = viewModel as? HealthViewModel else { return }
        let rxDataSource = RxTableViewSectionedReloadDataSource<HealthSection>(configureCell: { [weak self]  (_ , tv, indexPath, model) -> UITableViewCell in
            switch model {
            case .stepItem(let viewModel):
                let cell = tv.dequeue(Resuable.stepCell, for: indexPath)
                cell.bind(model: viewModel)
                return cell
            case .sleepHeartItem(let viewModel):
                let cell = tv.dequeue(Resuable.sleeoHeartRateCell, for: indexPath)
                cell.bind(model: viewModel)
                cell.sleepBlockView.bgImgBtn.rx.tap
                    .subscribe(onNext: { _ in
                        self?.navigator.show(segue: .sleep(viewModel: SleepViewModel()), sender: self)
                    })
                    .disposed(by: cell.cellDisposeBag)
                cell.hearRateBlockView.bgImgBtn.rx.tap
                    .subscribe(onNext: { _ in
                        self?.navigator.show(segue: .heartRate(viewModel: HRViewModel()), sender: self)
                    })
                    .disposed(by: cell.cellDisposeBag)
                return cell
            case .temperatureIitem(let viewModel):
                let cell = tv.dequeue(Resuable.temperatureCell, for: indexPath)
                cell.bind(model: viewModel)
                cell.temperatureBlockView.bgImgBtn.rx.tap
                    .subscribe(onNext: { _ in
                        self?.navigator.show(segue: .temperature(viewModel: TemperatureViewModel()), sender: self)
                    })
                    .disposed(by: cell.cellDisposeBag)
                return cell
            default: return UITableViewCell()
            }
        })
        viewModel.userIcon
            .bind(to: navigationBar.headImg.rx.image)
            .disposed(by: rx.disposeBag)
        viewModel.userNickname
            .bind(to: navigationBar.nicknameLabel.rx.text)
            .disposed(by: rx.disposeBag)
        BluetoothService.shared.deviceConnectState
            .bind(to: navigationBar.statusBtn.rx.isSelected)
            .disposed(by: rx.disposeBag)
        BluetoothService.shared.powerState
            .bind(to: navigationBar.powerBtn.rx.image())
            .disposed(by: rx.disposeBag)
        viewModel.relay
            .bind(to: tableView.rx.items(dataSource: rxDataSource))
            .disposed(by: rx.disposeBag)
        // DFU设备升级
        viewModel.dfuDeviceUpgrate
            .subscribe(onNext: { [weak self] viewModel in
                guard let `self` = self else { return }
                if let currenVC = currentViewController(), currenVC.isKind(of: FirmwareUpdateViewController.self) {
                    return
                }
                currentTabbarController()?.selectedIndex = 0
                self.navigator.show(segue: .firmwareUpdate(viewModel: viewModel), sender: self)
            })
            .disposed(by: rx.disposeBag)
    }
    
    override func handleEvent() {
        navigationBar.rx.tap
            .subscribe(onNext: { [weak self] _ in
                let viewModel = UserInfoViewModel()
                self?.navigator.show(segue: .userInfo(viewModel: viewModel), sender: self)
            })
            .disposed(by: rx.disposeBag)
        tableView.rx.itemSelected
            .subscribe(onNext: { [weak self] (indexPath) in
                if indexPath.row == 0 {
                    let viewModel = StepViewModel()
                    self?.navigator.show(segue: .step(viewModel: viewModel), sender: self)
                }
            })
            .disposed(by: rx.disposeBag)
    }
    
}

extension HealthViewController: UITableViewDelegate {
    
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        if indexPath.row == 0 {
            return kScaleWidth(215)
        }
        return kScaleWidth(224)
    }
    
}