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

import Foundation
import RxSwift
import RxCocoa

fileprivate(set) var ShareUserId: String = ""

public class UserInfoViewModel {

    public var shareUserInfo = BehaviorRelay<UserInfo>(value: UserInfo())

    public var isLoggedIn: Observable<Void> {
        return shareUserInfo.asObservable()
            .distinctUntilChanged({ $0.userId == $1.userId })
            .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()
            .distinctUntilChanged({ $0.userId == $1.userId })
            .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.accept(repository.readUserInfo())
    }

    public func guestLogin() {
        repository.guestLogin().subscribe(onSuccess: { (userInfo) in
            self.shareUserInfo.accept(userInfo)
            self._loginCompleted.onNext(())
        }).disposed(by: disposeBag)
    }

    public func wxLogin() {
        Toast.showActivity(message: "正在登陆")
        repository.wxLogin().subscribe(onSuccess: { (userInfo) in
            self.shareUserInfo.accept(userInfo)
            self._loginCompleted.onNext(())
            Toast.hide()
        }).disposed(by: disposeBag)
    }
}