<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;

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',
    ];

    /**
     * @name 列表数据
     * @return void
     * @author :liyuhang
     * @method
     */
    public function lists($map, $p, $row, $order = 'id', $fields = ['*']){
        //TODO::where(['id'=>'','name'=>''])
        $lists = $this->select($fields)->where($map)->orderBy($order)->paginate($row, ['*'], 'page', $p);
        if (empty($lists)) {
            return false;
        }
        $lists = $lists->toArray();
        return $lists;
    }


    /**
     * @param $map
     * @param $order
     * @param $fields
     * @name  :无分页列表
     * @return mixed
     * @author :liyuhang
     * @method
     */
    public function list($map,$order = 'id',$fields = ['*']){
        $lists = $this->select($fields)->where($map)->orderBy($order)->get();
        if (empty($lists)) {
            return false;
        }
        $lists = $lists->toArray();
        return $lists;
    }
    /**
     * @param array:$condition
     * @name :获取单条数据详情
     * @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){
        $data['updated_at'] = date('Y-m-d H:i:s');
        return $this->where($condition)->update($data);
    }

    /**
     * @name : 删除数据
     * @return void
     * @author :liyuhang
     * @method
     */
    public function del($condition){
        return $this->where($condition)->delete();
    }


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