//
//  UserInfoViewModel.swift
//  PaiaiDataKit
//
//  Created by ffib on 2018/12/20.
//  Copyright © 2018 yb. All rights reserved.
//

import Foundation
import RxSwift

fileprivate(set) var ShareUserId: String = ""

public class UserInfoViewModel {
    
    public var shareUserInfo = BehaviorSubject<UserInfo>(value: UserInfo())
    
    public var isLoggedIn: Observable<Void> {
        return shareUserInfo.asObservable()
            .filter{ $0.userId != "" }
            .flatMapLatest { _ in
                return Observable.just(())
            }
    }
    
    public var notLoggedIn: Observable<Void> {
        return shareUserInfo.asObservable()
            .filter { $0.userId == "" }
            .flatMapLatest { _ in
                return Observable.just(())
            }
    }
    
    public var loginCompleted: Observable<Void> {
        return _loginCompleted.asObservable()
    }
    
    public var guestLoginBtnTapped = PublishSubject<Void>()
    public var wxLoginBtnTapped = PublishSubject<Void>()
    
    private var _loginCompleted = PublishSubject<Void>()
    private var repository: UserInfoRepository
    private var disposeBag = DisposeBag()
    
    public init() {
        self.repository = UserInfoRepository(userInfoStore: UserInfoStore(),
                                             guestRemoteAPI: GuestUserInfoRemoteAPI(),
                                             wxRemoteAPI: WXUserInfoRemoteAPI())
        
        shareUserInfo.asObservable().subscribe(onNext: { (userInfo) in
            ShareUserId = userInfo.userId
        }).disposed(by: disposeBag)
        
        guestLoginBtnTapped.subscribe {[unowned self] _ in
            self.guestLogin()
        }.disposed(by: disposeBag)
        
        wxLoginBtnTapped.subscribe {[unowned self] _ in
            self.wxLogin()
        }.disposed(by: disposeBag)
        
        load()
    }
    
    fileprivate func load() {
        shareUserInfo.onNext(repository.readUserInfo())
    }
    
    public func guestLogin() {
        repository.guestLogin().subscribe(onSuccess: { (userInfo) in
            self.shareUserInfo.onNext(userInfo)
            self._loginCompleted.onNext(())
        }) { (error) in
            #warning("错误处理")
        }.disposed(by: disposeBag)
    }
    
    public func wxLogin() {
        repository.guestLogin().subscribe(onSuccess: { (userInfo) in
            self.shareUserInfo.onNext(userInfo)
            self._loginCompleted.onNext(())
        }) { (error) in
            #warning("错误处理")
        }.disposed(by: disposeBag)
    }
}