<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2017/11/8
 * Time: 13:46
 */

namespace app\common\model;


use think\Model;

class Pointcart extends Model
{
    /**
     * 礼品购物车保存
     *
     * @param    array $param 资料
     */
    public function addPointCart($param)
    {
        if (empty($param)) {
            return false;
        }
        $result = db('pointscart')->insert($param);
        if ($result) {
            //清除相关缓存
            wcache($param['pmember_id'], array('pointcart_count' => null), 'm_pointcart');
            return $result;
        }
        else {
            return false;
        }
    }

    /**
     * 兑换礼品购物车列表
     */
    public function getPointCartList($where, $field = '*', $page = 0, $limit = 0, $order = '', $group = '')
    {
        if (is_array($page)) {
            if ($page[1] > 0) {
                $cartgoods_list = db('pointscart')->field($field)->where($where)->page($page[0], $page[1])->limit($limit)->group($group)->order($order)->select();
            }
            else {
                $cartgoods_list = db('pointscart')->field($field)->where($where)->page($page[0])->limit($limit)->group($group)->order($order)->select();
            }
        }
        else {
            $cartgoods_list = db('pointscart')->field($field)->where($where)->page($page)->group($group)->order($order)->select();
        }
        if ($cartgoods_list) {
            foreach ($cartgoods_list as $k => $v) {
                $v['pgoods_image_old'] = $v['pgoods_image'];
                $v['pgoods_image_max'] = pointprodThumb($v['pgoods_image']);
                $v['pgoods_image_small'] = pointprodThumb($v['pgoods_image'], 'small');
                $v['pgoods_image'] = pointprodThumb($v['pgoods_image'], 'mid');
                $cartgoods_list[$k] = $v;
            }
        }
        return $cartgoods_list;
    }

    /**
     * 查询兑换礼品购物车列表并计算总积分
     */
    public function getPCartListAndAmount($where, $field = '*', $page = 0, $limit = 0, $order = '', $group = '')
    {
        $cartgoods_list = $this->getPointCartList($where);
        //兑换礼品总积分
        $cartgoods_pointall = 0;
        if (!empty($cartgoods_list) && is_array($cartgoods_list)) {
            foreach ($cartgoods_list as $k => $v) {
                $v['pgoods_pointone'] = intval($v['pgoods_points']) * intval($v['pgoods_choosenum']);
                $cartgoods_list[$k] = $v;
                $cartgoods_pointall = $cartgoods_pointall + $v['pgoods_pointone'];
            }
        }
        return array(
            'state' => true,
            'data' => array('cartgoods_list' => $cartgoods_list, 'cartgoods_pointall' => $cartgoods_pointall)
        );
    }

    /**
     * 礼品购物车信息单条
     *
     * @param array $condition 条件数组
     * @param array $field 查询字段
     */
    public function getPointCartInfo($where, $field = '*', $order = '', $group = '')
    {
        return db('pointscart')->field($field)->where($where)->group($group)->order($order)->find();
    }

    /**
     * 礼品购物车礼品数量
     *
     * @param array $member_id 会员ID
     */
    public function countPointCart($member_id)
    {
        $info = rcache($member_id, 'm_pointcart', 'pointcart_count');
        if (!isset($info['pointcart_count']) || $info['pointcart_count'] == 0) {
            $pointcart_count = db('pointscart')->where(array('pmember_id' => $member_id))->count();
            $pointcart_count = intval($pointcart_count);
            wcache($member_id, array('pointcart_count' => $pointcart_count), 'm_pointcart');
        }
        else {
            $pointcart_count = intval($info['pointcart_count']);
        }
        return $pointcart_count;
    }

    /**
     * 删除礼品购物车信息按照购物车编号
     * @param    mixed $pc_id 删除记录编号
     */
    public function delPointCartById($pc_id, $member_id = 0)
    {
        if (empty($pc_id)) {
            return false;
        }
        $where = array();
        if (is_array($pc_id)) {
            $where['pcart_id'] = array('in', $pc_id);
        }
        else {
            $where['pcart_id'] = $pc_id;
        }
        $result = db('pointscart')->where($where)->delete();
        //清除相关缓存
        if ($result && $member_id > 0) {
            wcache($member_id, array('pointcart_count' => null), 'm_pointcart');
        }
        return $result;
    }

    /**
     * 删除特定条件礼品购物车信息
     * @param    mixed $pc_id 删除记录编号
     */
    public function delPointCart($where, $member_id = 0)
    {
        $result = db('pointscart')->where($where)->delete();
        //清除相关缓存
        if ($result && $member_id > 0) {
            wcache($member_id, array('pointcart_count' => null), 'm_pointcart');
        }
        return $result;
    }

    /**
     * 积分礼品购物车信息修改
     *
     * @param    array $param 修改信息数组
     * @param    array $where 条件数组
     */
    public function editPointCart($where, $param)
    {
        if (empty($param)) {
            return false;
        }
        $result = db('pointscart')->where($where)->update($param);
        return $result;
    }

    /**
     * 验证是否能兑换
     */
    public function checkExchange($pgoods_id, $quantity, $member_id)
    {
        $pgoods_id = intval($pgoods_id);
        $quantity = intval($quantity);
        if ($pgoods_id <= 0 || $quantity <= 0) {
            return array('state' => false, 'error' => 'ParameterError', 'msg' => '参数错误');
        }
        $model_pointprod = Model('pointprod');
        //获取兑换商品的展示状态
        $pgoodsshowstate_arr = $model_pointprod->getPgoodsShowState();
        //获取兑换商品的开启状态
        $pgoodsopenstate_arr = $model_pointprod->getPgoodsOpenState();
        //验证积分礼品是否存在
        $prod_info = $model_pointprod->getPointProdInfo(array(
                                                            'pgoods_id' => $pgoods_id,
                                                            'pgoods_show' => $pgoodsshowstate_arr['show'][0],
                                                            'pgoods_state' => $pgoodsopenstate_arr['open'][0]
                                                        ));
        if (!$prod_info) {
            return array('state' => false, 'error' => 'ParameterError', 'msg' => '兑换礼品信息不存在');
        }

        //验证积分礼品兑换状态
        $ex_state = $model_pointprod->getPointProdExstate($prod_info);
        switch ($ex_state) {
            case 'willbe':
                return array('state' => false, 'error' => 'StateError', 'msg' => '该兑换礼品的兑换活动即将开始');
                break;
            case 'end':
                return array('state' => false, 'error' => 'StateError', 'msg' => '该兑换礼品的兑换活动已经结束');
                break;
        }

        //查询会员信息
        $model_member = Model('member');
        $member_info = $model_member->getMemberInfoByID($member_id, 'member_points,member_exppoints');

        //验证是否满足会员级别
        $member_info['member_grade'] = $model_member->getOneMemberGrade($member_info['member_exppoints']);
        if ($prod_info['pgoods_limitmgrade'] > 0 && $member_info['member_grade']['level'] < $prod_info['pgoods_limitmgrade']) {
            return array('state' => false, 'error' => 'MemberGradeError', 'msg' => '您还未达到兑换所需的会员级别，不能进行兑换');
        }

        //验证兑换数量是否合法
        $data = $this->checkPointProdExnum($prod_info, $quantity, $member_id);
        if (!$data['state']) {
            return array('state' => false, 'error' => 'StateError', 'msg' => $data['msg']);
        }
        $prod_info['quantity'] = $quantity;
        //计算消耗积分总数
        $prod_info['pointsamount'] = intval($prod_info['pgoods_points']) * intval($quantity);

        //验证积分数是否足够
        $data = $this->checkPointEnough($prod_info['pointsamount'], $member_id, $member_info);
        if (!$data['state']) {
            return array('state' => false, 'error' => 'PointsShortof', 'msg' => $data['msg']);
        }
        return array('state' => true, 'data' => array('prod_info' => $prod_info));
    }

    /**
     * 验证礼品兑换数量是否合法
     * @param array $prodinfo 礼品数组
     * @param array $quantity 兑换数量
     * @param array $member_id 会员编号
     * return array 兑换数量是否合法及其错误数组
     */
    public function checkPointProdExnum($prodinfo, $quantity, $member_id)
    {
        $data = $this->getPointProdExnum($prodinfo, $quantity, $member_id);
        if (!$data['state']) {
            return array('state' => false, 'msg' => $data['msg']);
        }
        //如果兑换数量大于可兑换数量则提示错误
        if ($data['data']['quantity'] < $quantity) {
            return array('state' => false, 'msg' => "兑换礼品数量不能大于{$data['data']['quantity']}");
        }
        return array('state' => true);
    }

    /**
     * 获得礼品可兑换数量
     * @param array $prodinfo 礼品数组
     * @param array $quantity 兑换数量
     * @param array $member_id 会员编号
     * return array 兑换数量及其错误数组
     */
    public function getPointProdExnum($prodinfo, $quantity, $member_id)
    {
        if ($quantity <= 0) {
            return array('state' => false, 'msg' => '兑换数量错误');
        }
        if ($prodinfo['pgoods_storage'] <= 0) {
            return array('state' => false, 'msg' => '该礼品已兑换完');
        }
        if ($prodinfo['pgoods_storage'] < $quantity) {
            //如果兑换数量大于库存，则兑换数量为库存数量
            $quantity = $prodinfo['pgoods_storage'];
        }
        if ($prodinfo['pgoods_islimit'] == 1 && $prodinfo['pgoods_limitnum'] < $quantity) {
            //如果兑换数量大于限兑数量，则兑换数量为限兑数量
            $quantity = $prodinfo['pgoods_limitnum'];
        }
        //查询已兑换数量，并获得剩余可兑换数量
        if ($prodinfo['pgoods_islimit'] == 1) {
            $model_pointorder = Model('pointorder');
            //获取兑换订单状态
            $pointorderstate_arr = $model_pointorder->getPointOrderStateBySign();
            $where = array();
            $where['point_goodsid'] = $prodinfo['pgoods_id'];
            $where['point_buyerid'] = $member_id;
            $where['point_orderstate'] = array('neq', $pointorderstate_arr['canceled'][0]);//未取消
            $pordergoodsinfo = $model_pointorder->getPointOrderAndGoodsInfo($where, "SUM(point_goodsnum) as exnum", '', 'point_goodsid');
            if ($pordergoodsinfo) {
                $ablenum = $prodinfo['pgoods_limitnum'] - intval($pordergoodsinfo['exnum']);
                if ($ablenum <= 0) {
                    return array('state' => false, 'msg' => '您已达到该礼品的最大兑换数，不能再兑换，请兑换其他礼品');
                }
                if ($ablenum < $quantity) {
                    $quantity = $ablenum;
                }
            }
        }
        return array('state' => true, 'data' => array('quantity' => $quantity));
    }

    /**
     * 获得某会员购物车礼品总积分
     */
    public function getPointCartAmount($member_id)
    {
        if ($member_id <= 0) {
            return array('state' => false, 'msg' => '参数错误');
        }
        $info = $this->getPointCartInfo(array('pmember_id' => $member_id), 'SUM(pgoods_points*pgoods_choosenum) as amount', '', 'pmember_id');
        $amount = intval($info['amount']);
        return $amount;
    }

    /**
     * 获得符合条件的购物车商品列表同时计算运费、总积分数等信息，用于下单过程
     */
    public function getCartGoodsList($member_id)
    {
        $return_array = array();
        //获取礼品购物车内信息
        $cartgoodslist_tmp = $this->getPointCartList(array('pmember_id' => $member_id));
        if (!$cartgoodslist_tmp) {
            return array('state' => false, 'msg' => '购物车信息错误');
        }
        $cartgoodslist = array();
        foreach ($cartgoodslist_tmp as $v) {
            $cartgoodslist[$v['pgoods_id']] = $v;
        }
        //购物车礼品ID数组
        $cartgoodsid_arr = array_keys($cartgoodslist);

        //查询积分礼品信息
        $model_pointprod = Model('pointprod');
        $pointprod_list = $model_pointprod->getOnlinePointProdList(array('pgoods_id' => array('in', $cartgoodsid_arr)));
        if (!$pointprod_list) {
            return array('state' => false, 'msg' => '购物车信息错误');
        }
        unset($cartgoodsid_arr);
        unset($cartgoodslist_tmp);

        $cart_delid_arr = array();//应删除的购物车信息
        $pgoods_pointall = 0;//积分总数

        //查询会员信息
        $model_member = Model('member');
        $member_info = $model_member->getMemberInfoByID(session('member_id'));
        $member_info['member_grade'] = $model_member->getOneMemberGrade($member_info['member_exppoints']);

        //处理购物车礼品信息
        foreach ($pointprod_list as $k => $v) {
            //验证是否满足会员级别
            if ($v['pgoods_limitmgrade'] > 0 && $member_info['member_grade']['level'] < $v['pgoods_limitmgrade']) {
                $cart_delid_arr[] = $cartgoodslist[$v['pgoods_id']]['pcart_id'];
                unset($pointprod_list[$k]);
                break;
            }

            //验证积分礼品兑换状态
            $ex_state = $model_pointprod->getPointProdExstate($v);
            switch ($ex_state) {
                case 'going':
                    //验证兑换数量是否合法
                    $data = $this->getPointProdExnum($v, $cartgoodslist[$v['pgoods_id']]['pgoods_choosenum'], $member_id);
                    if (!$data['state']) {
                        //删除积分礼品兑换信息
                        $cart_delid_arr[] = $cartgoodslist[$v['pgoods_id']]['pcart_id'];
                        unset($pointprod_list[$k]);
                    }
                    else {
                        $quantity = $data['data']['quantity'];
                        $pointprod_list[$k]['quantity'] = $quantity;

                        //计算单件礼品积分数
                        $pointprod_list[$k]['onepoints'] = $quantity * intval($v['pgoods_points']);

                        //计算所有礼品积分数
                        $pgoods_pointall = $pgoods_pointall + $pointprod_list[$k]['onepoints'];

                    }
                    break;
                default:
                    //删除积分礼品兑换信息
                    $cart_delid_arr[] = $cartgoodslist[$v['pgoods_id']]['pcart_id'];
                    unset($pointprod_list[$k]);
                    break;
            }
        }

        //删除不符合条件的礼品购物车信息
        if (is_array($cart_delid_arr) && count($cart_delid_arr) > 0) {
            $this->delPointCartById($cart_delid_arr, $member_id);
        }
        if (!$pointprod_list) {
            return array('state' => false, 'msg' => '购物车信息错误');
        }
        return array(
            'state' => true, 'data' => array('pointprod_list' => $pointprod_list, 'pgoods_pointall' => $pgoods_pointall)
        );
    }

    /**
     * 验证积分是否足够
     * @param $points int 所需积分
     * @param $member_id int 会员ID
     * @param $member_info array 会员详细信息，不必须
     * @return 积分是否足够
     */
    public function checkPointEnough($points, $member_id, $member_info = array())
    {
        $points = intval($points);
        if ($member_id <= 0) {
            return array('state' => false, 'msg' => '会员信息错误');
        }
        if (!$member_info) {
            $member_info = Model('member')->getMemberInfoByID($member_id, 'member_points');
        }
        if (intval($member_info['member_points']) < $points) {
            return array('state' => false, 'msg' => '积分不足，暂时不能兑换');
        }
        return array('state' => true);
    }
}