<?php


namespace App\Http\Services;


use App\Http\Controllers\Filter\SupplierExaminationFilter;
use App\Http\Transformers\SupplierExaminationTransformer;
use App\Model\IntracodeModel;
use App\Model\SupplierChannelModel;
use App\Model\SupplierExaminationModel;
use Maatwebsite\Excel\Facades\Excel;

class SupplierExaminationService
{
    public function getSupplierExaminationList($request)
    {
        $limit = $request->get('limit', 10);
        $filter = new SupplierExaminationFilter();
        $query = $filter->listFilter($request);
        $list = $query->paginate($limit)->toArray();
        $transformer = new SupplierExaminationTransformer();
        $list['data'] = $transformer->transformList($list['data']);
        return $list;
    }

    //保存
    public function saveSupplierExamination($data)
    {
        $data['examine_time'] = strtotime($data['examine_time']);
        if (!empty($data['id'])) {
            $data['update_time'] = time();
            return SupplierExaminationModel::where('id', $data['id'])->update($data);
        } else {
            $data['create_time'] = time();
            return SupplierExaminationModel::insert($data);
        }
    }

    //删除
    public function deleteSupplierExaminations($ids)
    {
        return SupplierExaminationModel::whereIn('id', $ids)->delete();
    }

    //上传
    public function ImportSupplierExamination($filePath)
    {

        ini_set('memory_limit', -1);

        try {
            $content = file_get_contents($filePath);
            $fileType = mb_detect_encoding($content, array('UTF-8', 'GBK', 'LATIN1', 'BIG5'));
            Excel::load($filePath, function ($reader) {
                $data = $reader->getSheet(0)->toArray();
                $dataMd5 = md5(json_encode($data));
                if (SupplierExaminationModel::where('data_md5', $dataMd5)->exists()) {
                    throw new \Exception('该文件已经上传过,请选择其它文件');
                }
                //获取所有采购员用于校验
                $channelUsers = (new IntracodeModel())->getAllEncode();
                $channelUserNames = array_column($channelUsers, 'name');
                $supplierNames = (new SupplierChannelModel())->where('is_type', 0)->pluck('supplier_name')->toArray();
                //拼装数据插入校验,校验完成插入数据库
                $examineData = [];
                foreach ($data as $index => $item) {
                    $lineNo = $index + 1;
                    //检测模板头部
                    if ($index == 0) {
                        if (!$this->checkImportCsvHeader($item)) {
                            throw new \Exception('文件不是标准上传模板');
                        }
                        continue;
                    }
                    $item = array_map(function ($value) {
                        return trim($value);
                    }, $item);
                    $examineTime = $item[0];
                    $channelUserName = $item[1];
                    $supplierName = $item[2];
                    $skuName = $item[3];
                    $brandName = $item[4];
                    $amount = $item[5];
                    $examineAmount = $item[6];
                    $unhealthyAmount = $item[7];
                    $abnormalLevel = (int)$item[8];
                    $unhealthyContent = $item[9];
                    $examineResult = $item[10];
                    $handleWay = $item[11];
                    $remark = $item[12];
                    if (empty($supplierName)) {
                        throw new \Exception("存在供应商名称为空的数据(第${lineNo}行),请修改后再次提交");
                    }
                    if (!in_array($supplierName,$supplierNames)) {
                        throw new \Exception("存在无效供应商的数据(第${lineNo}行),请修改后再次提交");
                    }
                    if (!in_array($channelUserName,$channelUserNames)) {
                        throw new \Exception("存在无效的采购员(第${lineNo}行),请修改后再次提交");
                    }
                    if (!is_integer($amount)) {
                        throw new \Exception("数量只能为纯数字(第${lineNo}行),请修改后再次提交");
                    }
                    if (!is_integer($examineAmount)) {
                        throw new \Exception("检测数量只能为纯数字(第${lineNo}行),请修改后再次提交");
                    }
                    if (!is_integer($unhealthyAmount)) {
                        throw new \Exception("不良数量只能为纯数字(第${lineNo}行),请修改后再次提交");
                    }
                    if (!in_array($abnormalLevel,[1,2,3])) {
                        throw new \Exception("存在不合理的异常等级,等级必须为纯数字1,2,3 (第${lineNo}行),请修改后再次提交");
                    }

                    $examineData[] = [
                        'examine_time' => $examineTime ? strtotime($examineTime) : '',
                        'purchase_name' => $channelUserName,
                        'supplier_name' => $supplierName,
                        'sku_name' => $skuName,
                        'brand_name' => $brandName,
                        'amount' => $amount,
                        'examine_amount' => $examineAmount,
                        'unhealthy_amount' => $unhealthyAmount,
                        'abnormal_level' => $abnormalLevel,
                        'unhealthy_content' => $unhealthyContent,
                        'examine_result' => $examineResult,
                        'handle_way' => $handleWay,
                        'remark' => $remark,
                        'data_md5' => $dataMd5,
                    ];
                }

                $examineData = collect($examineData);

                foreach ($examineData->chunk(50) as $chunk) {
                    SupplierExaminationModel::insert($chunk->toArray());
                }

                return true;
            }, $fileType);
        } catch (\Exception $exception) {
            return $exception->getMessage();
        } finally {
            unlink($filePath);
        }

        return true;
    }

    private function checkImportCsvHeader($header)
    {
        $validHeader = [
            '检货时间',
            '采购员',
            '供应商',
            '型号',
            '品牌',
            '数量',
            '检验数量',
            '不良数',
            '异常等级',
            '不良现象',
            '检验结果',
            '处理方式',
            '备注'
        ];

        return $validHeader == $header;
    }
}