//
//  MessageListViewModel.swift
//  PaiAi
//
//  Created by mac on 2016/10/19.
//  Copyright © 2016年 FFIB. All rights reserved.
//

import Foundation
import RxSwift
import RxCocoa
import RxDataSources

public protocol MessageListViewModelDelegate: class {
    func didSelect(item: MessageListItem)
}

public class MessageListViewModel {
    
    private let repository: MessageListRepository
    private var disposeBag = DisposeBag()
    private var page = 1
    
    private var _isLoading = PublishSubject<Bool>()
    private var _isEmpty = BehaviorRelay<Bool>(value: false)
    private var _hasMoreData = PublishSubject<Bool>()
    private var _showMessage = PublishSubject<String>()
    private var items = BehaviorRelay<[MessageListItem]>(value: [])
    
    public weak var delegate: MessageListViewModelDelegate?
    
    public var isEmpty: Observable<Bool> {
        return _isEmpty.asObservable()
    }
    
    public var hasMoreData: Observable<Bool> {
        return _hasMoreData.asObservable()
    }
    
    public var isLoading: Observable<Bool> {
        return _isLoading.asObserver()
    }
    
    public var showMessage: Observable<String> {
        return _showMessage.asObservable()
    }
    
    public var contents: Observable<[AnimatableSectionModel<Int, MessageListItem>]> {
        return items.map({ model in
            return [AnimatableSectionModel(model: 0, items: model)]
        })
    }
    
    public init(type: MessageType) {
        self.repository = MessageListRepository(type: type)
    }
    
    public func reload() {
        page = 1
        repository.load(page: page)
            .asDriver(onErrorJustReturn: NetworkArrayData<MessageListItem>.empty())
            .drive(onNext: {[weak self] (model) in
                guard let `self` = self else { return }
                self._hasMoreData.onNext(model.hasMore)
                self._isEmpty.accept(!model.data.isEmpty)
                
                self.items.accept(model.data)
                }, onDisposed: {[weak self] in
                    guard let `self` = self else { return }
                    self._isLoading.onNext(true)
            }).disposed(by: disposeBag)
    }
    
    public func preload() {
        page += 1
        
        repository.load(page: page)
            .asDriver(onErrorJustReturn: NetworkArrayData<MessageListItem>.empty())
            .drive(onNext: {[weak self] (model) in
                guard let `self` = self else { return }
                self._hasMoreData.onNext(model.hasMore)
                self.items.accept(self.items.value + model.data)
                }, onDisposed: {[weak self] in
                    guard let `self` = self else { return }
                    self._isLoading.onNext(false)
            }).disposed(by: disposeBag)
    }
    
    public func remove(of index: Int) {
        repository.remove(pk: items.value[index].pk)
            .subscribe(onCompleted: {[weak self] in
                guard let `self` = self else { return }
                var _items = self.items.value
                _items.remove(at: index)
                self.items.accept(_items)
                self._showMessage.onNext("删除成功")
            }) { (error) in
                guard let error = error as? InteractionError else {
                    return
                }
                self._showMessage.onNext(error.errMessage)
            }.disposed(by: disposeBag)
    }
    
    public func removeAll() {
        repository.removeAll()
            .subscribe(onCompleted: {[weak self] in
                guard let `self` = self else { return }
                self.items.accept([])
                self._showMessage.onNext("删除成功")
            }) { (error) in
                guard let error = error as? InteractionError else {
                    return
                }
                self._showMessage.onNext(error.errMessage)
            }.disposed(by: disposeBag)
    }
    
    public func didSelect(item: MessageListItem) {
        delegate?.didSelect(item: item)
    }
}