//
//  MessageListViewController.swift
//  PaiAi
//
//  Created by mac on 16/5/13.
//  Copyright © 2016年 FFIB. All rights reserved.
//

import UIKit
import RxSwift
import RxCocoa
import RxDataSources
import PaiaiDataKit
import PaiaiUIKit
import PullToRefresh

protocol MessageViewControllerDelegate: class {
    func didSelect(item: MessageItem)
}

final class MessageListViewController: UIViewController {

    @IBOutlet var tableView: UITableView!
    
    var emptyView : UILabel = {
        let empty = UILabel(frame: CGRect(x: kScreenWidth / 2 - 50, y: 74, width: 50, height: 50))
        
        empty.isHidden = true
        empty.text = "当前没有任何消息"
        empty.textColor = UIColor.gray
        empty.font = UIFont.systemFont(ofSize: 14)
        
        empty.sizeToFit()
        
        return empty
    }()

    var viewModel: MessageListViewModel!
    var type: MessageType!
    
    fileprivate let disposeBag = DisposeBag()

    // MARK: view function
    override func viewDidLoad() {
        super.viewDidLoad()
        
        view.addSubview(emptyView)
        setup()
        binding()
        setNavigationBar()
    }
    
    private func setNavigationBar() {
        title = type.model.title
        setRightBarButtonItem(image: UIImage.Navigation.verticalPoints, action: #selector(clearMessage))
    }

    private func setup() {
        setupReloadControl()
        setupLoadingControl()
    }
    
    private func setupReloadControl() {
        tableView.addPullToRefresh(PullToRefresh()) {
            [unowned self] in
            self.viewModel.reload()
        }
        tableView.startRefreshing(at: .top)
    }
    
    private func setupLoadingControl() {
        tableView.addPullToRefresh(PullToRefresh(position: .bottom)) {
            [unowned self] in
            self.viewModel.preload()
        }
    }
    
// MARK: button function
    @objc func clearMessage() {
        let alert = ActionSheetController()
        
        alert.addAlertAction(AlertAction(title: "取消", style: .cancel))
        alert.addAlertAction(AlertAction(title: "清空消息", handler: { (item) in
            self.viewModel.removeAll()
        }))
        presentController(alert)
    }
}

fileprivate extension MessageListViewController {
    func observeMessage() {
        viewModel.showMessage
            .asDriver { _ in fatalError("Unexpected error from error messages observable.") }
            .drive(onNext: { message in
                Toast.show(message: message)
            })
            .disposed(by: disposeBag)
    }
}

fileprivate extension MessageListViewController {
    
    var dataSource: RxTableViewSectionedAnimatedDataSource<AnimatableSectionModel<Int, MessageListItem>> {
        return RxTableViewSectionedAnimatedDataSource<AnimatableSectionModel<Int, MessageListItem>>(configureCell: { (dataSource, tableView, indexPath, item) in
            switch self.type! {
            case .system:
                let cell = tableView.dequeueReusableCell(withIdentifier: "messageSystemCell", for: indexPath) as! MessageSystemCell
                cell.setInfo(item)
                return cell
            case .comment, .thumbup:
                let cell = tableView.dequeueReusableCell(withIdentifier: "messageCommentAndThumbupCell", for: indexPath) as! MessageCommentAndThumbupCell
                cell.setInfo(item)
                return cell
            }
        }, canEditRowAtIndexPath: { _, _ in true })
    }
    
    func binding() {
        observeMessage()
        bindViewModelToTableView()
        bindTableViewToViewModel()
        bindViewModelToRefreshing()
    }
    
    func bindViewModelToTableView() {
        viewModel.isEmpty
            .bind(to: emptyView.rx.isHidden)
            .disposed(by: disposeBag)

        viewModel.contents
            .bind(to: tableView.rx.items(dataSource: dataSource))
            .disposed(by: disposeBag)
        
    }
    
    func bindTableViewToViewModel() {
        tableView.rx.itemDeleted
            .asDriver()
            .drive(onNext: { [unowned self] in self.viewModel.remove(of: $0.row) })
            .disposed(by: disposeBag)

        tableView.rx.modelSelected(MessageListItem.self)
            .asDriver()
            .drive(onNext: { [unowned self] in self.viewModel.didSelect(item: $0) })
            .disposed(by: disposeBag)

        tableView.rx.willDisplayCell
            .asDriver()
            .drive(onNext: { [unowned self] in self.preload(indexPath: $0.indexPath) })
            .disposed(by: disposeBag)
    }
    
    func preload(indexPath: IndexPath) {
        guard indexPath.row == tableView.numberOfRows(inSection: 0) - 5 else { return }
        tableView.startRefreshing(at: .bottom)
    }
    
    func bindViewModelToRefreshing() {
        viewModel.isLoading
            .asDriver(onErrorJustReturn: true)
            .drive(onNext: {[weak self] flag in
                guard let `self` = self else { return }
                if flag {
                    self.tableView.endRefreshing(at: .top)
                } else {
                    self.tableView.endRefreshing(at: .bottom)
                }
            }).disposed(by: disposeBag)
        
        viewModel.hasMoreData
            .asDriver(onErrorJustReturn: true)
            .drive(onNext: {[weak self] flag in
                guard let `self` = self else { return }
                if flag {
                    if self.tableView.bottomPullToRefresh == nil {
                        self.setupLoadingControl()
                    }
                } else {
//                    self.tableViewt
                }
            }).disposed(by: disposeBag)
    }
}

extension MessageListViewController: NavigationBackViewController {}