/**
 * 统一接口请求基类
 */
 export class ApiRequestBase {
  appId?: string;

  /**
   * 签名
   */
  key?: string;

  parkId?: number | string;

  /**
   * 接口业务代码
   */
  serviceCode?: string;

  /**
   * 时间戳(毫秒)
   */
  ts?: string;

  /**
   * 请求唯一标识
   */
  reqId?: string;
}

export type ApiRequest = ApiRequestBase & { [key: string]: any };

/**
 * 统一接口返回值
 */
export class ApiResponse<T = any> {
  constructor(resCode: string | number, resMsg?: string, data?: T) {
    this.resCode = resCode;
    this.resMsg = resMsg;
    this.data = data;
  }

  /**
   * 响应代码 0=成功，其他失败，详见返回码枚举
   */
  resCode: string | number;
  resMsg?: string;
  data?: T;

  static success = new ApiResponse("0");

  static isSuccess(res: ApiResponse) {
    return res.resCode === "0" || res.resCode === 0;
  }

  static successWithData(data: any) {
    return new ApiResponse("0", null, data);
  }

  static successWithResMsg(resMsg: any) {
    return new ApiResponse("0", resMsg);
  }

  static failed(resMsg?: string) {
    return new ApiResponse("-1", resMsg);
  }
}

export class GetConfigInfoResponse {
  /**
   * 平台配置
   */
  config?: string;

  /**
   * 车场配置
   */
  parkConfig?: {
    stcParkId: string;

    /**
     * 第三方车场id
     */
    thirdParkId: any;

    [key: string]: any;
  }[];
}

export class PostPaymentInput extends ApiRequestBase {
  plateNo: string;
  orderNo: string;

  /**
   * 应收金额（单位：分）
   */
  money: number;

  /**
   * 进场时间
   */
  entryTime: string;

  /**
   * 停车时长（秒）
   */
  elapsedTime: number;

  /**
   * 固定车类型  详见参数枚举 1.6.2
   */
  carType?: number;

  /**
   * 车辆类型 详见参数枚举1.6.8
   */
  carStyle?: number;

  /**
   * 出口编号
   */
  leaveNodeId?: any;

  /**
   * 车牌颜色 详见参数枚举1.6.11（白、黑、灰等）
   */
  plateColor?: string;
}

/**
 * 3.2.1
 * 进场上报
 */
export class PostCarInInfoInput extends ApiRequestBase {
  /**
   * 出入场唯一记录ID
   */
  trafficId: string;

  /**
   * 车牌号(全)
   */
  plateNo: string;

  /**
   * 入场取票号/无牌车入场的卡号
   */
  cardNo?: string;

  /**
   * 入场时间
   */
  entryTime: string;

  /**
   * 卡片类型  详见参数枚举 1.6.2
   */
  carType: number;

  /**
   * 入口名称（6.x系统取值是：通道名称 +“- ”+ 通道id；5.x系统取值是：通道名称（后续也需要调整成6.x一样，对接方需要兼容）
   */
  entryPlace: string;

  /**
   * 出口抓拍图片名称
   */
  imgName: string;

  /**
   * 图片地址
   */
  imgInfo: string;

  /**
   * 场中场标识（0=否 1=是）
   */
  area?: number;

  /**
   * 车牌修正标识（0=否 1=是）
   */
  modifyLpnFlag?: number;

  /**
   * 识别可信度
   */
  recognitionCredibility?: string;

  /**
   * 放行类型 ，详见参数枚举1.6.10
   */
  passType?: number;

  /**
   * 放行说明
   */
  passRemark?: string;

  /**
   * 剩余车位
   */
  freeLots?: number;

  /**
   * 总车位
   */
  totalLots?: number;

  /**
   * 入场数据扩展信息，json对象
   */
  carInExt?: {
    /**
     * 车牌颜色 详见参数枚举1.6.11（白、黑、灰等）
     */
    plateColor?: string;

    /**
     * 车辆品牌（奥迪、宝马、奔驰等）
     */
    vehicleBrand?: string;

    /**
     * 车辆型号（大型车，小型车，摩托车等现只有6x才有此值）
     */
    vehicleModel?: string;

    /**
     * 固定车过期天数
     */
    carExpireDay?: number;

    /**
     * 扩展字符串（6x才存在的参数）
     */
    extInfo?: string;
  };
}

/**
 * 3.2.2
 * 出场上报
 */
export class PostCarOutInfoInput extends ApiRequestBase {
  /**
   * 出入场唯一记录ID
   */
  trafficId: string;

  /**
   * 车牌号
   */
  plateNo: string;

  /**
   * 入场取票号/无牌车入场的卡号
   */
  cardNo: string;

  /**
   * 入场时间
   */
  entryTime?: string;

  /**
   * 出场时间
   */
  leaveTime?: string;

  /**
   * 卡片类型 详见参数枚举1.6.2
   */
  carType?: number;

  /**
   * 出口名称（6.x系统取值是：通道名称 +“- ”+ 通道id；5.x系统取值是：通道名称（后续也需要调整成6.x一样，对接方需要兼容）
   */
  leavePlace?: string;

  /**
   * 出口抓拍图片名称
   */
  imgName?: string;

  /**
   * 图片信息类型：2=图片URL（可公网访问地址）
   */
  imgType: number;

  /**
   * 图片URL
   */
  imgInfo: string;

  /**
   * 场中场标识（0=否 1=是）
   */
  area: number;

  /**
   * 识别可信度
   */
  recognitionCredibility: string;

  /**
   * 放行类型，详见参数枚举1.6.10
   */
  passType: number;

  /**
   * 放行说明
   */
  passRemark: string;

  /**
   * 剩余车位
   */
  freeLots: number;

  /**
   * 总车位
   */
  totalLots: number;

  /**
   * 支付信息，json对象
   */
  payMentInfo?: {
    /**
     * 应收总金额（单位分）
     */
    totalMoney?: number;

    /**
     * 实收总金额（单位分）
     */
    paidMoney?: number;

    /**
     * 抵扣时长（单位秒）
     */
    freeTime?: number;

    /**
     * 抵扣金额（单位分）
     */
    freeMoney?: number;

    /**
     * 后付费出场（0=否 1=是）
     */
    isPostPay: number;
  };

  /**
   * 车辆扩展信息，json对象（不参与签名）
   */
  carExtInfo?: {
    /**
     * 车牌颜色 详见参数枚举1.6.11（白、黑、灰等）
     */
    plateColor: string;

    /**
     * 车辆品牌（奥迪、宝马、奔驰等）
     */
    vehicleBrand: string;

    /**
     * 车辆型号（大型车，小型车，摩托车等现只有6x才有此值）
     */
    vehicleModel: string;

    /**
     * 扩展字符串（6x才存在的参数）
     */
    extInfo: string;
  };
}

/**
 * 3.2.3缴费记录上报
 */
export class PostPayFeeInfoInput extends ApiRequestBase {
  /**
   * 车牌号
   */
  plateNo?: string;

  /**
   * 入场取票号/无牌车入场的卡号
   */
  cardNo?: string;

  /**
   * 主账单id
   */
  billId: string;

  /**
   * 入场时间
   */
  entryTime: string;

  /**
   * 支付时间
   */
  payTime: string;

  /**
   * 支付来源 详见参数枚举 1.6.5
   * 对应dict表PAY_SOURCE
   */
  paySource: number;

  /**
   * 收费终端，详见参数枚举1.6.4
   * 对应dict表PAY_CHANNEL
   */
  payType: number;

  /**
   * 付款方式，详见参数枚举 1.6.3
   * 对应dict表PAY_METHOD
   */
  payMethod: number;

  /**
   * 应收总金额（单位分）
   */
  totalMoney: number;

  /**
   * 实收总金额（单位分）
   */
  paidMoney: number;

  /**
   * 抵扣时长（单位秒）
   */
  freeTime: number;

  /**
   * 抵扣金额（单位分）
   */
  freeMoney: number;

  /**
   * 车场订单号
   */
  orderNo?: string;

  /**
   * 支付定单号
   */
  paymentOrderNo?: string;

  /**
   * 车牌颜色 详见参数枚举1.6.11（白、黑、灰等）
   */
  plateColor?: string;

  /**
   * 获取优惠金额，单位分
   * 不能直接从字段freeMoney取
   * @param input
   * @returns
   */
  static getFreeMoney(input: PostPayFeeInfoInput) {
    return (
      ([1010, 1012, 1013, 1014].includes(input.payMethod)
        ? input.paidMoney
        : 0) + input.freeMoney
    );
  }

  /**
   * 获取实收金额，单位分
   * 不能直接从字段paidMoney取
   * @param input
   */
  static getPaidMoney(input: PostPayFeeInfoInput) {
    return [1010, 1012, 1013, 1014].includes(input.payMethod)
      ? 0
      : input.paidMoney;
  }
}

/**
 * 3.2.4空闲车位上报
 */
export class PostFreeParkingSpaceInput extends ApiRequestBase {
  /**
   * 总剩余车位数
   */
  freeSpaceNum: number;

  /**
   * 总车位数
   */
  totalSpaceNum: number;

  areaInfo: [
    {
      areaCode: string;
      areaName: string;

      /**
       * 区域剩余车位数
       */
      areaFreeSpaceNum: number;
    }
  ];
}

/**
 * 3.2.5设备状态上报
 */
export class PostDeviceStateInput extends ApiRequestBase {
  deviceCode: any;
  deviceIp: string;
  deviceName: string;
  deviceType: number;
  status: any;
  remark: string;
  statusTime: string;
}

/**
 * 3.2.6修改车牌信息上报
 */
export class PostModifyPlateNoInput extends ApiRequestBase {
  /**
   * 出入场唯一记录ID
   */
  trafficId: string;
  oldPlateNo: string;
  newPlateNo: string;
  remark: string;
}

/**
 * 3.2.7车场固定车信息上报
 */
export class PostCarCardInfoInput extends ApiRequestBase {
  /**
   * 卡片id
   */
  cardId: number;

  /**
   * 卡片名称
   */
  cardName: string;

  /**
   * 户主名
   */
  useName?: string;

  /**
   * 用户手机号
   */
  tel?: string;

  /**
   * 房间号
   */
  roomId?: string;

  /**
   * 备注
   */
  remak?: string;

  /**
   * 车位数量
   */
  lotCount?: string;

  /**
   * 未过期车位数量
   */
  validCount?: string;
  carLotList: {
    /**
     * 车位ID
     */
    id: number;

    /**
     * 车位名称
     */
    lotName?: string;

    /**
     * 固定车类型  详见参数枚举 1.6.2
     */
    carType: number;

    /**
     * 车牌类型名称
     */
    carTypeName: string;

    /**
     * 区域名称
     */
    areaName: string;

    /**
     * 区域id
     */
    areaId: string;

    /**
     * 有效期开始时间（没有有效期时为空）
     */
    beginTime?: string;

    /**
     * 有效期结束时间（没有有效期时为空）
     */
    endTime?: string;

    /**
     * 占用车位个数
     */
    lotCount: number;

    /**
     * 卡内余额(充值车：分，计次车：次)
     */
    validValue: number;
  }[];

  plateNoInfo: {
    id: number;

    /**
     * 车牌号
     */
    plateNo: string;

    /**
     * ETC号/卡号
     */
    etcNo: string;
    /**
     * 备注
     */
    remark?: string;
    /**
     * 车牌状态，1=启用，2=禁用
     */
    plateState?: number;
  }[];

  /**
   * 审核状态(0:未审核,1:审核,2:审核不通过)默认为1
   */
  cardState: number;

  /**
   * 操作标识 0=删除 1=新增 2=更新
   */
  operationType: number;

  /**
   * 创建时间，yyyy-MM-dd HH:mm:ss
   */
  createTime: string;
  /**
   * 内部车状态，1=启用，2=注销
   */
  state: number;
  /**
   * 操作人员
   */
  userName: string;
}

/**
 *
 * 进出车位上报
 */
export class PostBusInOutInput extends ApiRequestBase {
  carList: any;
  /*
    plateNo: string;
    //plateColor: string;
    busNumber: string;
    areaName: string;
    mapName: string;
    stopTime: string;
    stopFlag: string;
    imgName: string;
    */
}

/**
 * 3.2.10车场交班信息上报
 */
export class PostShiftWorkInfoInput extends ApiRequestBase {
  /**
   * 交班ID （车场自定义）
   */
  exchangeCode: string;

  /**
   * 收费员
   */
  chargeMan: string;

  /**
   * 交班时间，yyyy-MM-dd HH:mm:ss
   *
   * 退机时间
   */
  exchangeTime: string;

  /**
   * 上岗时间，yyyy-MM-dd HH:mm:ss
   *
   * 上机时间
   */
  startTime: string;

  /**
   * 实收金额（单位：分）
   */
  money: number;

  /**
   * 应收金额（单位：分）
   */
  totalMoney: number;
}

/**
 * 3.2.8车场固定车充值信息上报
 */
export class PostCarCardChargeInfoInput extends ApiRequestBase {
  /**
   * 卡片id
   */
  cardId: number;
  /**
   * 订单号
   */
  orderNo: string;
  /**
   * 卡片类型
   */
  carType: number;
  /**
   * 支付渠道
   */
  payChannel: number;
  /**
   * 充值方式
   */
  chargeMethod: number;
  /**
   * 充值天数次数钱数
   */
  chargeNumber: number;
  /**
   * 支付金额
   */
  amount: number;
  /**
   * 免费额度
   */
  freeNumber: number;
  /**
   * 充值开始时间
   */
  validFrom: string;
  /**
   * 充值结束时间
   */
  validTo: string;
  /**
   * 创建时间
   */
  createTime: string;
  /**
   * 备注
   */
  remark: string;
  /**
   * 0充值1退款
   */
  rechargeType: number;
  /**
   * 0=删除 1=新增 2=更新
   */
  operationType: number;
  /**
   * 操作人员
   */
  operator: string;
  /**
   * 支付来源
   */
  paySource: string;
}

/**
 * 3.2.30 特殊订单上报
 */
export class PostSpecPayNotifyInput extends ApiRequestBase {
  /**
   * 车牌号
   */
  carNo?: string;

  /**
   * 入场取票号/无牌车入场的卡号
   */
  cardNo?: string;

  /**
   * 主账单id
   */
  billId?: string;

  /**
   * 入场时间
   */
  comeTime?: string;

  /**
   * 支付时间
   */
  payTime?: string;

  /**
   * 支付来源 详见参数枚举 1.6.5
   */
  paySource?: number;

  /**
   * 收费终端，详见参数枚举1.6.4
   */
  payChannel?: number;

  /**
   * 付款方式，详见参数枚举 1.6.3
   */
  payMethod?: number;

  /**
   * 应收总金额（单位分）
   */
  receivableAmount?: number;

  /**
   * 实收总金额（单位分）
   */
  payinAmount?: number;

  /**
   * 抵扣时长（单位秒）
   */
  freeTime?: number;

  /**
   * 抵扣金额（单位分）
   */
  freeMoney?: number;

  /**
   * 车场订单号
   */
  orderNo?: string;

  /**
   * 支付定单号
   */
  paymentOrderNo?: string;

  /**
   * 车辆扩展信息，json对象
   */
  externJson?: string;

  /**
   * 0-有效账单，1-重复支付无效账单（6x才支持，模板v1.0.1及以上版本才支持此字段）
   */
  effectData?: number;

  /**
   * 0-初始账单，1-修改账单（金额可能发生变化，如后付费）（6x才支持，模板v1.0.2版本才支持此字段---暂未实现）
   */
  modifyFlag?: number;

  /**
   * 订单类型：详细见枚举
   */
  orderType?: number;
}

/**
 * 3.3.1车场进出场压地感上报
 */
export class PostCarCaptureInfoInput extends ApiRequestBase {
  /**
   * 车牌号
   */
  plateNo: string;

  /**
   * 抓拍场时间：格式yyyy-MM-dd HH:mm:ss
   */
  capTime: string;

  /**
   * 出入口id
   */
  nodeId: string;

  /**
   * IP
   */
  nodeIP: string;

  /**
   * 入口抓拍图片名称
   */
  imgName: string;

  /**
   * 识别可信度
   */
  recognitionCredibility: string;

  /**
   * 进出车流水号
   */
  billId: string;

  /**
   * 序列号
   */
  serial: string;

  /**
   * 图片URL；不一定有值，如果无值，根据imgName那么调用2.6.6接口获取
   */
  imgUrl?: string;

  /**
   * 车辆类型 详见参数枚举1.6.8
   */
  carStyle?: string;

  /**
   * 入场数据扩展信息，json object对象
   */
  carInfoExt?: {
    plateColor?: string;
    vehicleBrand?: string;
    vehicleModel?: string;
  };
}

/**
 * 3.2.12设备告警信息上报
 */
export class PostDeviceAlarmInfoInput extends ApiRequestBase {
  /**
   * 设备编码
   */
  deviceCode: string;

  /**
   * 设备Ip
   */
  deviceIp: string;

  /**
   * 设备名称
   */
  deviceName: string;

  /**
   * 设备类型,详见参数枚举1.6.12
   */
  deviceType: number;

  /**
   * 故障类型
   */
  alarmType: number;

  /**
   * 故障类型名称
   */
  alarmName: string;

  /**
   * 设备状态码 1:出现告警 0：恢复
   */
  status: string;

  /**
   * 故障描述
   */
  remark: string;

  /**
   * 故障/恢复时间
   */
  statusTime: string;

  /**
   * 推送告警等级 1：一级响应 P0 2：二级响应 P1 3：三级响应 P2 4：四级响应 P3
   */
  alarmLevel?: string;
}
