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

import Foundation
import RxSwift

fileprivate let WXAppid = "wx4e22a0c8ae6d766d"
fileprivate let WXSecret = "636ac848016c593575d11143c55c8333"

//fileprivate protocol WXUserInfoParse: Parsable where Model == JSON {}
//
//extension DefaultResource: WXUserInfoParse {
//    func parse(_ json: JSON) -> JSON? { return json }
//}
//
//fileprivate struct WXResource: Resource, Parsable {
//    typealias Model = UserInfo
//
//    var path: Interfaces { return .authorize }
//    var parameter: Parameter = [:]
//
//    func parse(_ json: JSON) -> UserInfo? {
//        guard let result = json["data"] as? JSON else { return nil }
//        return UserInfo(json: result)
//    }
//}

class WXUserInfoRemoteAPI: UserInfoRemoteAPI {
    
    typealias Model = UserInfo
//    fileprivate var wxResource: WXResource
//    fileprivate var wxTokenResource: DefaultResource
//    fileprivate var wxUserInfoResource: DefaultResource
    
    init() {
        let wxUrl = "https://api.weixin.qq.com"
//        self.wxResource = WXResource()
//        self.wxTokenResource = DefaultResource(host: wxUrl, path: .wxAccessToken, parameter: [:])
//        self.wxUserInfoResource = DefaultResource(host: wxUrl, path: .wxUserInfo, parameter: [:])
    }
    
    func login() -> Single<UserInfo> {
        return Single.create(subscribe: { (observer) -> Disposable in
            
//            let wxLoginObserver = self.addWXLoginDidFinish()
//            let wxTokenObserver = self.getWXToken()
//            let wxUserInfoObserver = self.getWXUserInfo()
//            let loginObserver = self.wxLogin()
//            
//            Single.of(wxLoginObserver,
//                          wxTokenObserver,
//                          wxUserInfoObserver)
//                .concat().asSingle()
//                .subscribe({_ in
//                    loginObserver.asSingle()
//                        .subscribe(onNext: { (userInfo) in
//                            observer.onNext(userInfo)
//                            self.removeWXLoginDidFinish()
//                    }).dispose()
//                }).dispose()
            
            return Disposables.create()
        })
    }
    
    fileprivate func loginWithWeChat() {
        let request = SendAuthReq()
        request.scope = "snsapi_userinfo,snsapi_base"
        request.state = "skilogin"
        
        WXApi.send(request)
    }
    
//    fileprivate func addWXLoginDidFinish() -> Completable {
//        return Single.create { (observer) in
////            NotificationCenter.default.addObserver(forName: Notification.WXLoginNotification, object: nil, queue: nil) { (notification) in
////                guard let userInfo = notification.userInfo,
////                    let code = userInfo["code"] as? String else { return }
////                self.wxTokenResource.parameter = ["appid": WXAppid, "secret": WXSecret,
////                                                  "code": code, "grant_type": "authorization_code"]
////                observer.onCompleted()
////            }
////
//            return Disposables.create()
//        }
//    }
//
//    fileprivate func getWXToken() -> Completable {
//        return Single.create({ (observer) in
////            let resource = ContentResource.init(host:"https://api.weixin.qq.com",
////                                                path: .wxAccessToken,
////                                                parameter: <#T##Parameter#>, parseJSON: <#T##(JSON) -> _?#>)
////            NetworkApi.share.get(resource: self.wxTokenResource) { (result) in
////                guard case let .success(data) = result,
////                    let token = data["access_token"] as? String,
////                    let openId = data["openid"] as? String else { return }
////                self.wxUserInfoResource.parameter = ["access_token": token, "openid": openId]
////                observer.onCompleted()
////            }
//
//            return Disposables.create()
//        })
//    }
//
//    fileprivate func getWXUserInfo() -> Completable {
//        return Single.create({ (observer) in
////            NetworkApi.share.get(resource: self.wxUserInfoResource) { (result) in
////                guard case let .success(data) = result else { return }
////                if let errcode = data["errcode"] as? Int,
////                    errcode == 40003 { return }
////                self.wxResource.parameter = data
////                observer.onCompleted()
////            }
//
//            return Disposables.create()
//        })
//    }
//
//    fileprivate func wxLogin() -> Single<UserInfo> {
//        return Single.create({ (observer) in
////            NetworkApi.share.post(resource: self.wxResource) { (result) in
////                guard case let .success(data) = result else { return }
////                observer.onNext(data)
////                observer.onCompleted()
////            }
////
//            return Disposables.create()
//        })
//    }
    
    fileprivate func removeWXLoginDidFinish() {
        NotificationCenter.default.removeObserver(self, name: Notification.WXLoginNotification, object: nil)
    }
}

extension Notification {
    static let WXLoginNotification = Notification.Name("WXLoginDidFinishNotification")
}