<?php
//  ---------------------------------------------------------------------------------
//    _____   _             _                   _   _____
//   |  __ \ | |           | |    /\           (_) |  __ \
//   | |__) || |__    __ _ | |   /  \    _ __   _  | |__) |_ __  ___
//   |  ___/ | '_ \  / _` || |  / /\ \  | '_ \ | | |  ___/| '__|/ _ \
//   | |     | | | || (_| || | / ____ \ | |_) || | | |    | |  | (_) |
//   |_|     |_| |_| \__,_||_|/_/    \_\| .__/ |_| |_|    |_|   \___/
//                                      | |
//                                      |_|
//   PhalApi Pro 专业版
//   广州果创网络科技有限公司
//
//  ---------------------------------------------------------------------------------
//
//   一、协议的许可和权利
//    1. 您可以在完全遵守本协议的基础上，将本软件应用于商业用途；
//    2. 您可以在协议规定的约束和限制范围内修改本产品源代码或界面风格以适应您的要求；
//    3. 您拥有使用本产品中的全部内容资料、商品信息及其他信息的所有权，并独立承担与其内容相关的
//       法律义务；
//    4. 获得商业授权之后，您可以将本软件应用于商业用途，自授权时刻起，在技术支持期限内拥有通过
//       指定的方式获得指定范围内的技术支持服务；
//
//   二、协议的约束和限制
//    1. 未获商业授权之前，禁止将本软件用于商业用途（包括但不限于企业法人经营的产品、经营性产品
//       以及以盈利为目的或实现盈利产品）；
//    2. 未获商业授权之前，禁止在本产品的整体或在任何部分基础上发展任何派生版本、修改版本或第三
//       方版本用于重新开发；
//    3. 如果您未能遵守本协议的条款，您的授权将被终止，所被许可的权利将被收回并承担相应法律责任；
//
//   三、有限担保和免责声明
//    1. 本软件及所附带的文件是作为不提供任何明确的或隐含的赔偿或担保的形式提供的；
//    2. 用户出于自愿而使用本软件，您必须了解使用本软件的风险，在尚未获得商业授权之前，我们不承
//       诺提供任何形式的技术支持、使用担保，也不承担任何因使用本软件而产生问题的相关责任；
//    3. 广州果创网络科技有限公司不对使用本产品构建的商城中的内容信息承担责任，但在不侵犯用户隐
//       私信息的前提下，保留以任何方式获取用户信息及商品信息的权利；
//
//   有关本产品最终用户授权协议、商业授权与技术服务的详细内容，均由广州果创网络科技有限公司独家
//   提供。广州果创网络科技有限公司拥有在不事先通知的情况下，修改授权协议的权力，修改后的协议对
//   改变之日起的新授权用户生效。电子文本形式的授权协议如同双方书面签署的协议一样，具有完全的和
//   等同的法律效力。您一旦开始修改、安装或使用本产品，即被视为完全理解并接受本协议的各项条款，
//   在享有上述条款授予的权力的同时，受到相关的约束和限制。协议许可范围以外的行为，将直接违反本
//   授权协议并构成侵权，我们有权随时终止授权，责令停止损害，并保留追究相关责任的权力。
//
//  ---------------------------------------------------------------------------------

namespace Admin\Api\Mall;

use Admin\Common\Api;
use Mall\Domain\Product as ProductDomain;
use PhalApi\Exception\BadRequestException;

/**
 * 商城产品套餐
 */
class Product extends Api {

    public function getRules() {
        return array(
            'createProduct' => array(
                'product_key' => array('name' => 'product_key', 'desc' => '产品key，对应接口英文名称，例如：App.Hello.Say', 'max' => 100, 'require' => true),
                'product_name' => array('name' => 'product_name', 'desc' => '产品名称', 'max' => 200, 'require' => true),
                'product_type' => array('name' => 'product_type', 'desc' => '产品类型，api_free为免费试用接口流量，api_buy为付费购买接口流量', 'max' => 50, 'require' => true),
                'price' => array('name' => 'price', 'desc' => '产品售价，单位：元', 'require' => true, 'min' => 0, 'type' => 'float'),
                'original_price' => array('name' => 'original_price', 'desc' => '产品原始价格，用于对比，单位：元', 'default' => 0, 'min' => 0, 'type' => 'float'),
                'amount' => array('name' => 'amount', 'desc' => '产品规格数量，例如接口流量多少次', 'require' => true, 'type' => 'int', 'min' => 1),
                'expire_time' => array('name' => 'expire_time', 'desc' => '产品有效时间，单位：秒，多少秒内有效', 'type' => 'int', 'min' => 1, 'default' => 86400),
                'product_desc' => array('name' => 'product_desc', 'desc' => '套餐说明，支持富文本'),
                'product_status' => array('name' => 'product_status', 'desc' => '产品状态，0关闭1正常', 'type' => 'int', 'min' => 0, 'max' => 1, 'default' => 1),
                'product_key_more' => array('name' => 'product_key_more', 'type' => 'array', 'default' => array(), 'format' => 'explode', 'seperator' => ',', 'desc' => '组合套餐'),
            ),
            'updateProduct' => array(
                'id' => array('name' => 'id', 'require' => true, 'desc' => 'ID', 'type' => 'int'),
                'product_key' => array('name' => 'product_key', 'desc' => '产品key，对应接口英文名称，例如：App.Hello.Say', 'max' => 100, 'require' => true),
                'product_type' => array('name' => 'product_type', 'desc' => '产品类型，api_free为免费试用接口流量，api_buy为付费购买接口流量', 'max' => 50, 'require' => true),
                'product_name' => array('name' => 'product_name', 'desc' => '产品名称', 'max' => 200, 'require' => true),
                'price' => array('name' => 'price', 'desc' => '产品售价，单位：元', 'require' => true, 'min' => 0, 'type' => 'float'),
                'original_price' => array('name' => 'original_price', 'desc' => '产品原始价格，用于对比，单位：元', 'default' => 0, 'min' => 0, 'type' => 'float'),
                'amount' => array('name' => 'amount', 'desc' => '产品规格数量，例如接口流量多少次', 'require' => true, 'type' => 'int', 'min' => 1),
                'expire_time' => array('name' => 'expire_time', 'desc' => '产品有效时间，单位：秒，多少秒内有效', 'type' => 'int', 'min' => 1, 'default' => 86400),
                'product_desc' => array('name' => 'product_desc', 'desc' => '套餐说明，支持富文本'),
                'product_status' => array('name' => 'product_status', 'desc' => '产品状态，0关闭1正常', 'type' => 'int', 'min' => 0, 'max' => 1, 'default' => 1),
                'product_key_more' => array('name' => 'product_key_more', 'type' => 'array', 'default' => array(), 'format' => 'explode', 'seperator' => ',', 'desc' => '组合套餐'),
            ),
            'getProduct' => array(
                'id' => array('name' => 'id', 'require' => true, 'desc' => 'ID', 'type' => 'int'),
            ),
            'deleteProduct' => array(
                'id' => array('name' => 'id', 'require' => true, 'desc' => 'ID', 'type' => 'int'),
            ),
            'getProductList' => array(
                'page' => array('name' => 'page', 'type' => 'int', 'default' => 1,  'desc' => '当前页数'),
                'perpage' => array('name' => 'perpage', 'type' => 'int', 'default' => 10, 'desc' => '每页多少条'),
            ),
            'getPayProductListForMore' => array(
            ),
        );
    }

    /**
     * 获取商品套餐的有效时间列表
     * @desc 获取商品套餐的有效时间列表
     */
    public function getExpireTimeList() {
        $map = \PhalApi\DI()->config->get('mall.product_expire_time_list');
        $list = array();
        foreach ($map as $key => $val) {
            $list[] = array('key' => $key, 'name' => $val);
        }
        return $list;
    }

    /**
     * 添加套餐
     * @desc 添加新套餐
     * @return int id 新套餐ID
     */
    public function createProduct() {
        $domain = new ProductDomain();
        
        sort($this->product_key_more, SORT_NUMERIC);
        
        $product = array(
            'product_key' => $this->product_type == 'product_more' ? implode(',', $this->product_key_more) : $this->product_key,
            'product_name' => $this->product_name,
            'product_type' => $this->product_type,
            'price' => $this->price,
            'original_price' => $this->original_price,
            'amount' => $this->product_type == 'product_more' ? 1 : $this->amount, // 组合数量为1
            'expire_time' => $this->expire_time,
            'product_desc' => $this->product_desc,
            'product_status' => $this->product_status,
        );
        
        if ($this->product_type == 'product_more' && empty($product['product_key'])) {
            throw new BadRequestException(\PhalApi\T('product_key_more can not empty'));
        }
            
        $id = $domain->createProduct($product);
        return array('id' => $id);
    }

    /**
     * 更新修改套餐
     * @desc 更新修改套餐
     * @return bool isUpdate  是否更新
     */
    public function updateProduct() {
        $domain = new ProductDomain();
        
        sort($this->product_key_more, SORT_NUMERIC);
        
        $product = array(
            'product_key' => $this->product_type == 'product_more' ? implode(',', $this->product_key_more) : $this->product_key,
            'product_name' => $this->product_name,
            'price' => $this->price,
            'original_price' => $this->original_price,
            'amount' => $this->product_type == 'product_more' ? 1 : $this->amount, // 组合数量为1
            'expire_time' => $this->expire_time,
            'product_desc' => $this->product_desc,
            'product_status' => $this->product_status,
        );
        
        if ($this->product_type == 'product_more' && empty($product['product_key'])) {
            throw new BadRequestException(\PhalApi\T('product_key_more can not empty'));
        }
        
        $isUpdate = $domain->updateProduct($this->id, $product);
        return array('isUpdate' => $isUpdate);
    }

    /**
     * 获取套餐详情
     * @desc 获取套餐详情
     * @return object product 没找到时为Null
     */
    public function getProduct() {
        $domain = new ProductDomain();
        $product = $domain->getProduct($this->id);
        return array('product' => $product);
    }

    /**
     * 删除套餐
     * @desc 删除套餐
     * @return bool isDelete  是否删除
     */
    public function deleteProduct() {
        $domain = new ProductDomain();
        $isDelete = $domain->deleteProduct($this->id);
        return array('isDelete' => $isDelete);
    }

    /**
     * 获取套餐列表
     * @desc 获取套餐列表
     * @return int   total   总条数
     * @return int   page    当前页数
     * @return int   perpage 每页条数
     * @return array items   计划任务数据
     * @return int items.id  id
     */
    public function getProductList() {
        $domain = new ProductDomain();
        return $domain->getProductList($this->page, $this->perpage);
    }

    /**
     * 获取付费套餐列表
     * @desc 方便组合套餐
     */
    public function getPayProductListForMore() {
        $domain = new ProductDomain();
        return $domain->getPayProductListForMore();
    }
}
