<?php


namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use PhpOffice\PhpSpreadsheet\IOFactory;

/**
 * 文件上传记录
 *
 */
class FilesManager extends Model
{
    use HasFactory;

    // 与模型关联的表名
    protected $table = 'files_manager';
    // 是否主动维护时间戳
    public $timestamps = false;
    protected   $connection = 'company';
    // 定义时间戳字段名
    // const CREATED_AT = 'insert_time';
    // const UPDATED_AT = 'update_time';

    /**
     * 添加数据
     *
     */
    public function add($data)
    {
        // 时间
        $data['insert_time']                = time();
        $data['update_time']                = time();
        // 写入数据表
        $id                                    = $this->query()->insertGetId($data);
        // 返回结果
        return                              $id;
    }

    /**
     * 修改数据
     *
     */
    public function edit($id, $data)
    {
        // 更新时间
        $data['update_time']                = time();
        // 写入数据表
        $result                                = $this->query()->where(['id' => $id])->update($data);
        // 返回结果
        return                              $result;
    }

    /**
     * 文件上传到cos
     *
     * @param	\Illuminate\Http\UploadedFile  $file		文件对象
     *
     * @return  Array		$result			返回结果
     * 			string 		$file_path		文件路径
     * 			int 		$file_size		文件大小
     * 			string 		$file_name	    文件名称
     *          string 		$file_md5	    文件Md5
     */
    public function fileStore($file, $path = 'company/license/')
    {
        // 请指定路径
        if (!$path)                         return ['error' => '请指定存储路径'];
        // 组装
        $path                               = trim($path, '/') . '/';
        // 判断文件是否有问题
        if (!is_object($file))              return ['error' => '文件上传失败，请重试'];
        // md5
        $fileMd5                            = md5_file($file->getPathName());
        // 通过文件MD5查询是否已经存在
        $data                               = $this->getOneByMd5($fileMd5);
        // 如果存在,直接返回
        if ($data)                          return $data;
        // 文件名
        $filename                           = html_entity_decode(ltrim($file->getClientOriginalName(), '/'), ENT_QUOTES, 'UTF-8');
        // // 文件名仅支持字母数字中文-_组合
        // if (!preg_match('/^[\x{4e00}-\x{9fa5}A-Za-z0-9_\-\+\.\(\)(\x20)]+$/u', $filename)) return ['error' => $filename . '文件名仅支持字母数字中文空格-_组合'];
        // 文件大小
        $ext                                = pathinfo($file->getClientOriginalName(),PATHINFO_EXTENSION);
        // 文件名
        $filename                           = md5($filename).'.'.$ext;
        // 文件大小
        $size                               = $file->getSize();
        // 保存文件
        $objectPath                         = $file->move(public_path('uploads/' . $path), $filename);
        // 如果有错误
        if (!$objectPath)                   return ['error' => $file->getError()];
        // 保存路径
        $data                               = ['file_path' => $path . $filename, 'file_size' => $size, 'file_name' => $filename, 'file_md5' => $fileMd5];
        // 写入数据库
        $data['file_id']                    = $this->add($data);
        // 移动失败
        if (!$data['file_id'])              return ['error' => '存储失败'];
        // 返回结果
        return                              $data;
    }

    /**
     * 通过md5值获取文件信息
     *
     * @param     String   $fileMd5     文件Md5值
     * @param     String   $$field      指定获取字段名称
     *
     */
    public function getOneByMd5($fileMd5, $field = '')
    {
        // 获取数据
        $data                              = $this->where([['file_md5', '=', $fileMd5]])->first(['id as file_id', 'file_name', 'file_path', 'file_md5', 'file_size']);
        // 如果
        $data                              = $data ? $data->toArray() : [];
        // 是否获取字段
        return                             empty($field) ? $data : (isset($data[$field]) ? $data[$field] : null);
    }



    /**
     * 从Excel获取客户信息
     *
     * @param     \Illuminate\Http\UploadedFile   $file     传入的文件
     *
     */
    public function excelToUserPackage($file)
    {
        // 获取文件后缀名
        $ext                        = pathinfo($file->getClientOriginalName(), PATHINFO_EXTENSION);
        // 验证文件格式
        if (!in_array($ext, ['csv', 'xlsx', 'xls']))    return ['error' => '请上传Excel'];
        // 读取文件
        $reader                     = IOFactory::createReader(ucwords($ext))->load($file->getPathname());
        // 提取数据
        $sheetList                  = $reader->getActiveSheet()->toArray('');
        // 表格列标题
        $column                     = array_shift($sheetList);
        // 列标题换字段
        $column                     = $this->userPackageToField($column);
        // 字段值
        if( !$column )              return ['error' => '请检查内容表头格式'];
        // 循环表格数据
        foreach ($sheetList as $row=>$value)    {
            // 获取对应的数据
            //$custom                             = [];
            $userPackage                        = [];
            // 循环每个字段，获取值
            foreach ($value as $kk => $vv)      {
                // 根据字段索引获取对应的值，转存到客户信息
                if( isset($column[$kk]) )       $userPackage[$column[$kk]] = $vv;
            }
            // 验证必须数据
            if( empty($userPackage['extid']) )      return ['error' => '第'.($row + 1).'行 没有识别到企业用户ID'];
            //if( empty($userPackage['phone']) )      return ['error' => '第'.($row + 1).'行 没有识别到用户手机号'];
            if (!empty($userPackage['phone'])) {
                //验证手机号格式是否正确
                if (!preg_match("/^1[3456789]{1}\d{9}$/", $userPackage['phone'])) {
                    return ['error' => '第'. ($row + 1) . '行 用户手机号格式不正确！'];
                }
            }
            if( empty($userPackage['userid']) )      return ['error' => '第'.($row + 1).'行 没有识别到企业成员ID'];

            // 追加到人群包列表
            $sheetList[$row]                    = $userPackage;
        }
        // 返回结果
        return                                  $sheetList;
    }


    /**
     * 获取列对应的数据库字段名
     *
     */
    private function userPackageToField($column)
    {
        // 字段值
        $field                              = [];
        // 循环列标题
        foreach ($column as $key => $value) {
            if( $value == '企业用户ID')         $field[$key] = 'extid';
            if( $value == '用户手机号' )        $field[$key] = 'phone';
            if( $value == '企业成员ID' )        $field[$key] = 'userid';
        }
        // 返回字段值
        return                          $field;
    }



}