// /**
//  * Created by cuppi on 2016/12/7.
//  */
'use strict'
import NetworkTrade from '../network/JNetworkTrade';

// /**
//  * 交易管理类
//  * @memberOf module:manager
//  */

let instance: TradeManager = null;
class TradeManager {
  callbackCityInfo: Function;
  constructor() {
    if (!instance) {
      instance = this;
    }
    return instance;
  }

  /**
   * 获取单例实例
   * @returns {TradeManager}
   */
  static defaultManager(delegate: any) {
    if (!delegate.hasOwnProperty('callbackCityInfo')){
      console.log('没有找到城市信息实现');
      return null;
    }
    instance = new TradeManager();
    instance.callbackCityInfo = delegate.callbackCityInfo as Function;
    return instance;
  }

  /**
   * 获取交易商务参数（与座位无关的）
   * @param platform 平台类型
   * @param platformData 平台数据
   * @param filmId 电影Id
   * @param filmName 电影名称
   * @param cinemaId 影院Id
   * @param cinemaName 影院名称
   * @returns {*} 商务参数
   */
  static tradeParasFromPlatform(platform, platformData, filmId, filmName, cinemaId, cinemaName) {
    if (platform === 'wangpiao') {
      return {
        jbzFilmId: filmId,
        filmId: platformData.filmId,
        showId: platformData.showIndex,
        cinemaName: cinemaName,
        platformCinemaId: platformData.cinemaId,
        cinemaId
      };
    }

    if (platform === 'spider') {
      return {
        jbzFilmId: filmId,
        filmId: platformData.filmId,
        showId: platformData.showId,
        platformCinemaId: platformData.cinemaId,
        cinemaId
      }
    }

    if (platform === 'maizuo') {
      return {
        jbzFilmId: filmId,
        filmId: platformData.filmId,
        showId: platformData.foretellId,
        filmName: filmName,
        cinemaName: cinemaName,
        platformCinemaId: platformData.cinemaId,
        cinemaId
      };
    }

    if (platform === 'danche') {
      return {
        jbzFilmId: filmId,
        filmId: platformData.filmId,
        showId: platformData.id,
        platformCinemaId: platformData.cinemaId,
        cinemaId
      };
    }

    if (platform === 'maoyan' || platform === 'meituan' || platform === 'dazhong') {
      return {
        jbzFilmId: filmId,
        filmId: platformData.filmId,
        showId: platformData.showId,
        cinemaName: cinemaName,
        platformCinemaId: platformData.cinemaId,
        cinemaId
      };
    }

    if (platform === 'baidu') {
      return {
        showId: platformData.seqid,
        platformCinemaId: platformData.cinemaId,
        cinemaId
      };
    }

    if (platform === 'taobao'){
      return {
        jbzFilmId: filmId,
        filmId: platform.filmId,
        showId: platform.showId,
        cinemaName: cinemaName,
        platformCinemaId: platform.cinemaId,
        filmName,
        cinemaId
      };
    }
  }

  /**
   * 获取锁座处理者
   * @param type 平台类型
   * @param paras 参数
   * @returns {*} 返回请求promise
   */
  lockSeatHandlerFrom(type, paras) {
    return NetworkTrade.tradeLockSeat(type, paras);
  }

  /**
   * 获取下订单处理者
   * @param type 平台类型
   * @param paras 参数
   * @returns {{terminate, then}|*} 返回请求promise
   */
  confirmOrderHandlerFrom(type, paras) {
    return NetworkTrade.tradeApplyOrder(type, paras);
  }

  /**
   * 获取锁座时需要的座位参数
   * @param type 平台类型
   * @param seatList 座位列表（需要购买的）
   * @param mobile 手机号码
   * @param openId 身份标识符（目前跟手机号码一样）
   * @returns {*} 返回参数对象
   */
  seatInforParas(type, seatList, mobile, openId?) {
    // 网票
    if (type === 'wangpiao') {
      let seatInfos = [];
      let seatNumberInfos = [];
      for (let seat of seatList) {
        seatInfos.push(seat.seatModel.SeatIndex);
        seatNumberInfos.push(seat.rowNumber + ':' + seat.colNumber);
      }
      return {
        seatIds: seatInfos.join('|'),
        count: seatInfos.length,
        seatNumberInfos: seatNumberInfos.join('|'),
        mobile,
        openId
      }
    }
    // 蜘蛛
    if (type === 'spider') {
      let seatInfos = [];
      let seatNumberInfos = [];
      for (let seat of seatList) {
        seatInfos.push(seat.seatModel.rowId + ':' + seat.seatModel.columnId);
        seatNumberInfos.push(seat.rowNumber + ':' + seat.colNumber);
      }
      return {
        seatIds: seatInfos.join('|'),
        count: seatInfos.length,
        seatNumberInfos: seatNumberInfos.join('|'),
        mobile,
        openId
      }
    }
    // 卖座
    if (type === 'maizuo') {
      let seatInfos = [];
      let seatNumberInfos = [];
      for (let seat of seatList) {
        seatInfos.push(seat.seatModel.rowId + ':' + seat.seatModel.columnId);
        seatNumberInfos.push(seat.rowNumber + ':' + seat.colNumber);
      }
      return {
        seatIds: seatInfos.join('|'),
        count: seatInfos.length,
        seatNumberInfos: seatNumberInfos.join('|'),
        mobile,
        openId
      }
    }
    // 单车
    if (type === 'danche') {
      let seatInfos = [];
      let seatNumberInfos = [];
      for (let seat of seatList) {
        seatInfos.push(seat.seatModel.rowId + ':' + seat.seatModel.columnId);
        seatNumberInfos.push(seat.rowNumber + ':' + seat.colNumber);
      }
      return {
        seatIds: seatInfos.join('|'),
        count: seatInfos.length,
        seatNumberInfos: seatNumberInfos.join('|'),
        mobile,
        openId
      }
    }
    // 猫眼
    if (type === 'maoyan' || type === 'meituan' || type === 'dazhong') {
      let seatInfos = [];
      let seatNumberInfos = [];
      for (let seat of seatList) {
        if (!seat.seatModel || true) {
          console.log(seat);
        }
        console.log(seat.seatModel);
        seatInfos.push({
          sectionId: seat.seatModel.sectionId,
          columnId: seat.seatModel.columnId,
          rowId: seat.seatModel.rowId,
          seatNo: seat.seatModel.seatNo
        });
        seatNumberInfos.push(seat.seatModel.rowId + ':' + seat.seatModel.columnId);
      }
      return {
        seatIds: JSON.stringify({
          count: seatList.length,
          list: seatInfos
        }),
        seatNumberInfos: seatNumberInfos.join('|'),
        mobile,
        openId
      }
    }

    // 百度
    if (type === 'baidu') {
      let seatIds = [];
      let seatNumberInfos = [];
      for (let seat of seatList) {
        seatIds.push(seat.seatModel.seatNo);
        seatNumberInfos.push(seat.seatModel.rowId + ':' + seat.seatModel.columnId);
      }
      return {
        count: seatIds.length,
        //  后台设置特意反过来的
        seatIds: seatNumberInfos.join('|'),
        seatNumberInfos: seatIds.join('|'),
        mobile,
        openId
      }
    }

    // 淘票票
    if (type === 'taobao') {
      let seatInfos = [];
      let seatNumberInfos = [];
      let seatNameInfos = [];
      for (let seat of seatList) {
        seatInfos.push(seat.seatModel.seatId);
        seatNumberInfos.push(seat.rowOriNumber + ':' + seat.colOriNumber);
        seatNameInfos.push(seat.seatModel.name);
      }
      return {
        seatIds: seatInfos.join('|'),
        count: seatInfos.length,
        seatNumberInfos: seatNumberInfos.join('|'),
        seatsName: seatNameInfos.join('|'),
        applyKey: '',
        mobile,
        openId
      }
    }
  }

  /**
   * 购票（执行锁座 下订单 的事务）
   * @param type 平台类型
   * @param tradeParas 商务参数（与座位无关的参数集合）
   * @param seatList 座位列表
   * @param mobile 手机号码
   * @param openId 身份标识符（同上）
   * @returns {*} 返回请求promise
   */
  buyTicket(type, tradeParas, seatList, mobile) {
    let paras = {...tradeParas, ...this.seatInforParas(type, seatList, mobile)};
    let bridgeSelf = this;
    return {
      next: function (lockSeatCallback) {
        return {
          next: function (confirmOrderCallback) {
            bridgeSelf.lockSeatHandlerFrom(type, {...paras, cinemaId: paras.platformCinemaId}).then(data => {
              lockSeatCallback(null, data);
              let orderId = data.orderId;
              let {cinemaId, jbzFilmId, filmId, showId} = paras;
              let city = this.callbackCityInfo();
              let cityId = city.id;
              let cityName = city.name;
              bridgeSelf.confirmOrderHandlerFrom(type, {
                orderId,
                cinemaId,
                jbzFilmId,
                filmId,
                showId,
                cityId,
                cityName
              }).then(data => {
                confirmOrderCallback(null, data);
              }, error => {
                confirmOrderCallback(error, null);
              });
            }, error => {
              lockSeatCallback(error, null);
            });
          }
        }
      }
    }
  }

  /**
   * 锁座
   * @param type 平台类型
   * @param tradeParas 商务参数（与座位无关的参数集合）
   * @param seatList 座位列表
   * @param mobile 手机号码
   * @returns {Promise} 返回请求promise
   */
  lockSeat(type, tradeParas, seatList, mobile) {
    let paras = {...tradeParas, ...this.seatInforParas(type, seatList, mobile)};
    return new Promise((resolve, reject) => {
      this.lockSeatHandlerFrom(type, {...paras, cinemaId: paras.platformCinemaId}).then(data => {
        let orderId = data.orderId;
        let amount = data.originalAmount;
        let {cinemaId, jbzFilmId, filmId, showId} = paras;
        // 下面两个
        let city = this.callbackCityInfo();
        let cityId = city.id;
        let cityName = city.name;
        resolve({
          orderId,
          amount,
          cinemaId,
          jbzFilmId,
          filmId,
          showId,
          cityId,
          cityName
        });
      }, error => {
        reject(error);
      });
    })
  }

  /**
   * 确认订单
   * @param type 平台类型
   * @param lockSeatResultData 锁座成功返回的数据
   * @returns {Promise}
   */
  applyOrder(type, lockSeatResultData) {
    return new Promise((resolve, reject) => {
      this.confirmOrderHandlerFrom(type, lockSeatResultData).then(data => {
        resolve(data);
      }, error => {
        reject(error);
      });
    });
  }
}
export default TradeManager;
