<?php
namespace app\controller\api;

use app\exception\RepositoryException;
use app\repository\CouponRepository;

/**
 * 优惠卷相关
 * Class Coupon
 * @package app\controller\api
 */
class Coupon extends Base
{
    protected $noNeedLogin = [
        'getMyCouponList'
    ];

    /**
     * 我的优惠卷列表
     *
     * type in ['', 'notUsed', 'normal', 'used']
     */
    public function getMyCouponList()
    {
        $page       = $this->request->param('page/d', 1);
        $size       = $this->request->param('size/d', 10);
        $type       = $this->request->param('type', '');

        $page       = $page < 1 ? 1 : $page;
        $size       = $size < 1 ? 10 : $size;
        $accountCode    = $this->request->user['user_code'] ?? '';


        try {
            $whereMap   = [];
            $sortOrder  = ['received_time' => 'desc'];
            $fields     = ['*', '(end_time > NOW()) as sort_weight'];
            // TODO `status`字段需要核实是否用于筛选条件

            $whereMap[] = ['consumer_code', '=', $accountCode];
            switch ($type) {
                case 'notUsed':
                    // 未使用(包含已过期)
                    $whereMap[] = ['is_verificated', '=', self::BOOL_FALSE];
                    $sortOrder  = ['sort_weight' => 'desc', 'end_time' => 'asc'];
                    break;
                case 'normal':
                    // 未使用且未过期
                    $whereMap[] = ['is_verificated', '=', self::BOOL_FALSE];
                    $whereMap[] = ['end_time', '< TIME', date('Y-m-d H:i:s')];
                    $fields     = [];
                    break;
                case 'used':
                    // 已使用
                    $whereMap[] = ['is_verificated', '=', self::BOOL_TRUE];
                    $sortOrder  = ['verificate_time' => 'desc'];
                    $fields     = [];
                    break;
            }

            $res    = CouponRepository::getInstance()->findList($whereMap, $fields, $page, $size, null, $sortOrder);
            $res['list']    = multiTwoArrayKeysExcludeFilter($res['list']->toArray(), ['sort_weight']);

            return $this->json(0, 'success', $res);
        } catch (RepositoryException | \Exception $e) {
            return $this->json(5001, '优惠卷查询失败!');
        }
    }
}