<?php
/**
 * Created by PhpStorm.
 * User: leo
 * Date: 2018/2/24
 * Time: 下午12:48
 */

namespace backendApi\modules\v1\controllers;

use backendApi\modules\v1\models\exportForms\OrderExportForm;
use backendApi\modules\v1\models\exportForms\ShopExportForm;
use backendApi\modules\v1\models\lists\shop\DecOrderList;
use backendApi\modules\v1\models\lists\shop\GoodsList;
use backendApi\modules\v1\models\lists\shop\OrderDecList;
use backendApi\modules\v1\models\lists\shop\OrderList;
use backendApi\modules\v1\models\lists\shop\OrderShopList;
use backendApi\modules\v1\models\lists\shop\OrderStandardList;
use backendApi\modules\v1\models\lists\shop\PackageList;
use common\helpers\Cache;
use common\helpers\Date;
use common\helpers\Form;
use common\helpers\Log;
use common\helpers\snowflake\SnowFake;
use common\libs\export\module\ShopExport;
use common\models\DeclarationPackage;
use common\models\DecOrder;
use common\models\ExcelOrderShop;
use common\models\forms\DecPackageForm;
use common\models\forms\ExcelOrderDecForm;
use common\models\forms\ExcelOrderShopForm;
use common\models\forms\ExcelOrderStandardForm;
use common\models\forms\OrderForm;
use common\models\forms\ShopGoodsForm;
use common\models\forms\UploadForm;
use common\models\ShopGoods;
use yii\web\UploadedFile;
use yii\base\Exception;

class ShopController extends BaseController {
    public $modelClass = DecOrder::class;

    public function behaviors() {
        $behaviors = parent::behaviors();
        //$behaviors['contentNegotiator']['formats']['text/html'] = Response::FORMAT_JSON;
        return $behaviors;
    }

    /**
     * 商品列表
     * @return mixed
     * @throws Exception
     * @throws \yii\web\HttpException
     */
    public function actionIndex() {
        $filter = $this->filterCondition([
            'TYPE'=> 'TYPE',
            'STATUS'=> 'STATUS',
            'GOODS_NAME'=> 'GOODS_NAME',
            'GOODS_NO'=> 'GOODS_NO',
            'SELL_TYPE'=> 'SELL_TYPE',
            'SELL_PRICE'=> 'SELL_PRICE',
            'PRICE_PV'=> 'PRICE_PV',
        ]);
        $condition = $filter['condition'];
        $params = $filter['params'];
        $condition .= ' ';
        $listObj = new GoodsList();
        $data = $listObj->getList(['condition'=>$condition, 'params'=>$params]);
        return static::notice($data);
    }

    /**
     * 商品列表导出
     * @return mixed
     * @throws \yii\db\Exception
     * @throws \yii\web\HttpException
     */
    public function actionGoodsListExport()
    {
        $filter = $this->filterCondition([
            'TYPE'=> 'TYPE',
            'STATUS'=> 'STATUS',
            'GOODS_NAME'=> 'GOODS_NAME',
            'GOODS_NO'=> 'GOODS_NO',
            'SELL_TYPE'=> 'SELL_TYPE',
            'SELL_PRICE'=> 'SELL_PRICE',
            'PRICE_PV'=> 'PRICE_PV',
        ]);
        $form = new ShopExportForm();
        $result = $form->run($filter, '商品列表');
        if (!$result) {
            return static::notice(Form::formatErrorsForApi($form->getErrors()), 400);
        }
        return static::notice('导出开始，请到文件管理-导出文件查看');
    }

    /**
     * 添加商品
     * @return mixed
     * @throws Exception
     * @throws \yii\web\HttpException
     */
    public function actionGoodsAdd() {
        if (\Yii::$app->request->isPost) {
            $formModel = new ShopGoodsForm();
            $formModel->scenario = 'add';
            if ($formModel->load(\Yii::$app->request->post(), '') && $result = $formModel->add()) {
                return static::notice('商品添加成功');
            } else {
                return static::notice(Form::formatErrorsForApi($formModel->getErrors()),400);
            }
        }
        return static::notice(['sellType' => ShopGoods::SALE_TYPE, 'goodsType' => ShopGoods::GOODS_TYPE]);
    }

    /**
     * 编辑商品
     * @return mixed
     * @throws Exception
     * @throws \yii\web\HttpException
     */
    public function actionGoodsEdit() {
        $id = \Yii::$app->request->get('id');
        if (\Yii::$app->request->isPost) {
            $formModel = new ShopGoodsForm();
            $formModel->scenario = 'edit';
            $formModel->id = $id;
            if ($formModel->load(\Yii::$app->request->post(), '') && $result = $formModel->edit()) {
                return static::notice('商品编辑成功');
            } else {
                return static::notice(Form::formatErrorsForApi($formModel->getErrors()),400);
            }
        }
        $data = ShopGoods::findOneAsArray('ID=:ID', [':ID' => $id]);
        $data['SELL_TYPE'] = explode(',',$data['SELL_TYPE']);
        return static::notice(['goodsInfo'=>$data,'sellType' => ShopGoods::SALE_TYPE, 'goodsType' => ShopGoods::GOODS_TYPE]);
    }

    /**
     * 上传图片
     * @return mixed
     * @throws \yii\base\Exception
     * @throws \yii\db\Exception
     * @throws \yii\web\HttpException
     */
    public function actionUpload(){
        if(\Yii::$app->request->isPost){
            $formModel = new UploadForm();
            $formModel->scenario = 'goodsImg';
            $formModel->file = UploadedFile::getInstanceByName('file');
            $formModel->token = \Yii::$app->request->request('uploadToken');
            if($formModel->file && $uploader = $formModel->upload()){
                return static::notice($uploader->URL);
            } else {
                return static::notice(Form::formatErrorsForApi($formModel->getErrors()), 400);
            }
        } else {
            $token = Cache::setUploadToken();
            return static::notice($token);
        }
    }

    /**
     * 商品上下架
     * @return mixed
     * @throws Exception
     */
    public function actionGoodsStatus() {
        $id = \Yii::$app->request->get('id');
        if (\Yii::$app->request->isPost) {
            $formModel = new ShopGoodsForm();
            $formModel->scenario = 'changeStatus';
            if ($formModel->load(\Yii::$app->request->post(), '') && $result = $formModel->changeStatus()) {
//                foreach ($result['logs'] as $k => $value) {
//                     Log::adminHandle('改变商品状态至' . ShopGoods::STATUS_NAME[$result['status']], 1, $k);
//                }
                return static::notice('状态设置成功');
            } else {
                return static::notice(Form::formatErrorsForApi($formModel->getErrors()), 400);
            }
        }
    }

    /**
     * 删除商品
     * @return mixed
     * @throws \yii\db\Exception
     * @throws \yii\web\HttpException
     */
    public function actionGoodsDelete(){
        $result = static::delete(ShopGoods::class);
        return $result;
    }

    /**
     * 套餐列表
     * @return mixed
     * @throws Exception
     * @throws \yii\web\HttpException
     */
    public function actionPackage() {
        $filter = $this->filterCondition([
            'LEVEL_NAME'=> 'DP.LEVEL_ID',
            'PACKAGE_NAME'=> 'DP.PACKAGE_NAME',
            'AMOUNT'=> 'DP.AMOUNT',
            'PV'=> 'DP.PV',
            'STATUS'=> 'DP.STATUS',
        ]);
        $condition = $filter['condition'];
        $params = $filter['params'];
        $condition .= ' AND DP.IS_DEL=0';
        $listObj = new PackageList();
        $data = $listObj->getList(['condition'=>$condition, 'params'=>$params]);
        return static::notice($data);
    }

    /**
     * 添加报单套餐
     * @return mixed
     * @throws \yii\web\HttpException
     */
    public function actionPackageAdd() {
        if (\Yii::$app->request->isPost) {
            return static::edit(DecPackageForm::class, '报单套餐添加成功', 'add', null, null, function () {
                // Log::adminHandle('添加报单套餐', 1);
            });
        }
        return static::notice('非发请求', 405);
    }

    /**
     * 报单套餐获取
     * @return mixed
     * @throws \yii\web\HttpException
     */
    public function actionPackageGet() {
        $id = \Yii::$app->request->get('id');
        if (\Yii::$app->request->isPost) {
            return static::edit(DecPackageForm::class, '套餐编辑成功', 'edit', null, null, function () {
                // Log::adminHandle('编辑报单套餐', 1);
            });
        }
        $package = DeclarationPackage::findOneAsArray('ID=:ID', [':ID' => $id]);
        return static::notice(['id' => $package['ID'], 'packageName' => $package['PACKAGE_NAME'],'packageNo' => $package['PACKAGE_NO'], 'amount' => $package['AMOUNT'], 'amountPv' => $package['PV'], 'levelId' => $package['LEVEL_ID'], 'packageContent' => $package['PACKAGE_CONTENT']]);
    }

    /**
     * 套餐上下架
     * @return mixed
     * @throws Exception
     */
    public function actionPackageStatus() {
        $id = \Yii::$app->request->get('id');
        if (\Yii::$app->request->isPost) {
            $formModel = new DecPackageForm();
            $formModel->scenario = 'changeStatus';
            if ($formModel->load(\Yii::$app->request->post(), '') && $result = $formModel->changeStatus()) {

                return static::notice('状态设置成功');
            } else {
                return static::notice(Form::formatErrorsForApi($formModel->getErrors()), 400);
            }
        }
    }

    /**
     * 删除套餐
     * @return mixed
     * @throws \yii\db\Exception
     * @throws \yii\web\HttpException
     */
    public function actionPackageDelete(){
        $result = static::delete(DeclarationPackage::class);
        return $result;
    }


    /**
     * 报单表
     * @return mixed
     * @throws Exception
     * @throws \yii\web\HttpException
     */
    public function actionDecOrderList() {
        $filter = $this->filterCondition([
            'DEC_SN'=> 'DO.DEC_SN',
            'ORDER_SN'=> 'DO.ORDER_SN',
            'USER_NAME'=> 'U.USER_NAME',
            'TO_USER_NAME'=> 'TU.USER_NAME',
            'REAL_NAME'=> 'TU.REAL_NAME',
            'ID_CARD'=> 'TU.ID_CARD',
            'MOBILE'=> 'TU.MOBILE',
            'DEC_LV_NAME' => 'TU.DEC_LV',
            'DEC_REAL_NAME'=> 'DU.REAL_NAME',
            'DEC_AMOUNT'=> 'DO.DEC_AMOUNT',
            'DEC_PV'=> 'DO.DEC_PV',
            'PERIOD_NUM'=> 'DO.PERIOD_NUM',
            'REC_USER_NAME'=> 'RU.USER_NAME',
            'CREATED_AT'=> 'DO.CREATED_AT',
            'UPDATED_AT'=> 'DO.UPDATED_AT',
        ]);
        $condition = $filter['condition'];
        $params = $filter['params'];
        $condition .= ' AND DO.IS_DEL=0';
        $listObj = new DecOrderList();
        $data = $listObj->getList(['condition'=>$condition, 'params'=>$params]);
        return static::notice($data);
    }

    /**
     * 报单表导出
     * @return mixed
     * @throws \yii\db\Exception
     * @throws \yii\web\HttpException
     */
    public function actionDecOrderListExport()
    {
        $filter = $this->filterCondition([
            'DEC_SN'=> 'DO.DEC_SN',
            'ORDER_SN'=> 'DO.ORDER_SN',
            'USER_NAME'=> 'U.USER_NAME',
            'TO_USER_NAME'=> 'TU.USER_NAME',
            'DEC_AMOUNT'=> 'DO.DEC_AMOUNT',
            'DEC_PV'=> 'DO.DEC_PV',
            'PERIOD_NUM'=> 'DO.PERIOD_NUM',
            'CREATED_AT'=> 'DO.CREATED_AT',
            'UPDATED_AT'=> 'DO.UPDATED_AT',
        ]);
        $filter['condition'] .= ' AND DO.IS_DEL=0';
        $form = new ShopExportForm();
        $result = $form->run($filter, '报单列表');
        if (!$result) {
            return static::notice(Form::formatErrorsForApi($form->getErrors()), 400);
        }
        return static::notice('导出开始，请到文件管理-导出文件查看');
    }

    /**
     * 订单表
     * @return mixed
     * @throws Exception
     * @throws \yii\web\HttpException
     */
    public function actionOrderList() {
        $filter = $this->filterCondition([
            'SN'=> 'O.SN',
            'USER_NAME'=> 'U.USER_NAME',
            'MOBILE'=> 'O.MOBILE',
            'PERIOD_NUM'=> 'O.PERIOD_NUM',
            'CREATED_AT'=> 'O.CREATED_AT',
        ]);
        $condition = $filter['condition'];
        $params = $filter['params'];
        $condition .= ' AND O.IS_DELETE=0';
        $listObj = new OrderList();
        $data = $listObj->getList(['condition'=>$condition, 'params'=>$params]);
        return static::notice($data);
    }

    /**
     * 订单表导出
     * @return mixed
     * @throws \yii\db\Exception
     * @throws \yii\web\HttpException
     */
    public function actionOrderListExport()
    {
        $filter = $this->filterCondition([
            'SN'=> 'O.SN',
            'USER_NAME'=> 'U.USER_NAME',
            'MOBILE'=> 'O.MOBILE',
            'PERIOD_NUM'=> 'O.PERIOD_NUM',
            'CREATED_AT'=> 'O.CREATED_AT',
        ]);
        $filter['condition'] .= ' AND O.IS_DELETE=0';
        $form = new ShopExportForm();
        $result = $form->run($filter, '订单列表');
        if (!$result) {
            return static::notice(Form::formatErrorsForApi($form->getErrors()), 400);
        }
        return static::notice('导出开始，请到文件管理-导出文件查看');
    }

    /**
     * 外部商城订单列表
     * @return mixed
     * @throws Exception
     * @throws \yii\web\HttpException
     */
    public function actionOrderShopList() {
        $filter = $this->filterCondition([
            'SN'=> 'O.SN',
            'USER_NAME'=> 'U.USER_NAME',
            'PERIOD_NUM'=> 'O.PERIOD_NUM',
            'CREATED_AT'=> 'O.CREATED_AT',
        ]);
        $condition = $filter['condition'];
        $params = $filter['params'];
        $condition .= ' AND O.IS_DELETE=0';
        $listObj = new OrderShopList();
        $data = $listObj->getList(['condition'=>$condition, 'params'=>$params]);
        return static::notice($data);
    }

    /**
     * 外部商城报单列表
     * @return mixed
     * @throws Exception
     * @throws \yii\web\HttpException
     */
    public function actionOrderDecList() {
        $filter = $this->filterCondition([
            'SN'=> 'O.SN',
            'USER_NAME'=> 'U.USER_NAME',
            'PERIOD_NUM'=> 'O.PERIOD_NUM',
            'CREATED_AT'=> 'O.CREATED_AT',
        ]);
        $condition = $filter['condition'];
        $params = $filter['params'];
        $condition .= ' AND O.IS_DELETE=0';
        $listObj = new OrderDecList();
        $data = $listObj->getList(['condition'=>$condition, 'params'=>$params]);
        return static::notice($data);
    }

    /**
     * 分页导入excel文件到待导入数据的表中
     * @return mixed
     */
    public function actionImportOrderShopToExcelTable()
    {
        // 先上传到服务器文件
        if (\Yii::$app->request->isPost) {
            $excelImportId = \Yii::$app->request->post('excelImportId');
            $rowCount = \Yii::$app->request->post('rowCount');
            //$periodNum = \Yii::$app->request->post('periodNum');
            $orderDay = \Yii::$app->request->post('orderDay');
            $orderType = \Yii::$app->request->post('orderType');
            $startRow = \Yii::$app->request->post('startRow');
            $limit = \Yii::$app->request->post('limit', 1000);
            $errorMsg = '';
            try {
                if( $startRow == 1 ) {
                    $excelOrderShop = new ExcelOrderShopForm();
                    $excelOrderShop->checkStatus($orderDay,$orderType);
                }
                $excel = new \common\helpers\Excel();
                $result = $excel->pageImportCustomDataFromExcel('orderShop', $excelImportId, $rowCount, $startRow, $limit,$orderDay,$orderType);
            } catch (\Exception $e) {
                $result = false;
                $errorMsg = $e->getMessage();
            }
            // 还有数据
            if ($result === 1) {
                return static::notice(['finish' => false]);
            } elseif ($result === 0) {
                return static::notice(['finish' => true]);
            } else {
                return static::notice('发生错误：' . $errorMsg, 400);
            }
        }
    }

    /**
     * 导入完成标记
     * @return mixed
     * @throws \yii\web\HttpException
     */
    public function actionImportOrderShop() {
        //$periodNum = \Yii::$app->request->post('periodNum');
        $orderDay = \Yii::$app->request->post('orderDay');
        $orderType = \Yii::$app->request->post('orderType');
        $excelOrderShop = new ExcelOrderShopForm();
        $finishStatus = $excelOrderShop->finished($orderDay,$orderType);
        if ($finishStatus) {
            return static::notice(['finish' => true]);
        } else {
            return static::notice('状态更新错误', 400);
        }
    }


    /**
     * 报单订单——分页导入excel文件到待导入数据的表中
     * @return mixed
     */
    public function actionImportOrderDecToExcelTable()
    {
        // 先上传到服务器文件
        if (\Yii::$app->request->isPost) {
            $excelImportId = \Yii::$app->request->post('excelImportId');
            $rowCount = \Yii::$app->request->post('rowCount');
            //$periodNum = \Yii::$app->request->post('periodNum');
            $orderDay = \Yii::$app->request->post('orderDay');
            $startRow = \Yii::$app->request->post('startRow');
            $limit = \Yii::$app->request->post('limit', 1000);
            $errorMsg = '';
            try {
                if( $startRow == 1 ) {
                    $excelOrderShop = new ExcelOrderDecForm();
                    $excelOrderShop->checkStatus($orderDay);
                }
                $excel = new \common\helpers\Excel();
                $result = $excel->pageImportCustomDataFromExcel('orderDec', $excelImportId, $rowCount, $startRow, $limit,$orderDay);
            } catch (\Exception $e) {
                $result = false;
                $errorMsg = $e->getMessage();
            }
            // 还有数据
            if ($result === 1) {
                return static::notice(['finish' => false]);
            } elseif ($result === 0) {
                return static::notice(['finish' => true]);
            } else {
                return static::notice('发生错误：' . $errorMsg, 400);
            }
        }
    }

    /**
     * 报单订单导入完成标记
     * @return mixed
     * @throws \yii\web\HttpException
     */
    public function actionImportOrderDec() {
        //$periodNum = \Yii::$app->request->post('periodNum');
        $orderDay = \Yii::$app->request->post('orderDay');
        $excelOrderShop = new ExcelOrderDecForm();
        $finishStatus = $excelOrderShop->finished($orderDay);
        if ($finishStatus) {
            return static::notice(['finish' => true]);
        } else {
            return static::notice('状态更新错误', 400);
        }
    }


    /**
     * 见习达标订单列表
     * @return mixed
     * @throws Exception
     * @throws \yii\web\HttpException
     */
    public function actionOrderStandardList() {
        $filter = $this->filterCondition([
            'SN'=> 'O.SN',
            'USER_NAME'=> 'U.USER_NAME',
            'PERIOD_NUM'=> 'O.PERIOD_NUM',
            'CREATED_AT'=> 'O.CREATED_AT',
        ]);
        $condition = $filter['condition'];
        $params = $filter['params'];
        $condition .= ' AND O.IS_DELETE=0';
        $listObj = new OrderStandardList();
        $data = $listObj->getList(['condition'=>$condition, 'params'=>$params]);
        return static::notice($data);
    }

    /**
     * 分页导入excel文件到待导入数据的表中
     * @return mixed
     * @throws \yii\web\HttpException
     */
    public function actionImportOrderStandardToExcelTable()
    {
        // 先上传到服务器文件
        if (\Yii::$app->request->isPost) {
            $excelImportId = \Yii::$app->request->post('excelImportId');
            $rowCount = \Yii::$app->request->post('rowCount');
            //$periodNum = \Yii::$app->request->post('periodNum');
            $orderMonth = \Yii::$app->request->post('orderMonth');
//            $orderType = \Yii::$app->request->post('orderType');
            $orderType = 'cash';
            $startRow = \Yii::$app->request->post('startRow');
            $limit = \Yii::$app->request->post('limit', 1000);
            $errorMsg = '';
            try {
                if( $startRow == 1 ) {
                    //清空已经导入的表数据
                    $excelOrderStandard = new ExcelOrderStandardForm();
                    $excelOrderStandard->checkStatus($orderMonth);
                }
                $excel = new \common\helpers\Excel();
                $result = $excel->pageImportCustomDataFromExcel('orderShopStandard', $excelImportId, $rowCount, $startRow, $limit,$orderMonth,$orderType);
            } catch (Exception $e) {
                $result = false;
                $errorMsg = $e->getMessage();
            }
            // 还有数据
            if ($result === 1) {
                return static::notice(['finish' => false]);
            } elseif ($result === 0) {
                return static::notice(['finish' => true]);
            } else {
                return static::notice('发生错误：' . $errorMsg, 400);
            }
        }
    }

    /**
     * 达标订单导入完成标记
     * @return mixed
     * @throws \yii\web\HttpException
     */
    public function actionImportOrderStandard() {
        $orderMonth = \Yii::$app->request->post('orderMonth');
        $excelOrderStandard = new ExcelOrderStandardForm();
        $finishStatus = $excelOrderStandard->finished($orderMonth);
        if ($finishStatus) {
            return static::notice(['finish' => true]);
        } else {
            return static::notice('状态更新错误', 400);
        }
    }

    /**
     * 管理员发货
     * @return mixed
     * @throws \yii\web\HttpException
     */
    public function actionOrderDelivery() {
        if(\Yii::$app->request->isPost) {
            return parent::edit(OrderForm::class, '发货成功', 'adminDelivery', ['adminDelivery']);
        }
        return static::notice('非法请求', 400);
    }

}