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

import Foundation
import RxSwift

public enum QRType {
    case group
    case session
}

struct GroupRemoteAPI {
    
    private func parse(_ json: JSON) -> NetworkArrayData<GroupItem>? {
        guard let data  = json["data"] as? [String: AnyObject] else { return nil }
        return NetworkArrayData(json: data, dataField: "groups")
    }
    
    private func parseGroup(_ json: JSON) -> GroupItem? {
        guard let data = json["data"] as? [String: AnyObject],
            let groupInfo = data["group"] as? [String: AnyObject] else {
                return nil
        }
        
        return GroupItem(value: groupInfo)
    }
    
    func loadContent(page: Int) -> Single<NetworkArrayData<GroupItem>> {
        let resource = ContentResource<NetworkArrayData<GroupItem>>(path: .groupList,
                                                                    parameter: ["user_id": ShareUserId, "page": page, "num": 20],
                                                                    parseJSON: parse)
        return resource.loadContent()
    }
    
    func create(groupName: String, avatar: String) -> Single<GroupItem> {
        let createResource = ContentResource<GroupItem>(path: .groupCreate,
                                                        parameter: ["user_id": ShareUserId,
                                                                    "group_name": groupName,
                                                                    "group_default_avatar": avatar],
                                                        parseJSON: parseGroup)
        return createResource.loadContent()
    }
    
    func join(type: QRType, parameter: Parameter) -> Single<GroupItem> {
        var joinResource: ContentResource<GroupItem>
        switch type {
        case .group:
            joinResource = ContentResource<GroupItem>(path: .joinGroup,
                                                      parameter: parameter + ["user_id": ShareUserId],
                                                      parseJSON: parseGroup)
        case .session:
            joinResource = ContentResource<GroupItem>(path: .joinSession,
                                                      parameter: parameter + ["user_id": ShareUserId],
                                                      parseJSON: parseGroup)
        }
        return joinResource.loadContent()
    }
    
    func remove(groupId: String) -> Completable {
        let removeResource = StatusResource(path: .groupDelete,
                                            parameter: ["user_id": ShareUserId, "group_id": groupId])
        return removeResource.getStatus()
    }
}