<?php
/**
 * Created by PhpStorm.
 * User: michaelwu
 * Date: 2018/10/30
 * Time: 11:22
 */

namespace App\Http\Controllers\Mobile\Company;

use App\Http\Controllers\Mobile\MobileBaseController;
use App\Models\Category;
use App\Repositories\CategoryRepository;
use App\Repositories\JobsRepository;
use App\Repositories\MemberPointRepository;
use App\Repositories\MemberSetmealRepository;
use App\Repositories\QueueAutoRefreshRepository;
use App\Repositories\RefreshLogRepository;
use App\Repositories\SetmealRepository;
use App\Services\Common\CategoryService;
use App\Services\Common\SetmealIncrementsService;
use App\Services\Company\CompanyService;
use App\Services\Company\JobsService;
use App\Services\Company\ServiceService;
use App\Services\SubsiteService;
use App\Validators\JobsValidatorRequest;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;

class JobsController extends MobileBaseController
{
    /**
     * @var JobsService
     */
    protected $jobsService;
    protected $categoryService;
    protected $companyService;
    protected $memberSetmealRepository;
    protected $setmealIncrementsService;
    protected $refreshLogRepository;
    protected $memberPointRepository;
    protected $setmealRepository;
    protected $queueAutoRefreshRepository;
    protected $serviceService;
    protected $subsiteService;
    protected $jobsRepository;


    /**
     * JobsController constructor.
     * @param JobsService $jobsService
     * @param CategoryService $categoryService
     * @param CompanyService $companyService
     * @param $memberSetmealRepository
     * @param $setmealIncrementsService
     * @param $refreshLogRepository
     * @param $memberPointRepository
     * @param $setmealRepository
     * @param $queueAutoRefreshRepository
     * @param $serviceService
     * @param $subsiteService
     * @param $jobsRepository
     */
    public function __construct(JobsService $jobsService, JobsRepository $jobsRepository, SubsiteService $subsiteService, ServiceService $serviceService, QueueAutoRefreshRepository $queueAutoRefreshRepository, SetmealRepository $setmealRepository, MemberPointRepository $memberPointRepository, RefreshLogRepository $refreshLogRepository, CategoryService $categoryService, CompanyService $companyService, MemberSetmealRepository $memberSetmealRepository, SetmealIncrementsService $setmealIncrementsService)
    {
        $this->jobsService                = $jobsService;
        $this->categoryService            = $categoryService;
        $this->companyService             = $companyService;
        $this->memberSetmealRepository    = $memberSetmealRepository;
        $this->setmealIncrementsService   = $setmealIncrementsService;
        $this->refreshLogRepository       = $refreshLogRepository;
        $this->memberPointRepository      = $memberPointRepository;
        $this->setmealRepository          = $setmealRepository;
        $this->queueAutoRefreshRepository = $queueAutoRefreshRepository;
        $this->serviceService             = $serviceService;
        $this->subsiteService             = $subsiteService;
        $this->jobsRepository             = $jobsRepository;
    }

    /**管理职位
     * @param Request $request
     * @param null $type
     * @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\JsonResponse|\Illuminate\View\View
     * @throws \Throwable
     */
    public function jobsList(Request $request, $type = null)
    {
        $user   = auth('web-company')->user();
        $hasget = false;
        if ($type) {
            $hasget = true;
        }
        $jobs_list       = $this->jobsService->list($type, $user);
        $jobs_total      = $this->jobsService->jobsTotal($user->id);
        $company_setmeal = $this->memberSetmealRepository->getSetmealByUid($user->id, $user->utype);//会员套餐
        $stick           = $this->setmealIncrementsService->getCat('stick');
        $emergency       = $this->setmealIncrementsService->getCat('emergency');
        if ($request->ajax()) {
            if ($jobs_list->currentPage() > $jobs_list->lastPage()) {
                return response()->json(['status' => 0]);
            }
            return response()->json(['status' => 1, 'data' => view('mobile.app.company.jobs.ajax.ajax_jobs_list', ['jobsList' => $jobs_list])->render()]);
        }
        return view('mobile.app.company.jobs.jobs_list', ['jobsList' => $jobs_list, 'type' => $type, 'hasget' => $hasget, 'jobsCount' => $jobs_total, 'companySetmeal' => $company_setmeal, 'stick' => $stick, 'emergency' => $emergency, 'wap_title' => "管理职位"]);
    }

    public function checkJobsNum()
    {
        $user = auth('web-company')->user();
        //套餐可发布最大职位数
        $mySetmeal = $this->memberSetmealRepository->getSetmealByUid($user->id, 1);
        //已发布职位数
        $jobsCount = $this->jobsRepository->getJobCount(['company_id' => $user->id]);
        if ($mySetmeal->jobs_meanwhile <= 0) {
            return response()->json(['status' => 1]);
        }
        return response()->json(['status' => 0]);
    }

    /**
     * 职位添加
     * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
     * @throws \App\Exceptions\ResponseException
     */
    public function jobsAdd($id = null)
    {
        $user      = auth('web-company')->user();
        $jobsExist = $this->jobsRepository->jobsTotal(['company_id' => $user->id, 'id' => $id]);
        if (empty($jobsExist) && !empty($id)) {
            return $this->showMessage('没有这个职位!', route('jobs.list'), true);
        }
        //查询该套餐可发布多少职位数及已发布多少职位
        $jobs_total              = $this->jobsService->jobsTotal($user->id);
        $company_setmeal         = $this->memberSetmealRepository->getSetmealByUid($user->id, $user->utype);//会员套餐
        $condition['company_id'] = $user->id;
        $condition['display']    = 1;
        $condition['valid']      = 1;
        $jobsCount               = $this->jobsRepository->jobAuditTotal($condition, getJobsStatus());//开启的职位数量

        $surplus_jobs                    = $company_setmeal->jobs_meanwhile - $jobsCount;
        $company_setmeal->jobs_meanwhile = $surplus_jobs > 0 ? $surplus_jobs : 0;

        //查询企业信息
        $companyInfo = $this->companyService->getInfoById($user);
        //分站信息
        $subsite = $this->subsiteService->getSubsite($user);
        $suArr   = [];
        foreach ($subsite as $key => $val) {
            $suArr[] = $val['id'] . ',' . $val['sitename'];
        }
        $result = [
            'info'            => $companyInfo,
            'jobsCount'       => $jobs_total,
            'company_setmeal' => $company_setmeal,
            'subsite'         => $subsite,
            'suArr'           => $suArr,
        ];
        if (isset($id) && $id) {
            if (!$result['jobsInfo'] = $this->jobsService->jobsInfo($id)) {
                return $this->showMessage('请确认职位是否存在!', route('mobile.firm.jobs.list'), true);
            }
            if ($result['jobsInfo']->subsites->isNotEmpty()) {
                $subsiteArr = $result['jobsInfo']->subsites->toArray();
                if ($subsiteArr) {
                    foreach ($subsiteArr as $key => $val) {
                        $result['subarr'][] = $val['subsite_id'];
                    }
                } else {
                    $result['subarr'][] = [];
                }
                if ($result['subarr']) {
                    foreach ($result['subarr'] as $key => $val) {
                        if ($result['jobsInfo']->subsite_id == $val) {
                            unset($result['subarr'][$key]);
                        }
                    }
                }
            }
        }
        $result['category'] = $this->categoryService->getCategory();
        return view('mobile.app.company.jobs.jobs_add', $result);
    }

    /**
     * 职位保存
     * @param JobsValidatorRequest $request
     * @return \Illuminate\Http\JsonResponse
     * @throws \Prettus\Validator\Exceptions\ValidatorException
     */
    public function jobsSave(JobsValidatorRequest $request)
    {
        $data = $request->except('_token', '_method');
        $user = auth('web-company')->user();
        $data['is_deformity'] = empty($data['is_deformity']) ? 2 : $data['is_deformity'];
        return $this->jobsService->jobsSaveMobile($data, $user);
    }

    /**
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse
     * @throws \Throwable
     */
    public function jobsAddToJobfair(Request $request)
    {
        if ($request->method() == 'POST') {
            $user = $this->getLoginUser();
            return $this->jobsService->jobsAddToJobfair($request, $user);
        }
        $tip = '您确定要将该职位加入招聘会职位库吗?';
        return response()->json(['status' => 1, 'msg' => '', 'data' => ['html' => view('app.company.ajax.ajax_warning', ['tip' => $tip])->render()]]);
    }

    /**职位刷新
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse
     * @throws \App\Exceptions\ResponseException
     * @throws \Throwable
     */
    public function jobsRefresh(Request $request)
    {
        $user = auth('web-company')->user();
        $id   = $request->id;
        if (!$id) {
            return response()->json(['status' => 0, 'msg' => "请选择刷新职位!"]);
        }
        $jobsInfo = $this->jobsRepository->find($id);
        if ($jobsInfo->audit == 3) {
            return response()->json(['status' => 0, 'msg' => "审核未通过职位不可刷新!"]);
        } elseif ($jobsInfo->audit == 2 && config('aix.companyset.comset.show_set.jobs_display') == 1) {
            return response()->json(['status' => 0, 'msg' => "审核中职位不可刷新!"]);
        } elseif ($jobsInfo->display == 2 || $jobsInfo->valid == 0) {
            return response()->json(['status' => 0, 'msg' => "已关闭职位不可刷新!"]);
        }
        $where = [
            'uid'   => $user->id,
            'utype' => 1,
            'type'  => 1006,
            'mode'  => 2,
        ];
//        //刷新间隔时间
//        $refrestime = $this->refreshLogRepository->getLastRefreshDate($where);
//        $duringtime = time() - strtotime($refrestime?$refrestime->created_at:0);
        $space = config('aix.companyset.comset.other_set.refresh_jobs_space') * 60;
//        if ($space > 0 && $duringtime <= $space) {
//            return response()->json(['status' => 0, 'msg' => $space . "秒内不能重复刷新职位",]);
//        }

        //有无开通刷新服务
        $mySetmeal = $this->memberSetmealRepository->getSetmealByUid($user->id, $user->utype);
        $myPoints  = $this->memberPointRepository->getPointsOne(auth('web-company')->user()->id, 1);
        if (!$mySetmeal) {
            return response()->json(['status' => 0, 'msg' => '您还没有开通服务,请<a></a>>',]);
        }
        //服务是否到期
        if ($mySetmeal->expire == 1 && $mySetmeal->setmeal_id > 1) {
            return response()->json(['status' => 0, 'msg' => '您的服务已经到期,请<a></a>',]);
        }

        $discount = $this->setmealRepository->getMaxDiscount('auto_refresh_jobs');
        //计算免费刷新次数
        $todayCount = $this->refreshLogRepository->getTodayRefreshTimes($where);
        if ($todayCount >= ($mySetmeal->refresh_jobs_free + config('aix.companyset.comsume.comsume_set.refresh_jobs_more'))) {//免费刷新次数已到
            if ($myPoints->points >= (config('aix.companyset.comsume.comsume_set.refresh_jobs_price') * config('aix.companyset.points.points_set.payment_rate'))) {
                $tip  = '<div class="dialog_notice">今天免费刷新次数已用完,本次刷新需要扣除 <span class="font_yellow">' . intval((config('aix.companyset.comsume.comsume_set.refresh_jobs_price') * config('aix.companyset.points.points_set.payment_rate'))) . '</span> 积分,是否确定刷新?<br /><div class="dialog_tip font10 font_gray9">您当前拥有 <span class="font_yellow">' . $myPoints->points . '</span> 积分</div></div>';
                $mode = 'points';
            } else {
                $tip  = view('mobile.app.company.ajax.pay_refresh_jobs', ['discount' => $discount, 'jobs_id' => $id])->render();
                $mode = 'mix';
            }
        } else {
            $tip  = '<div class="dialog_notice">你今天还可免费刷新 <span>' . ($mySetmeal->refresh_jobs_free + config('aix.companyset.comsume.comsume_set.refresh_jobs_more') - $todayCount) . '</span> 次,本次刷新免费,是否立即刷新?</div>';
            $mode = 'setmeal';
        }

        if (Cache::has('refresh_jobid_' . $id)) {
//            $jobs_intersect  = array_intersect(Cache::get('refresh_jobid_'.$id), [$id]);
//            if ($jobs_intersect) {
            $refreshJobName = $this->jobsRepository->findWhereIn('id', [$id], ['jobs_name'])->toArray();
            return response()->json(['status' => 0, 'msg' => "【" . implode(',', array_column($refreshJobName, 'jobs_name')) . "】" . $space . "秒内不能重复刷新,请重新选择", 'data' => ['show_footer' => 0]]);
//            }
        }


        if ($request->method() == 'POST') {
            $payment_name = $request->payment_name ? $request->payment_name : '';
            $id           = (array)$id;
            if ($payment_name) {
                $is_deductible = $request->input('is_deductible', 0);
                if ($is_deductible == 0) {
                    $deductible = 0;
                } else {
                    $deductible = $request->input('deductible', '');
                }
                $myPoints               = $this->memberPointRepository->getComPointsById($user->id, $user->utype);
                $increment_info['name'] = '职位刷新';
                $params['jobs_id']      = $id;
                $params['type']         = 'jobs_refresh';
                $params                 = serialize($params);

                return $this->jobsService->callCashPay($user, $increment_info, $myPoints, 13, $payment_name, config('aix.companyset.comsume.comsume_set.refresh_jobs_price') * count($id), $is_deductible, $deductible, '', $params);

            } else {
                //如果是积分兑换刷新或者直接免费刷新

                $r = $this->jobsService->jobsRefreshSave($id, $user, $mySetmeal);
                if (!$r['status']) {
                    return response()->json(['status' => 0, 'msg' => $r['msg']]);
                } else {
                    return response()->json(['status' => 1, 'msg' => '刷新成功!']);
                }
            }
        }
        return response()->json(['status' => 1, 'msg' => $tip, 'data' => $mode]);
    }


    public function jobsRefreshAll()
    {
        $user = auth('web-company')->user();
        return $this->jobsService->jobsRefreshAll($user);
    }

    /**
     * 职位关闭
     * @param Request $request
     * @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\JsonResponse|\Illuminate\View\View
     */
    public function jobsClose(Request $request)
    {
        return $this->jobsService->jobsClose($request->id);
    }

//    public function closeAll(Request $request)
//    {
//        if ($request->type && $request->type==1) {
//            return $this->jobsService->jobsClose($request->id);
//        }
//        $tip = "职位关闭后将会暂停招聘,您确定要关闭选中的职位吗?";
//        return view('app.company.ajax.ajax_warning', ['tip'=>$tip]);
//    }

    /**
     * 恢复职位
     * @param Request $request
     * @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\JsonResponse|\Illuminate\View\View
     */
    public function jobsShow(Request $request)
    {
        $user = auth('web-company')->user();
        return $this->jobsService->jobsShow($request->id, $user);
    }

    /**
     * 转入招聘会职位库
     * @param Request $request
     */
    public function jobsToJobfair(Request $request)
    {
        $user = $this->getLoginUser();
        return $this->jobsService->jobsAddToJobfair($request, $user);
    }

    /**职位删除
     * @param Request $request
     * @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\JsonResponse|\Illuminate\View\View
     */
    public function jobsDel(Request $request)
    {
        $id   = $request->id;
        $user = auth('web-company')->user();
        return $this->jobsService->jobsDel($id, $user);
    }

    /**
     * 删除所有职位
     * @param Request $request
     * @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\JsonResponse|\Illuminate\View\View
     */
    public function delAll(Request $request)
    {
        if ($request->type && $request->type == 1) {
            $id   = $request->id;
            $user = auth('web-company')->user();
            return $this->jobsService->jobsDel($id, $user);
        }
        $tip = "被删除后将无法恢复,您确定要删除选中的职位吗?";
        return view('app.company.ajax.ajax_warning', ['tip' => $tip]);
    }

    /**紧急招聘
     *
     */
    public function jobsEmergency(Request $request)
    {
        if (!$request->jobs_id) {
            return response()->json(['status' => 0, 'msg' => '参数错误!']);
        }
        $res            = $this->serviceService->incrementAdd('emergency', $request);
        $res['jobs_id'] = $request->jobs_id;
        $html           = view('app.jobs.ajax.ajax_jobs_stick_emergency', $res)->render();
        return response()->json(['status' => 1, 'msg' => $html]);
    }

    /**职位置顶
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse
     * @throws \Throwable
     */
    public function jobsStick(Request $request)
    {
        if (!$request->jobs_id) {
            return response()->json(['status' => 0, 'msg' => '参数错误!']);
        }
        $res            = $this->serviceService->incrementAdd('stick', $request);
        $res['jobs_id'] = $request->jobs_id;
        $html           = view('app.jobs.ajax.ajax_jobs_stick_emergency', $res)->render();
        return response()->json(['status' => 1, 'msg' => $html]);
    }

    /**招聘效果统计===访客统计
     * @param Request $request
     * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View|mixed
     * @throws \Throwable
     */
    public function statisticsVisitor(Request $request)
    {
        $user = auth('web-company')->user();
        if ($request->ajax()) {
            return $this->jobsService->statisticsVisitor($request, $user);
        }
        $res = $this->jobsService->statisticsVisitor($request, $user);
        return view('app.jobs.jobs_statistics_visitor', $res);
    }

    /**招聘效果统计===职位浏览
     * @param Request $request
     * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View|mixed
     * @throws \Throwable
     */
    public function statisticsViewjobs(Request $request)
    {
        $user = auth('web-company')->user();
        if ($request->ajax()) {
            return $this->jobsService->statisticsViewjobs($request, $user);
        }
        $res = $this->jobsService->statisticsViewjobs($request, $user);
        return view('app.jobs.jobs_statistics_viewjobs', $res);
    }

    /**招聘效果统计===应聘统计
     * @param Request $request
     * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View|mixed
     * @throws \Throwable
     */
    public function statisticsApply(Request $request)
    {
        $user = auth('web-company')->user();
        if ($request->ajax()) {
            return $this->jobsService->statisticsApply($request, $user);
        }
        $res = $this->jobsService->statisticsApply($request, $user);
        return view('app.jobs.jobs_statistics_apply', $res);
    }

}