<?php
/**
 * Created by PhpStorm.
 * User:  NODELOG
 * Date: 2017/4/14
 * Time: 下午10:49
 */

namespace api\modules\v1\controllers;


use api\common\controllers\Controller;
use api\modules\v1\models\Category;
use api\modules\v1\models\Team;
use api\modules\v1\models\TeamMember;
use common\enums\CodeEnum;
use common\helpers\Regexp;
use common\helpers\Util;
use common\models\Article;
use common\models\Page;
use common\modules\attachment\components\UploadedFile;
use common\modules\attachment\models\Attachment;
use common\modules\config\models\Config;
use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
use PhpOffice\PhpSpreadsheet\IOFactory;
use Yii;
use yii\captcha\Captcha;
use yii\helpers\ArrayHelper;
use yii\helpers\StringHelper;
use yii\web\Response;

class CommonController extends Controller
{

    /**
     * 单页内容
     * @return array
     */
    public function actionPage()
    {
        $slug = request('slug');
        if (!$slug) {
            return ['errcode' => CodeEnum::CODE_ERROR, 'errmsg' => '页面未找到'];
        }

        $page = Page::findOne(['slug' => $slug]);
        if (empty($page)) {
            return ['errcode' => CodeEnum::CODE_ERROR, 'errmsg' => '页面未找到'];
        }

        return ['data' => $page];
    }

    /**
     * @return array
     * @api {get} /v1/common/configs 平台配置
     * @apiGroup 通用接口
     * @apiVersion 1.0.0
     *
     * @apiSuccess {Number} errcode    状态码,0:请求成功
     * @apiSuccess {String} errmsg   提示信息
     * @apiSuccess {Object} data    配置信息
     *
     * @apiError {Number} errcode    状态码,500:请求失败
     * @apiError {String} errmsg   提示信息
     *
     * @apiSuccessExample {json} 成功响应:
     * {"errcode":0,"errmsg":"ok","data":{}}
     *
     * @apiErrorExample {json} 失败响应:
     * {"errcode":500,"errmsg":"请求失败"}
     *
     * @author nodelog
     */
    public function actionConfig()
    {
        $config = ArrayHelper::map(Config::find()->where(['group' => ['site', 'mobile', 'pc']])->select(['name', 'value'])->all(), 'name', 'value');
        //自动判断数组
        $config['hot_search'] = Yii::$app->config->get('hot_search');

        return ['data' => $config];
    }

    /**
     * @return array
     * @throws \yii\db\Exception
     * @api {post} /v1/common/upload 上传文件
     * @apiGroup 通用接口
     * @apiVersion 1.0.0
     *
     * @apiHeader {String} Content-Type 内容类型.
     * @apiHeader {String} accept 传输方式.
     * @apiHeaderExample {json} Header-Example:
     *     {
     *       "Content-Type": "multipart/form-data",
     *       'accept': 'application/json',
     *     }
     *
     * @apiParam  {String} file 上传文件表单名
     *
     * @apiSuccess {Number} errcode    状态码,0:请求成功
     * @apiSuccess {String} errmsg   提示信息
     * @apiSuccess {Object} data    服务器上文件信息
     *
     * @apiError {Number} errcode    状态码,500:请求失败
     * @apiError {String} errmsg   提示信息
     *
     * @apiSuccessExample {json} 成功响应:
     * {"errcode":0,"errmsg":"ok","data":{}}
     *
     * @apiErrorExample {json} 失败响应:
     * {"errcode":500,"errmsg":"请求失败"}
     *
     * @author nodelog
     */
    public function actionUpload()
    {
        $transaction = Yii::$app->db->beginTransaction();
        try {
            $files = UploadedFile::getInstancesByName('file');
            $attachment = Attachment::uploadFromPost(date('Ymd'), $files[0]);
            $transaction->commit();

            return ['data' => $attachment];
        } catch (\Exception $e) {
            $transaction->rollback();

            return ['errcode' => CodeEnum::CODE_ERROR, 'errmsg' => $e->getMessage()];
        }
    }

    /**
     * 平台版本号
     * @return array|mixed
     * @author nodelog
     */
    public function actionVersion()
    {
        return ['data' => Yii::$app->config->get('version')];
    }

    /**
     * @return array
     * @throws \yii\web\ServerErrorHttpException
     * @author nodelog
     */
    public function actionTest()
    {

        $list = \common\models\Category::find()->where([])->select('title')->column();
        Yii::$app->response->format = Response::FORMAT_JSON;

        return ['data' => $list];


        //分类
        /* @var $cateList \common\models\Category[] */
        $cateList = Category::find()->where(['like', 'title', '表%', false])->orderBy(['id' => SORT_ASC])->all();


        /* 读取excel */
        $fileName = \Yii::getAlias('@storagePath/upload/data.xlsx');//path
        $inputFileType = IOFactory::identify($fileName);
        $reader = IOFactory::createReader($inputFileType);
        $spreadsheet = $reader->load($fileName);
        $reader->setReadDataOnly(true); // 设置后无法获取excel中的图片
        $worksheetList = $spreadsheet->getAllSheets();
        $excelData = [];
        foreach ($worksheetList as $index => $worksheet) {
            $highestRow = $worksheet->getHighestRow(); // 取得总行数
            $highestColumn = $worksheet->getHighestColumn(); // 取得总列数
            $highestColumnIndex = Coordinate::columnIndexFromString($highestColumn); // 取得总列数

            $category = $cateList[$index];
            for ($row = 1; $row <= $highestRow; $row++) {
                //一行一条数据
                $data = [];
                for ($col = 1; $col <= $highestColumnIndex; $col++) {
                    $val = (string)$worksheet->getCellByColumnAndRow($col, $row)->getValue();

                    //第一行初始化
                    if ($row == 1 && $col == 1) {
                        $attr = [];
                    }
                    if ($row == 1) {
                        $attr[$col] = $this->getAttrByTitle($val);
                    } else {
                        if (!$data[$attr[$col]]) {

                            $data[$attr[$col]] = $val;
                        } else {
                            $data[$attr[$col]] = $data[$attr[$col]] . $val;

                        }
                    }
                }
                //一行完整数据取完
                if ($row != 1) {
                    if ($data['sort'] != "") {
                        $excelData[] = [
                            'sort' => $data['sort'],
                            'title' => $data['title'],
                            'company' => $data['company'] ? $data['company'] : '',
                            'position' => $data['position'] ? $data['position'] : '',
                            'chain' => $data['chain'] ? $data['chain'] : '',
                            'principal' => $data['principal'] ? $data['principal'] : '',
                            'intro' => $data['intro'] ? $data['intro'] : '',
                            'description' => $this->generateDesc($data['intro']),
                            'city' => $data['city'] ? $data['city'] : '',
                            'address' => $data['address'] ? $data['address'] : '',
                            'tel' => $data['tel'] ? $data['tel'] : '',
                            'category_id' => $category->id,
                            'category' => $category->title,
                            'module' => $category->module,
                        ];
                    } else {
                        //合并数据
                        foreach ($data as $key => $value) {
                            $excelData[count($excelData) - 1][$key] .= $value;
                        }
                    }
                }
            }
        }

        Yii::$app->db->createCommand()->batchInsert(Article::tableName(), ['sort', 'title', 'company', 'position', 'chain', 'principal', 'intro', 'description', 'city', 'address', 'tel', 'category_id', 'category', 'module'], $excelData)->execute();

        return ['data' => ['count' => count($excelData), 'list' => $excelData]];

    }


    private function getAttrByTitle($title)
    {
        switch ($title) {
            //基本信息
            case '序号':
                return 'sort';
            case '姓名':
            case '名称':
            case '基地名称':
            case '产业集群':
            case '企业名称':
            case '商会名称':
                return 'title';
            case '城市':
            case '区域':
            case '国内城市分布':
            case '常住地':
                return 'city';
            case '地址':
                return 'address';
            case '联系方式':
            case '商会电话':
                return 'tel';
            //扩展信息

            case '公司':
            case '企业':
            case '单位':
            case '单位名称':
                return 'company';
            case '职务':
                return 'position';

            case '专长方向':
            case '研究领域':
            case '研究方向':
            case '简介':
            case '基地特色':
            case '科室/研究方向':
            case '专长方向/荣誉':
            case '投资产业领域':
            case '主要产品':
            case '个人简介':
                return 'intro';
            case '产业领域':
            case '产业类别':
            case '产业链':
            case '细分方向':
            case '细分领域':
            case '重点投资行业/研究领域':
                return 'chain';
            case '负责人':
            case '秘书长':
            case '法人':
                return 'principal';
        }
    }

    // 摘要生成方式
    private function generateDesc($intro)
    {

        if (empty($intro)) {
            return '';
        }
        return StringHelper::truncate(preg_replace('/\s+/', ' ', strip_tags($intro)), 150);
    }
}