<?php
namespace App\Http\Controllers\Statistics;

use App\Http\Controllers\Statistics\StatisticsBaseController;
use Illuminate\Support\Facades\Auth;
use App\Services\Statistics\CompanyService;
use App\Services\Statistics\MemberService;
use App\Services\Statistics\JobsService;
use App\Services\Statistics\ResumeService;
use App\Services\Statistics\JobfairService;
use App\Services\Statistics\CompanyDownResumeService;
use App\Services\SubsiteService;


class HomeController extends StatisticsBaseController
{

    protected $companyService;
    protected $memberService;
    protected $jobsService;
    protected $resumeService;
    protected $jobfairService;
    protected $companyDownResumeService;
    /**
     * HomeController constructor.
     */
    public function __construct(CompanyService $companyService, MemberService $memberService, JobsService $jobsService, ResumeService $resumeService, JobfairService $jobfairService, CompanyDownResumeService $companyDownResumeService, SubsiteService $subsiteService)
    {
        $this->companyService = $companyService;
        $this->memberService  = $memberService;
        $this->jobsService    = $jobsService;
        $this->resumeService  = $resumeService;
        $this->jobfairService = $jobfairService;
        $this->companyDownResumeService = $companyDownResumeService;
        $this->subsiteService  = $subsiteService;
    }

    public function index()
    {
        //分站信息
        $subsite_id = session('caiqing_susbite_id');
        if ($subsite_id === null) {
            $subsite_id = -1;
        }

        //本周起始时间
        $now_week_where = array();
        $sdefaultDate = date("Y-m-d");
        $first=1;
        $w=date('w', strtotime($sdefaultDate));
        $week_start=date('Y-m-d H:i:s', strtotime("$sdefaultDate -".($w ? $w - $first : 6).' days'));
        $week_end  = date('Y-m-d H:i:s', strtotime("$week_start +7 days")-1);

        //上周起始时间
        $prevweek_start  = date('Y-m-d H:i:s', strtotime("$week_start -7 days"));
        $prevweek_end  = date('Y-m-d H:i:s', strtotime("$prevweek_start +7 days")-1);

        //本月起始时间
        $month_start=date('Y-m-d H:i:s', mktime(0, 0, 0, date('m'), 1, date('Y')));
        $month_send=date('Y-m-d H:i:s', mktime(23, 59, 59, date('m'), date('t'), date('Y')));
        $days = (int)date('j', time());
        //获取上月相同时间段
        $last_firstday = date('Y-m-01 H:i:s', strtotime("-1 month", strtotime($month_start))); //上月第一天
        $last_moreday = date('Y-m-d H:i:s', strtotime($last_firstday.'+'.$days.' days')-1); //上月第N天

        //本周活跃企业数(登录、刷新)
        $week_where = array(
            ['utype','=',1],
            ['user_status','=',1]
        );
        if ($subsite_id != -1) {
            $week_where[] = ['subsite_id','=',$subsite_id];
        }
        $week_where['time_condition'] = [$week_start, $week_end];
        $week_companies = $this->companyService->getCompanyNums($week_where);


        //上周活跃企业数
        $prevweek_where = $week_where;
        $prevweek_where['time_condition'] = [$prevweek_start, $prevweek_end];
        $prevweek_companies = $this->companyService->getCompanyNums($prevweek_where);


        //本月活跃企业数
        $month_where = $week_where;
        $month_where['time_condition'] = [$month_start, $month_send];
        $month_companies = $this->companyService->getCompanyNums($month_where);

        //活跃企业数比较
        $company_flag = 0;
        if ($prevweek_companies > $week_companies) {
            $company_flag = -1;
        } elseif ($prevweek_companies == $week_companies) {
            $company_flag = 0;
        } else {
            $company_flag = 1;
        }
        $company_gap = abs($week_companies - $prevweek_companies);


        //本周活跃个人数
        $week_person_where = array(
            ['utype','=',2],
            ['status','=',1]
        );
        if ($subsite_id != -1) {
            $week_person_where[] = ['subsite_id','=',$subsite_id];
        }
        $week_person_where['time_condition'] = [$week_start, $week_end];
        $week_persons = $this->memberService->getMemberNums($week_person_where);

        //上周活跃个人数
        $prevweek_person_where= $week_person_where;
        $prevweek_person_where['time_condition'] = [$prevweek_start, $prevweek_end];
        $prevweek_persons = $this->memberService->getMemberNums($prevweek_person_where);

        //本月活跃个人数
        $month_person_where= $week_person_where;
        $month_person_where['time_condition'] = [$month_start, $month_send];
        $month_persons = $this->memberService->getMemberNums($month_person_where);

        //活跃企业数比较
        $person_flag = 0;
        if ($prevweek_persons > $week_persons) {
            $person_flag = -1;
        } elseif ($prevweek_persons < $week_persons) {
            $person_flag = 1;
        }
        $person_gap = abs($week_persons - $prevweek_persons);

        //当前有效岗位数
        $job_where = array(
            array('valid','=','1'),
            array('display','=',1)
        );
        if (config('aix.companyset.comset.show_set.jobs_display')==1) {
            $job_where[] = array('audit','=',1);
        } else {
            $job_where[] = array('audit','<>',3);
        }
        if ($subsite_id != -1) {
            $job_where[] = array('subsite_id','=',$subsite_id);
        }
        $job_num = $this->jobsService->getValidJobNum($job_where);
        $prev_job_where = $job_where;
        $prev_job_where[] = array('created_at','>=',$last_firstday);
        $prev_job_where[] = array('created_at','<=',$last_moreday);
        $prev_job_num = $this->jobsService->getValidJobNum($prev_job_where);
        $more_job_num = $prev_job_num - $job_num;
        $more_flag = 'down';
        if ($job_num > $prev_job_num) {
            $more_job_num = $job_num - $prev_job_num;
            $more_flag = 'up';
        } elseif ($job_num == $prev_job_num) {
            $more_flag = 'balance';
        } else {
            $more_flag = 'down';
        }
        $more_job_rate = 100;
        if ($prev_job_num>0) {
            $more_job_rate = sprintf("%.4f", $more_job_num/$prev_job_num)*100;
        }

        //当前有效简历数
        if (config('aix.personal_set.per_set.show_set.resume_display')=='1') {
            $resume_where[] = array('audit','=','2');
        } else {
            $resume_where[] = array('audit','<>','0');
        }
        if ($subsite_id != -1) {
            $resume_where[] = ['subsite_id', '=',$subsite_id];
        }
        $resume_num = $this->resumeService->getValidResumeNum($resume_where);
        $prev_resume_where = $resume_where;
        $prev_resume_where[] = array('created_at','>=',$last_firstday);
        $prev_resume_where[] = array('created_at','<=',$last_moreday);
        $prev_resume_num = $this->resumeService->getValidResumeNum($prev_resume_where);
        $more_resume_num = $prev_resume_num - $resume_num;
        $more_resume_flag = 'down';
        if ($resume_num > $prev_resume_num) {
            $more_resume_num = $resume_num - $prev_resume_num;
            $more_resume_flag = 'up';
        } elseif ($resume_num == $prev_resume_num) {
            $more_resume_flag = 'balance';
        } else {
            $more_resume_flag = 'down';
        }
        $more_resume_rate = 100;
        if ($prev_resume_num>0) {
            $more_resume_rate = sprintf("%.4f", $more_resume_num/$prev_resume_num)*100;
        }
        $company_where = array(array('utype','=',1),array('audit','=',1));
        if ($subsite_id !='-1') {
            $company_where[] = array('subsite_id','=',$subsite_id);
        }

        //现场招聘会数据(举办结束时间小于当前时间的招聘会)
        $jobfair_where[] = array('holddate_end','<', time());
        if ($subsite_id != -1) {
            $jobfair_where['subsite_id'] = $subsite_id;
        }
        $jobfair_bum = $this->jobfairService->getJobfairNum($jobfair_where);

        //累计进场人数(个人签到数量)
        $jobfair_visitor_num = $this->jobfairService->getJobfairVisitorNum(['type'=>1]);

        //近30天供求趋势(当前时间往前推一个月之间的职位发布、简历发布、下载简历、投递职位数量)
        //近一个月的起始时间
        $month_etime = date("Y-m-d H:i:s", strtotime(date("Y-m-d", strtotime("+1 day")))-1);
        $month_stime = date("Y-m-d H:i:s", strtotime(date("Y-m-d", strtotime("-29 day"))));

        $group_by = 'DATE(created_at)';

        //获取职位发布数量(统计发布时间在当前30天、有效职位)
        $job_where = [
            ['created_at', '<=', $month_etime],
            ['created_at', '>=', $month_stime],
            ['valid','=',1],
            ['display','=',1],
        ];
        if (config('aix.companyset.comset.show_set.jobs_display')==1) {
            $job_where[] = array('audit','=',1);
        } else {
            $job_where[] = array('audit','<>',3);
        }
        if ($subsite_id != -1) {
            $job_where['subsite_id'] = $subsite_id;
        }
        $job_nums = $this->jobsService->getJobNumGroup($job_where, $company_where, $group_by);

        //获取简历发布数量(统计发布时间在当前30天、有效简历)
        $resume_where = [
            ['created_at', '<=', $month_etime],
            ['created_at', '>=', $month_stime],
        ];
        if (config('aix.personal_set.per_set.show_set.resume_display')=='1') {
            $resume_where[] = array('audit','=','2');
        } else {
            $resume_where[] = array('audit','<>','0');
        }
        if ($subsite_id != -1) {
            $resume_where['subsite_id'] = $subsite_id;
        }
        $resume_nums = $this->resumeService->getResumeNumGroup($resume_where, $group_by);

        //获取下载简历数
        $down_where = [
            ['created_at', '<=', $month_etime],
            ['created_at', '>=', $month_stime]
        ];
        $down_resume_nums = $this->companyDownResumeService->getResumeNumGroup($down_where, $group_by, $subsite_id);

        //获取投递职位数量
        $apply_where = [
            ['created_at', '<=', $month_etime],
            ['created_at', '>=', $month_stime]
        ];
        $apply_nums = $this->resumeService->getApplyNumGroup($apply_where, $group_by, $subsite_id);
        //处理数据显示
        $start_date = date("Y-m-d", strtotime(date("Y-m-d", strtotime("-29 day"))));
        $end_date = date("Y-m-d", strtotime(date("Y-m-d", strtotime("+1 day")))-1);
        $date_arr = [];
        for ($i=0; $i<30; $i++) {
            $date_arr[] = $start_date;
            if (!array_has($job_nums, $start_date)) {
                $job_nums[$start_date] = 0;
            }
            if (!array_has($resume_nums, $start_date)) {
                $resume_nums[$start_date] = 0;
            }
            if (!array_has($apply_nums, $start_date)) {
                $apply_nums[$start_date] = 0;
            }
            if (!array_has($down_resume_nums, $start_date)) {
                $down_resume_nums[$start_date] = 0;
            }
            $start_date = date("Y-m-d", strtotime($start_date)+3600*24);
        }
        ksort($job_nums);
        ksort($resume_nums);
        ksort($down_resume_nums);
        ksort($apply_nums);

        $return_data = array(
            'week_companies'      => $week_companies,
            'prevweek_companies'  => $prevweek_companies,
            'month_companies'     => $month_companies,
            'company_flag'        => $company_flag,
            'company_gap'         => $company_gap,
            'week_persons'        => $week_persons,
            'prevweek_persons'    => $prevweek_persons,
            'month_persons'       => $month_persons,
            'person_flag'         => $person_flag,
            'person_gap'          => $person_gap,
            'job_num'             => $job_num,
            'more_job_rate'       => $more_job_rate,
            'more_flag'           => $more_flag,
            'resume_num'          => $resume_num,
            'more_resume_flag'    => $more_resume_flag,
            'more_resume_rate'    => $more_resume_rate,
            'jobfair_bum'         => $jobfair_bum,
            'jobfair_visitor_num' => $jobfair_visitor_num,
            'job_nums'            => $job_nums,
            'resume_nums'         => $resume_nums,
            'down_resume_nums'    => $down_resume_nums,
            'apply_nums'          => $apply_nums,
            'date_arr'            => $date_arr
        );

        return view('statistics.app.index', $return_data);
    }

}