<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
class Base extends Model
{
    protected $table = '';
    //自动维护create_at创建时间 updated_at修改时间
    public $timestamps = true;
    //统一设置返回时间格式
    protected $casts = [
        'created_at' => 'datetime:Y-m-d H:i:s',
        'updated_at' => 'datetime:Y-m-d H:i:s',
    ];

    /**
     * 监听模型事件
     * @author zbj
     * @date 2023/4/25
     */
    protected static function booted()
    {
        //模型实例操作才会触发

        //保存前数据 $row->original['xx']
        //保存后数据 $row->xx
        static::saved(function ($row) {
            //删除缓存
            $row->original &&  static::clearCache($row);
        });

        static::deleted(function ($row) {
            //删除缓存
            $row->original &&  static::clearCache($row);
        });
    }

    /**
     * 删除缓存 子类重写此方法
     *
     * @param $row
     * @return bool
     * @author zbj
     * @date 2023/4/25
     */
    public static function clearCache($row){
        return true;
    }

    /**
     * 日期序列化 勿删 删了时间就不是东八区时间了哈
     * @param \DateTimeInterface $date
     * @return string
     * @author zbj
     * @date 2023/4/13
     */
    protected function serializeDate(\DateTimeInterface $date): string
    {
        return $date->format('Y-m-d H:i:s');
    }
    /**
     * @name 列表数据
     * @return void
     * @author :liyuhang
     * @method
     */
    public function lists($map, $page, $row, $order = 'id', $fields = ['*']): array
    {
        $query = $this->formatQuery($map);
        $lists = $query->select($fields)->orderBy($order,'desc')->paginate($row, ['*'], 'page', $page);
        if (empty($lists)) {
            return [];
        }
        $lists = $lists->toArray();
        return $lists;
    }
    /**
     * @name  :无分页列表
     * @param $map
     * @param $order
     * @param $fields
     * @return mixed
     * @author :liyuhang
     * @method
     */
    public function list($map = [],$order = 'id',$fields = ['*']): array
    {
        $query = $this->formatQuery($map);
        $lists = $query->select($fields)->orderBy($order)->get();
        if (empty($lists)) {
            return [];
        }
        $lists = $lists->toArray();
        return $lists;
    }

    /**
     * @name :获取单条数据详情
     * @param array
     * @return mixed
     * @author :liyuhang
     * @method get
     */
    public function read($condition,$files = ['*'])
    {
        $query = $this->formatQuery($condition);
        $info = $query->select($files)->first();
        if (empty($info)) {
            return false;
        }
        $info = $info->toArray();
        return $info;
    }

    /**
     * @name :新增
     * @return void
     * @author :liyuhang
     * @method post
     */
    public function add($data){
        $data['created_at'] = date('Y-m-d H:i:s');
        $data['updated_at'] = date('Y-m-d H:i:s');
        return $this->insert($data);
    }

    /**
     * @name :编辑
     * @return void
     * @author :liyuhang
     * @method post
     */
    public function edit($data,$condition){
        if(isset($data['id']) && !empty($data['id'])){
            unset($data['id']);
        }
        $query = $this->formatQuery($condition);
        $data['updated_at'] = date('Y-m-d H:i:s');
        return $query->update($data);

    }
    /**
     * @name : 删除数据
     * @return void
     * @author :liyuhang
     * @method
     */
    public function del($condition){
        $query = $this->formatQuery($condition);
        return $query->delete();
    }
    /**
     * @name :参数处理查询
     * @param $map = ['$k'=>['like',$v],$k1]
     * @param $val
     * @return Base
     * @author :liyuhang
     * @method
     */
    public function formatQuery($map = [],$query = ''){
        $model = $query ?: $this;
        $query = $model->where(function ($query) use ($map){
            foreach ($map as $k => $v){
                if(!is_array($v)){
                    $query->where($k,$v);
                    continue;
                }
                switch ($v[0]){
                    case 'like':
                        // like查询 ['name|title'=> ['like','%a%']]
                        if (strpos($k, '|') !== false) {
                            $query->where(function ($query) use ($k,$v) {
                                $item = explode('|', $k);
                                foreach ($item as $vo) {
                                    $query->orWhere($vo, $v[0], $v[1]);
                                }
                            });
                        } else {
                            $query->where($k, $v[0], $v[1]);
                        }
                        break;
                    case 'in':
                        // in查询 ['id'=>['in',[1,2,3]]]
                        $query->whereIn($k, $v[1]);
                        break;
                    case 'or':
                        // in查询 ['id'=>['in',[1,2,3]]]
                        $query->orWhere($k, $v[1]);
                        break;
                    case 'not in':
                        // in查询 ['id'=>['not in',[1,2,3]]]
                        $query->whereNotIn($k, $v[1]);
                        break;
                    case 'between':
                        // in查询 ['id'=>['between',[create1,create2]]]
                        $query->whereBetween($k, $v[1]);
                        break;
                    case 'not between':
                        // not between查询 ['created_at'=>['not between',['xxx', 'xxx]]]
                        $query->whereNotBetween($k, $v[1]);
                        break;
                    default:
                        $query->where($k,$v[0],$v[1]);
                        break;
                }
            }

        });
        return $query;
    }

}