//
//  PhotoPurchaseRemoteAPI.swift
//  PaiaiDataKit
//
//  Created by FFIB on 2019/4/1.
//  Copyright © 2019 FFIB. All rights reserved.
//

import Foundation
import RxSwift
import ObjectMapper

struct PurchaseModel {
    var wxpay_params: [String: AnyObject] = [:]

    var appid: String = ""
    var noncestr: String = ""
    var package: String = ""
    var sign: String = ""
    var partnerid: String = ""
    var timestamp: Int = 0

    var order_id: String = ""
    var prepay_id: String = ""

    init(_ json: JSON) {
        self.init(map: Map(mappingType: .fromJSON, JSON: json))
    }
}

extension PurchaseModel: Mappable {
    init(map: Map) {
        mapping(map: map)
    }

    mutating func mapping(map: Map) {
        wxpay_params    <- map["wxpay_params"]
        order_id        <- map["order_id"]
        prepay_id       <- map["prepay_id"]

        let params = Map(mappingType: .fromJSON, JSON: wxpay_params)

        appid       <- params["appid"]
        noncestr    <- params["noncestr"]
        package     <- params["package"]
        sign        <- params["sign"]
        partnerid   <- params["partnerid"]
        timestamp   <- params["timestamp"]
    }
}

struct PhotoPurchaseRemoteAPI {
    private var item: PhotoItem
    private var disposeBag = DisposeBag()

    init(item: PhotoItem) {
        self.item = item
    }

    func parse(json: JSON) -> Int? {
        guard let data = json["data"] as? [String: AnyObject],
            let price = data["price"] as? Int else { return nil }

        return price
    }

    func parseOrder(json: JSON) -> PurchaseModel? {
        guard let data = json["data"] as? [String: AnyObject] else { return nil }
        return PurchaseModel(data)
    }

    func parseOrderDetail(json: JSON) -> PhotoItem? {
        guard let data = json["data"] as? [String: AnyObject],
            let order = data["order"] as? [String: AnyObject],
            let photoInfo = order["group_photo_info"] as? [String: AnyObject] else { return nil }

        return PhotoItem(json: photoInfo)
    }

    func getPrice() -> Single<Int> {
        let contentResource = ContentResource(path: .picPrice,
                                              parameter: ["user_id": ShareUserId,
                                                          "photo_id": item.photo_id, "photo_type": "nomark"],
                                              parseJSON: parse)
        return contentResource.loadContent()
    }

    mutating func purchase() -> Single<String> {
        let resource = ContentResource(path: .wxorderCreat, parameter: ["user_id": ShareUserId,
                                                                      "body": "获取去水印照片",
                                                                      "total_fee": item.nomark / 100,
                                                                      "trade_type": "APP",
                                                                      "group_id": item.group_id,
                                                                      "photo_id": item.photo_id,
                                                                      "photo_type": "nomark"],
                                       parseJSON: parseOrder)
        return resource.loadContent().do(onSuccess: { model in
                #if !((arch(i386) || arch(x86_64)))
                    guard WXApi.isWXAppInstalled() else {
                        Toast.show(message: "尚未安装微信")
                        return
                    }

                    WXApi.registerApp(model.appid)
                    let payRequest = PayReq()
                    payRequest.openID = model.appid
                    payRequest.partnerId = model.partnerid
                    payRequest.prepayId = model.prepay_id
                    payRequest.package = model.package
                    payRequest.nonceStr = model.noncestr
                    payRequest.timeStamp = UInt32(model.timestamp)

                    WXApi.send(payRequest)
                #endif
            }).map { $0.order_id }
    }

    func getOrderStatus(orderId: String) -> Completable {
        let resource = StatusResource(path: .orderDetail, parameter: ["user_id": ShareUserId])

        return resource.getStatus()
    }

    func getOrderDetail(orderId: String) -> Single<PhotoItem> {
        let resource = ContentResource(path: .orderDetail, parameter: ["order_id": orderId,
                                                                       "user_id": ShareUserId],
                                       parseJSON: parseOrderDetail)

        return resource.loadContent()
    }
}