# -*- coding: utf-8 -*-
from __future__ import absolute_import, unicode_literals
import random
from datetime import datetime

from wechatpyyyy.pay.utils import get_external_ip
from wechatpyyyy.pay.base import BaseWeChatPayAPI


class WeChatRedpack(BaseWeChatPayAPI):

    def send(self, user_id, total_amount, send_name, act_name,
             wishing, remark, total_num=1, client_ip=None,
             out_trade_no=None, scene_id=None, consume_mch_id=None):
        """
        发送现金红包

        :param user_id: 接收红包的用户在公众号下的 openid
        :param total_amount: 红包金额，单位分
        :param send_name: 商户名称
        :param act_name: 活动名称
        :param wishing: 红包祝福语
        :param remark: 备注
        :param client_ip: 可选，调用接口的机器 IP 地址
        :param total_num: 可选，红包发放总人数，默认为 1
        :param out_trade_no: 可选，商户订单号，默认会自动生成
        :param scene_id: 可选，发放红包使用场景，红包金额大于200时必传
        :param consume_mch_id: 可选，资金授权商户号。服务商替特约商户发放时使用
        :return: 返回的结果数据字典
        """
        if not out_trade_no:
            now = datetime.now()
            out_trade_no = '{0}{1}{2}'.format(
                self.mch_id,
                now.strftime('%Y%m%d%H%M%S'),
                random.randint(1000, 10000)
            )
        data = {
            'wxappid': self.appid,
            're_openid': user_id,
            'total_amount': total_amount,
            'send_name': send_name,
            'act_name': act_name,
            'wishing': wishing,
            'remark': remark,
            'client_ip': client_ip or get_external_ip(),
            'total_num': total_num,
            'mch_billno': out_trade_no,
            'scene_id': scene_id,
            'risk_info': None,
            'consume_mch_id': consume_mch_id
        }
        return self._post('mmpaymkttransfers/sendredpack', data=data)

    def send_group(self, user_id, total_amount, send_name, act_name, wishing,
                   remark, total_num, client_ip=None, amt_type="ALL_RAND",
                   out_trade_no=None, scene_id=None, consume_mch_id=None):
        """
        发送裂变红包

        :param user_id: 接收红包的用户在公众号下的 openid
        :param total_amount: 红包金额，单位分
        :param send_name: 商户名称
        :param act_name: 活动名称
        :param wishing: 红包祝福语
        :param remark: 备注
        :param total_num: 红包发放总人数
        :param client_ip: 可选，调用接口的机器 IP 地址
        :param amt_type: 可选，红包金额设置方式
                         ALL_RAND—全部随机,商户指定总金额和红包发放总人数，由微信支付随机计算出各红包金额
        :param out_trade_no: 可选，商户订单号，默认会自动生成
        :param scene_id: 可选，发放红包使用场景，红包金额大于200时必传
        :param consume_mch_id: 可选，资金授权商户号。服务商替特约商户发放时使用
        :return: 返回的结果数据字典
        """
        if not out_trade_no:
            now = datetime.now()
            out_trade_no = '{0}{1}{2}'.format(
                self._client.mch_id,
                now.strftime('%Y%m%d%H%M%S'),
                random.randint(1000, 10000)
            )
        data = {
            'wxappid': self.appid,
            're_openid': user_id,
            'total_amount': total_amount,
            'send_name': send_name,
            'act_name': act_name,
            'wishing': wishing,
            'remark': remark,
            'total_num': total_num,
            'client_ip': client_ip or get_external_ip(),
            'amt_type': amt_type,
            'mch_billno': out_trade_no,
            'scene_id': scene_id,
            'risk_info': None,
            'consume_mch_id': consume_mch_id
        }
        return self._post('mmpaymkttransfers/sendgroupredpack', data=data)

    def query(self, out_trade_no, bill_type='MCHT'):
        """
        查询红包发放记录

        :param out_trade_no: 商户订单号
        :param bill_type: 可选，订单类型，目前固定为 MCHT
        :return: 返回的红包发放记录信息
        """
        data = {
            'mch_billno': out_trade_no,
            'bill_type': bill_type,
            'appid': self.appid,
        }
        return self._post('mmpaymkttransfers/gethbinfo', data=data)
