//
//  HomeViewModel.swift
//  PaiAi
//
//  Created by zhengjianfei on 2016/12/29.
//  Copyright © 2016年 FFIB. All rights reserved.
//

import Foundation
import RxSwift
import RxCocoa
import RxDataSources

public protocol HomeViewModelDelegate: class {
    func scanQR()
    func createGroup()
    func didSelect(_ items: [PhotoItem], currIndex: Int)
}

public class HomeViewModel {
    
    private var page: Int = 1
    private let disposeBag = DisposeBag()
    
    private var repository: HomeRepository
    
    private var _isLoading = PublishSubject<Bool>()
    private var _hasMoreData = BehaviorRelay<Bool>(value: true)
    private let items = BehaviorRelay<[PhotoItem]>(value: [])
    
    public var scanBtnTapped = PublishSubject<Void>()
    public var createBtnTapped = PublishSubject<Void>()
    
    
    public var isLoading: Observable<Bool> {
        return _isLoading.asObservable()
    }
    
    public var hasMoreData: Observable<Bool> {
        return _hasMoreData.asObservable()
    }
    
    public var contents: Observable<[AnimatableSectionModel<Int, PhotoItem>]> {
        return items.map({ model in
            return [AnimatableSectionModel(model: 0, items: model)]
        })
    }
    
    public weak var delegate: HomeViewModelDelegate?
    
    public init() {
        self.repository = HomeRepository()
        
        scanBtnTapped.subscribe({
            [weak self] (_) in
            guard let `self` = self else { return }
            self.delegate?.scanQR()
        }).disposed(by: disposeBag)
        
        createBtnTapped.subscribe({
            [weak self] (_) in
            guard let `self` = self else { return }
            self.delegate?.createGroup()
        }).disposed(by: disposeBag)
    }

    public func reload() {
        page = 1
        repository.load(page: page)
            .subscribe(onSuccess: {[weak self] (result) in
                guard let `self` = self else { return }
                self._isLoading.onNext(true)
                self.items.accept(result.data)
                self._hasMoreData.accept(result.hasMore)
            }, onError: {[weak self] (_) in
                guard let `self` = self else { return }
                self._isLoading.onNext(true)
            }).disposed(by: disposeBag)
    }
    
    public func preload() {
        guard _hasMoreData.value else { return }
        page += 1
        repository.load(page: page)
            .subscribe(onSuccess: {[weak self] (result) in
                guard let `self` = self else { return }
                self._isLoading.onNext(false)
                self._hasMoreData.accept(result.hasMore)
                self.items.accept(self.items.value + result.data)
                }, onError: {[weak self] (_) in
                    guard let `self` = self else { return }
                    self._isLoading.onNext(false)
            }).disposed(by: disposeBag)
    }
    
    public func layoutSizeForIndexPath(_ indexPath: IndexPath) -> CGSize {
        let item = items.value[indexPath.row]
        let w = item.photo_thumbnail_w
        let h = item.photo_thumbnail_h
        
//        header 42, footer: 32
        return CGSize(width: w, height: h + 74)
    }
}

//coordinator delegate
extension HomeViewModel {
    
    public func scanQR() {
        delegate?.scanQR()
    }
    
    public func createGroup() {
        delegate?.createGroup()
    }
    
    public func didSelect(_ currIndex: Int) {
        delegate?.didSelect(items.value, currIndex: currIndex)
    }
}