package com.foxinmy.weixin4j.payment.mch;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;

import com.alibaba.fastjson.annotation.JSONField;
import com.foxinmy.weixin4j.http.weixin.XmlResult;
import com.foxinmy.weixin4j.type.mch.RedpacketSendType;
import com.foxinmy.weixin4j.type.mch.RedpacketStatus;
import com.foxinmy.weixin4j.type.mch.RedpacketType;
import com.foxinmy.weixin4j.util.DateUtil;

/**
 * 红包记录
 *
 * @className RedpacketRecord
 * @author jinyu(foxinmy@gmail.com)
 * @date 2015年6月4日
 * @since JDK 1.6
 * @see
 * @deprecated 迁移到子模块weixin4j-pay
 */
@Deprecated
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class RedpacketRecord extends XmlResult {

	private static final long serialVersionUID = 929959747323918458L;

	/**
	 * 商户订单号（每个订单号必须唯一） 组成： mch_id+yyyymmdd+10位一天内不能重复的数字。
	 */
	@XmlElement(name = "mch_billno")
	@JSONField(name = "mch_billno")
	private String outTradeNo;
	/**
	 * 微信支付分配的商户号
	 */
	@XmlElement(name = "mch_id")
	@JSONField(name = "mch_id")
	private String mchId;
	/**
	 * 红包单号
	 */
	@XmlElement(name = "detail_id")
	@JSONField(name = "detail_id")
	private String repacketId;
	/**
	 * 红包状态
	 */
	@XmlElement(name = "status")
	private String status;
	/**
	 * 发放类型
	 */
	@XmlElement(name = "send_type")
	@JSONField(name = "send_type")
	private String sendType;
	/**
	 * 红包类型
	 */
	@XmlElement(name = "hb_type")
	@JSONField(name = "hb_type")
	private String hbType;
	/**
	 * 红包个数
	 */
	@XmlElement(name = "total_num")
	@JSONField(name = "total_num")
	private int totalNum;
	/**
	 * 红包总金额（单位分）
	 */
	@XmlElement(name = "total_amount")
	@JSONField(name = "total_amount")
	private int totalAmount;
	/**
	 * 发送失败原因
	 */
	@XmlElement(name = "reason")
	private String reason;
	/**
	 * 发放时间
	 */
	@XmlElement(name = "send_time")
	@JSONField(name = "send_time")
	private String sendTime;
	/**
	 * 红包退款时间
	 */
	@XmlElement(name = "refund_time")
	@JSONField(name = "refund_time")
	private String refundTime;
	/**
	 * 红包退款金额
	 */
	@XmlElement(name = "refund_amount")
	@JSONField(name = "refund_amount")
	private Integer refundAmount;
	/**
	 * 祝福语
	 */
	@XmlElement(name = "wishing")
	private String wishing;
	/**
	 * 活动描述
	 */
	@XmlElement(name = "remark")
	private String remark;
	/**
	 * 活动名称
	 */
	@XmlElement(name = "act_name")
	@JSONField(name = "act_name")
	private String actName;
	/**
	 * 裂变红包领取列表
	 */
	@XmlElement(name = "hbinfo")
	@XmlElementWrapper(name = "hblist")
	@JSONField(name = "hblist")
	private List<RedpacketReceiver> receivers;

	public String getOutTradeNo() {
		return outTradeNo;
	}

	public String getMchId() {
		return mchId;
	}

	public String getRepacketId() {
		return repacketId;
	}

	@JSONField(serialize = false)
	public RedpacketStatus getFormatStatus() {
		return status != null ? RedpacketStatus.valueOf(status.toUpperCase())
				: null;
	}

	@JSONField(serialize = false)
	public RedpacketSendType getFormatSendType() {
		return sendType != null ? RedpacketSendType.valueOf(sendType) : null;
	}

	@JSONField(serialize = false)
	public RedpacketType getFomatHbType() {
		return hbType != null ? RedpacketType.valueOf(hbType) : null;
	}

	public String getStatus() {
		return status;
	}

	public String getSendType() {
		return sendType;
	}

	public String getHbType() {
		return hbType;
	}

	public int getTotalNum() {
		return totalNum;
	}

	public int getTotalAmount() {
		return totalAmount;
	}

	/**
	 * <font color="red">调用接口获取单位为分,get方法转换为元方便使用</font>
	 *
	 * @return 元单位
	 */
	@JSONField(serialize = false)
	public double getFormatTotalAmount() {
		return totalAmount / 100d;
	}

	public String getReason() {
		return reason;
	}

	public String getSendTime() {
		return sendTime;
	}

	@JSONField(serialize = false)
	public Date getFormatSendTime() {
		return sendTime != null ? DateUtil.parse2yyyyMMddHHmmss(sendTime)
				: null;
	}

	public String getRefundTime() {
		return refundTime;
	}

	@JSONField(serialize = false)
	public Date getFormatRefundTime() {
		return refundTime != null ? DateUtil.parse2yyyyMMddHHmmss(refundTime)
				: null;
	}

	public Integer getRefundAmount() {
		return refundAmount;
	}

	/**
	 * <font color="red">调用接口获取单位为分,get方法转换为元方便使用</font>
	 *
	 * @return 元单位
	 */
	@JSONField(serialize = false)
	public double getFormatRefundAmount() {
		return refundAmount != null ? refundAmount.intValue() / 100d : 0d;
	}

	public String getWishing() {
		return wishing;
	}

	public String getRemark() {
		return remark;
	}

	public String getActName() {
		return actName;
	}

	public List<RedpacketReceiver> getReceivers() {
		return receivers;
	}

	@XmlRootElement
	@XmlAccessorType(XmlAccessType.FIELD)
	public static class RedpacketReceiver implements Serializable {

		private static final long serialVersionUID = 1L;

		/**
		 * 领取红包的Openid
		 */
		@XmlElement(name = "openid")
		private String openId;
		/**
		 * 领取状态
		 */
		@XmlElement(name = "status")
		private RedpacketStatus status;
		/**
		 * 领取金额
		 */
		private int amount;
		/**
		 * 领取时间
		 */
		@XmlElement(name = "rcv_time")
		@JSONField(name = "rcv_time")
		private String receiveTime;

		public String getOpenId() {
			return openId;
		}

		public RedpacketStatus getStatus() {
			return status;
		}

		public int getAmount() {
			return amount;
		}

		public String getReceiveTime() {
			return receiveTime;
		}

		/**
		 * <font color="red">调用接口获取单位为分,get方法转换为元方便使用</font>
		 *
		 * @return 元单位
		 */
		@JSONField(serialize = false)
		public double getFormatAmount() {
			return amount / 100d;
		}

		@JSONField(serialize = false)
		public Date getFormatReceiveTime() {
			return receiveTime != null ? DateUtil
					.parse2yyyyMMddHHmmss(receiveTime) : null;
		}

		@Override
		public String toString() {
			return "RedpacketReceiver [openId=" + openId + ", status=" + status
					+ ", amount=" + getFormatAmount() + ", receiveTime="
					+ receiveTime + "]";
		}
	}

	@Override
	public String toString() {
		return "RedpacketRecord [outTradeNo=" + outTradeNo + ", mchId=" + mchId
				+ ", repacketId=" + repacketId + ", status=" + status
				+ ", sendType=" + sendType + ", hbType=" + hbType
				+ ", totalNum=" + totalNum + ", totalAmount="
				+ getFormatTotalAmount() + ", reason=" + reason + ", sendTime="
				+ sendTime + ", refundTime=" + refundTime + ", refundAmount="
				+ getFormatRefundAmount() + ", wishing=" + wishing
				+ ", remark=" + remark + ", actName=" + actName
				+ ", receivers=" + receivers + "]";
	}
}
