<?php

namespace App\Repositories;

use App\Models\Company;
use App\Models\PersonalJobsApply;
use App\Models\Member;
use App\Models\Category;
use App\Models\Jobs;
use Prettus\Repository\Eloquent\BaseRepository;
use Prettus\Repository\Criteria\RequestCriteria;
use Illuminate\Support\Facades\DB;

/**
 * Class MemberRepositoryEloquent.
 *
 * @package namespace App\Repositories;
 */
class PersonalJobsApplyRepository extends BaseRepository
{
    /**
     * Specify Model class name
     *
     * @return string
     */
    public function model()
    {
        return PersonalJobsApply::class;
    }

    /**
     * Boot up the repository, pushing criteria
     */
    public function boot()
    {
        $this->pushCriteria(app(RequestCriteria::class));
    }

    /**
     * 获取已申请职位数。
     * @param $resume_id
     * @param $personal_uid
     * @return mixed
     */
    public function getApplyJobs($personal_uid, $where)
    {
        return $this->model->with(['resumes','jobs'=>function($query) use ($where) {
            $query->whereIn('audit', $where)->where('display', 1)->where('valid', 1);
        }])->where(['personal_uid'=>$personal_uid])->whereHas('resumes')->whereHas('jobs')->count();
    }


    public function getApplyJobsDef($resume_id, $where)
    {
        return $this->model->with(['resumes','jobs'=>function($query) use ($where) {
            $query->whereIn('audit', $where)->where('display', 1)->where('valid', 1);
        }])->where(['resume_id'=>$resume_id])->whereHas('resumes')->whereHas('jobs')->count();
    }

    public function getApplyResume($jobs_id)
    {
        return $this->model->where(['jobs_id'=>$jobs_id,'is_reply'=>0])->count();
    }

    /**
     * @param $map
     * @param $valid 停招职位
     * @param $apply_time 投递时间
     * @param $page
     * @return mixed
     */
    public function getResume($where, $page)
    {
        return $this->model->with('jobs')->with('resumes')->where($where)->orderByRaw("FIELD(is_reply,0,1,3,2,4)")->orderBy('id', 'desc')->orderBy('created_at', 'desc')->paginate($page);
    }

    public function companyLabelResume($id, $data)
    {
        return $this->update($data, $id);
    }

    /**
     * 近两周收到的简历
     * @return mixed
     */
    public function twoWeeksTotal($id)
    {
        return $this->model->where('created_at', '>=', date('Y-m-d', time()-86400*14))->where('company_id', '=', $id)->count();
    }

    /**
     * 近两周处理的简历
     * @return mixed
     */
    public function twoWeeksReplyTotal($id)
    {
        $where = [
            ['created_at','>=',date('Y-m-d', time() - 86400*14)],
            ['is_reply', '>', 0],
            ['personal_look','=',2],
        ];
        return $this->model->where($where)->where('company_id', '=', $id)->count();
    }

    /**
     * 删除简历申请
     * @param $id
     * @return mixed
     * @param $company_id
     */
    public function delJobsApply($id,$company_id)
    {
        return $this->model->whereIn('id', $id)->where("company_id",$company_id)->delete();
    }

    /**
     * 查询单个简历申请
     * @param $where
     * @return mixed
     */
    public function getOne($where)
    {
        return $this->model->where($where)->orderBy('id', 'desc')->first();
    }
    public function getJobsApply($where)
    {
        return $this->model->where($where)->orderBy('id', 'desc')->get();
    }

    /**
     * 获取简历ID
     * @param $id
     * @return mixed
     */
    public function getResumeId($id)
    {
        return $this->model->whereIn('id', $id)->select(['resume_id'])->get()->toArray();
    }

    /**
     * 检测是否申请过职位
     */
    public function checkJobsApply($resume_id, $company_id, $jobs_id = false)
    {
        $where['resume_id'] = $resume_id;
        $where['company_id'] = $company_id;
        $jobs_id && $where['jobs_id'] = $jobs_id;
        if (!$this->model->where($where)->first()) {
            return false;
        }
        return true;
    }
    /**
     * 获取一条职位申请记录
     */
    public function findJobsApply($resume_id, $company_id, $jobs_id = false,$id=0)
    {
        $where['resume_id'] = $resume_id;
        $where['company_id'] = $company_id;
        if (!empty($id)){
            $where['id']=$id;
        }
        $jobs_id && $where['jobs_id'] = $jobs_id;
        return $this->model->where($where)->first();
    }

    /**
     * 修改投递状态和查看状态
     * @param $where
     * @return mixed
     */
    public function updateApply($where)
    {
        return $this->model->where($where)->update(['is_reply'=>3,'personal_look'=>2]);
    }

    /**简历回收站
     * @param $uid
     * @param $page
     * @return mixed
     */
    public function recycle($uid, $page)
    {
        $where = [
            'company_id'=>$uid,
        ];
        return $this->model->onlyTrashed()->where($where)->paginate($page);
    }

    /**删除收到的简历
     * @param $id
     * @return mixed
     */
    public function destroyJobsApply($id)
    {
        return $this->model->whereIn('id', $id)->forceDelete();
    }

    /**清空回收站
     * @param $company_id
     * @return mixed
     */
    public function clearRecycle($company_id)
    {
        return $this->model->where('company_id', $company_id)->forceDelete();
    }

    public function applyJobs($where, $jobs_id = array())
    {
        if ($jobs_id) {
            return $this->model->where($where)->whereIn('jobs_id', $jobs_id)->orderBy('created_at', 'desc')->get();
        } else {
            return $this->model->where($where)->orderBy('created_at', 'desc')->get();
        }
    }
    public function checkApplyJobs($where, $jobs_id = array())
    {
        if ($jobs_id) {
            return $this->model->where($where)->whereIn('jobs_id', $jobs_id)->get();
        } else {
            return $this->model->where($where)->get();
        }
    }
    //获取其它字段包含whereIn条件的字段的申请记录
    public function getApplies($where, $whereIn = array())
    {
        $list = array();
        if ($whereIn) {
            $rst = $this->model->where($where)->whereIn(key($whereIn), $whereIn[key($whereIn)])->get();
        } else {
            $rst = $this->model->where($where)->get();
        }
        if ($rst->toArray()) {
            foreach ($rst as $k => $v) {
                $list[$v->resume_id] = $v;
            }
        }
        return $list;
    }

    public function addData($data)
    {
        return $this->model->create($data);
    }

    public function setApply($where, $set)
    {
        return $this->model->where($where)->update($set);
    }

    /**投递简历数
     * @param $where
     * @return mixed
     */
    public function resumesCount($where)
    {
        return $this->model->where($where)->count();
    }
    public function getStateArr()
    {
        return $this->model->getStateArr();
    }
    public function getResumeApplyGroup($where, $fileds = 'count(p.id) as num,j.category,c.demand', $group_by = 'j.category', $order_by = 'count(p.jobs_id) DESC', $limit = '')
    {
        $rst = DB::table(PersonalJobsApply::getTableName().' as p')->select(DB::raw($fileds))
            ->leftjoin(Member::getTableName().' as m', 'm.id', '=', 'p.personal_uid')
            //->leftjoin(Jobs::getTableName().' as j', 'j.id', '=', 'p.jobs_id')
            ->leftjoin(Company::getTableName().' as cp', 'cp.id', '=', 'p.company_id')
            ->leftjoin(Category::getTableName().' as c', 'c.id', '=', 'cp.trade')
            ->where($where)
            ->groupBy($group_by)
            ->orderByRaw($order_by);
        if ($limit) {
            $rst->offset(0)->limit($limit);
        }
        return $rst->get();
    }

    public function getApplyNumGroup($where, $group_by, $subsite_id)
    {
        $rst = $this->model->where($where)->select(DB::raw('count(id),DATE(created_at)'))->when($subsite_id!=-1, function($query) use($subsite_id) {
            $query->whereHas('members', function ($query) use ($subsite_id) {
                $query->where(['subsite_id'=>$subsite_id]);
            });
        });
        if ($group_by) {
            $rst->groupBy($group_by);
        }
        return $rst->get();
    }
    public function getApplyNum($where, $company_where)
    {
        return $this->model
                    ->where($where)
                    ->when($company_where, function ($query) use ($company_where) {
                        $query->whereHas('companys', function ($query) use ($company_where) {
                            $query->where($company_where);
                        });
                    })->count();
    }
    public function getApplyNumByGroup($where, $company_where, $fields, $group_by, $order_by = '')
    {
        $rst = $this->model->select(DB::raw($fields))->where($where)
            ->when($company_where, function ($query) use ($company_where) {
                $query->whereHas('companys', function ($query) use ($company_where) {
                    $query->where($company_where);
                });
            });
        if ($group_by) {
            foreach ($group_by as $k => $v) {
                $rst->groupBy($v);
            }
        }
        if ($order_by) {
            $rst->orderByRaw($order_by);
        }
        return $rst->get();
    }
    public function getApplyNumByCompanyGroup($where, $company_where, $fields, $group_by, $order_by = '', $limit = '')
    {
        $rst = $this->model->with('companys')->select(DB::raw($fields))->where($where)
            ->when($company_where, function ($query) use ($company_where) {
                $query->whereHas('companys', function ($query) use ($company_where) {
                    $query->where($company_where);
                });
            });
        if ($group_by) {
            foreach ($group_by as $k => $v) {
                $rst->groupBy($v);
            }
        }
        if ($order_by) {
            $rst->orderByRaw($order_by);
        }
        if ($limit) {
            $rst->offset(0)->limit($limit);
        }
        return $rst->get();
    }

    public function getResumeNumBySexGroup($resume_where, $member_where)
    {
        $rst = $this->model->with(['memberInfos'])->where($resume_where)->when($member_where, function($query) use($member_where) {
            $query->whereHas('members', function ($query) use ($member_where) {
                $query->where($member_where);
            });
        })->get();
        return $rst;
    }

    public function getPersonalJobByID($id){
        return $this->model->where("id",$id)->first();
    }
    public function getResumeApplyWithDeleted($where, $member_where)
    {
        $rst = $this->model
            //->withTrashed()
            ->where($where)
            ->when($member_where, function ($query) use ($member_where) {
                $query->whereHas('members', function ($query) use ($member_where) {
                    //$query->withTrashed()->where($member_where);
                    $query->where($member_where);
                });
            })->get();
        return $rst;
    }

    public function getPluck($where,$column)
    {
        return $this->model->where($where)->pluck($column);
    }
}