<?php

namespace App\Services;

use App\Model\Coupon;
use App\Model\UserCoupon;

/**
 * 优惠卷
 */
class CouponService extends BaseService
{
    /**
     * 获取用户某状态全部优惠卷-列表
     * @param string|int $user_id 用户id
     * @param array $inquiry_type [1,2,3,4,5]适用范围（1:全部 2:快速问诊 3:专家问诊 4:公益问诊 5:问诊购药）
     * @param int $user_coupon_status 状态（0:未使用 1:已使用 3:已过期）
     * @return array
     */
    public function getUserCouponStatusList(string|int $user_id, array $inquiry_type, int $user_coupon_status): array
    {
        $params = array();
        $params[] = ['user_id','=',$user_id];
        $params[] = ['user_coupon_status','=',$user_coupon_status];// 状态（0:未使用 1:已使用 3:已过期）

        $coupon_params = array();
        $coupon_params[] = ['coupon_client','=',1];
        $coupon_params[] = ['coupon_status','=',1]; // 状态（1:正常 2:强制失效 3:结束 4:删除）

        $application_scope_params = $inquiry_type; // 适用范围（1:全部 2:快速问诊 3:专家问诊 4:公益问诊 5:问诊购药）

        $user_coupon = UserCoupon::getWithCouponList($params,$coupon_params,$application_scope_params);
        if (empty($user_coupon)){
            return array();
        }

        return $user_coupon->toArray();
    }

    /**
     * 获取用户可用优惠卷-单条
     * @param string|int $user_id 用户id
     * @param string|int $inquiry_type 订单类型（1:专家问诊 2:快速问诊 3:公益问诊 4:问诊购药）
     * @param int $coupon_client 使用平台（1:小程序）
     * @return array
     */
    public function getUserUsableCouponOne(string|int $user_id, string|int $inquiry_type, int $coupon_client = 1): array
    {
        // 问诊类型需加1
        $inquiry_type = $inquiry_type + 1;

        $params = array();
        $params[] = ['user_id','=',$user_id];
        $params[] = ['user_coupon_status','=',0];// 状态（0:未使用 1:已使用 3:已过期）
        $params[] = ['valid_start_time','>',date('Y-m-d H:i:s',time())]; // 有效使用时间
        $params[] = ['valid_end_time','<',date('Y-m-d H:i:s',time())]; // 过期使用时间

        $coupon_params = array();
        $coupon_params[] = ['coupon_client','=',$coupon_client];
        $coupon_params[] = ['coupon_status','=',1]; // 状态（1:正常 2:强制失效 3:结束 4:删除）

        $application_scope_params = [1,$inquiry_type]; // 适用范围（1:全部 2:快速问诊 3:专家问诊 4:公益问诊 5:问诊购药）

        $user_coupon = UserCoupon::getWithCouponOne($params,$coupon_params,$application_scope_params);
        if (empty($user_coupon)){
            return array();
        }

        return $user_coupon->toArray();
    }

    /**
     * 发放用户优惠卷
     * @param int $distribution_object 发放对象（1:新注册用户 2:会员 3:近期消费 4:近期购药）
     * @param string $user_id
     * @param string $patient_id
     * @param int $coupon_client 使用平台（1:小程序）
     * @return bool
     */
    public function DistributeCoupon(int $distribution_object,string $user_id,string $patient_id,int $coupon_client = 1): bool
    {
        $params = array();
        $params['coupon_client'] = $coupon_client;
        $params['coupon_status'] = 1;
        $params['distribution_object'] = $distribution_object; // 发放对象（1:新注册用户 2:会员 3:近期消费 4:近期购药）

        $coupon = Coupon::getList($params);
        if (empty($coupon)){
            return true;
        }

        foreach ($coupon as $key => $value){
            // 判断发放数量
            if ($value['coupon_count'] == $value['coupon_take_count']){
                continue;
            }

            // 进行发放
            $data = array();
            $data['user_id'] = $user_id;
            $data['patient_id'] = $patient_id;
            $data['coupon_id'] = $value['coupon_id'];

            if ($value['valid_type'] == 1){
                // 有效类型（1:绝对时效，xxx-xxx时间段有效 2:相对时效 n天内有效）
                $data['valid_start_time'] = $value['valid_start_time']; // 有效使用时间
                $data['valid_end_time'] = $value['valid_end_time']; // 过期使用时间
            }elseif ($value['valid_type'] == 2){
                // 有效类型（1:绝对时效，xxx-xxx时间段有效 2:相对时效 n天内有效）
                $data['valid_start_time'] = date('Y-m-d H:i:s',time()); // 有效使用时间
                $data['valid_end_time'] = date("Y-m-d H:i:s",strtotime($value['valid_days'] . " day"));
            }else{
                return false;
            }

            $res = UserCoupon::addUserCoupon($data);
            if (empty($res)){
                return false;
            }
        }

        return true;
    }
}