<?php
/**
 * Created by PhpStorm.
 * User: xiaaomi
 * Date: 2019/3/12
 * Time: 14:07
 */

namespace App\Http\Controllers\Mobile\Person;

use App\Exceptions\ResponseException;
use App\Http\Controllers\Mobile\MobileBaseController;
use App\Models\CategoryDistrict;
use App\Models\PersonalTalents;
use App\Models\RecruitAppointBasic;
use App\Models\RecruitAppointInfo;
use App\Models\Resume;
use App\Services\Common\CategoryService;
use App\Services\Person\MemberInfoService;
use App\Services\Person\MemberPointService;
use App\Services\Person\ResumeCredentService;
use App\Services\Person\ResumeEducationService;
use App\Services\Person\ResumeImageService;
use App\Services\Person\ResumeLanguageService;
use App\Services\Person\ResumeService;
use App\Services\Person\ResumeTrainService;
use App\Services\Person\ResumeWorkService;
use App\Services\Person\SubsiteResumeService;
use App\Services\SubsiteService;
use App\Validators\PersonValidatorRequest;
use App\Validators\RecruitValidatorRequest;
use Illuminate\Http\Request;

class ResumeController extends MobileBaseController
{
    protected $resumeService;
    protected $memberPointService;
    protected $categoryService;
    protected $subsiteService;
    protected $resumeWorkService;
    protected $educationService;
    protected $subsiteResumeService;
    protected $resumeEducationService;
    protected $resumeTrainService;
    protected $resumeCredentService;
    protected $resumeLanguageService;
    protected $memberInfoService;
    protected $resumeImageService;

    public function __construct(
        ResumeService $resumeService,
        MemberPointService $memberPointService,
        CategoryService $categoryService,
        SubsiteService $subsiteService,
        ResumeWorkService $resumeWorkService,
        ResumeEducationService $educationService,
        SubsiteResumeService $subsiteResumeService,
        ResumeEducationService $resumeEducationService,
        ResumeTrainService $resumeTrainService,
        ResumeCredentService $resumeCredentService,
        ResumeLanguageService $resumeLanguageService,
        MemberInfoService $memberInfoService,
        ResumeImageService $resumeImageService
    )
    {
        $this->resumeService          = $resumeService;
        $this->memberPointService     = $memberPointService;
        $this->categoryService        = $categoryService;
        $this->subsiteService         = $subsiteService;
        $this->resumeWorkService      = $resumeWorkService;
        $this->educationService       = $educationService;
        $this->subsiteResumeService   = $subsiteResumeService;
        $this->resumeEducationService = $resumeEducationService;
        $this->resumeTrainService     = $resumeTrainService;
        $this->resumeCredentService   = $resumeCredentService;
        $this->resumeLanguageService  = $resumeLanguageService;
        $this->memberInfoService      = $memberInfoService;
        $this->resumeImageService     = $resumeImageService;
    }

    public function index()
    {
        if (get_subsite_id() > 0) {
            return view('mobile.app.jkq.person_index');
        } else {
            $personaltalents = PersonalTalents::where('uid', auth('web-member')->user()->id)->first();
            return view('mobile.app.person.index', ['talents' => $personaltalents]);
        }
    }

    public function signIn()
    {
        if (request()->method() == 'POST') {
            $res = $this->resumeService->signIn(auth('web-member')->user());
            if ($res['code'] == 1) {
                return $this->sendSuccessResponse($res['info']);
            } else {
                return $this->sendErrorResponse($res['info']);
            }
        } else {
            return view('mobile.app.person.service.index', ['wap_title' => '我的积分']);
        }
    }

    public function task()
    {
        return view('mobile.app.person.service.gold_task', $this->memberPointService->getTask(auth('web-member')->user(), 1));
    }

    public function taskDetail(Request $request)
    {
        $res    = $this->memberPointService->getPointsById(auth('web-member')->user());
        $result = $res['memhanselGet'];
        if ($request->has('operate') && !empty($request->operate)) {
            $result = $res['memhanselPo'];
        }
        if ($request->ajax()) {
            if ($result->lastPage() < $result->currentPage()) {
                return response()->json(['status' => 0]);
            }
            return response()->json([
                'status'                                          => 1,
                'data'                                            => view('mobile.app.person.ajax_tpl.ajax_gold_log',
                    ['result' => $result])->render(), 'wap_title' => '积分收支明细']);
        }
        return view('mobile.app.person.service.gold_log')->with([
            'result'    => $result,
            'pointGet'  => $res['pointGet'],
            'pointPo'   => $res['pointPo'],
            'wap_title' => '积分收支明细',
        ]);
    }


    public function incrementAdd()
    {
        $res = $this->memberPointService->increment_add(request()->type, auth('web-member')->user());
        return view('mobile.app.person.service.' . $res['tpl'], ['resume' => $res['resume'],
                                                                 'info'   => $res['info'], 'points' => $res['points'], 'payment' => $res['payment'], 'wap_title' => $res['wap_title']]);
    }

    public function resumeAdd()
    {
        $res       = $this->resumeService->loginValidate(auth('web-member')->user());
        $district  = $this->categoryService->getDefaultDistrict();
        $subsite   = $this->subsiteService->getSubsite(auth('web-member')->user());
        $deSubsite = [];
        foreach ($subsite as $key => $val) {
            $deSubsite[] = $val['id'] . ',' . $val['sitename'];
        }

        return view('mobile.app.person.resume_add', [
                'member'      => $res['member'],
                'resume'      => $res['resume'],
                'defaultCity' => $district->defaultCity,
                'disCity'     => $district->disCity,
                'disHan'      => $district->disHan,
                'resumeTitle' => $res['resumeTitle'],
                'subsite'     => $deSubsite,
                'wap_title'   => '创建简历',
            ]
        );
    }

    public function resumeCreate(PersonValidatorRequest $request)
    {
        $res = $this->resumeService->resumeCreate($request->except(['add_tag', '_token']), auth('web-member')->user());
        if ($res['code'] == 1) {
            return $this->sendSuccessResponse(['id' => $res['info'], 'tag' => $request->add_tag]);
        } else {
            return $this->sendErrorResponse('更新简历失败', '', 400);
        }
    }

    public function resumeCheck()
    {
        return view('mobile.app.person.resume_guidance', ['wap_title' => '完善简历']);
    }

    public function resume_add_success()
    {
        return view('mobile.app.person.resume_add_success', ['wap_title' => '创建简历']);
    }

    public function resumeWorkAdd()
    {
        $res = $this->resumeWorkService->resumeWorkAdd(request()->all(), auth('web-member')->user());
        if ($res['code'] == 1) {
            $html = view('mobile.app.person.ajax_tpl.ajax_get_work_list', ['content' => $res['info']])->render();
            return $this->sendSuccessResponse($html);
        } else {
            return $this->sendErrorResponse('更新失败', '', 400);
        }
    }

    public function resumeEducationAdd()
    {
        $res = $this->educationService->resumeEducationAdd(request()->all(), auth('web-member')->user());
        if ($res['code'] == 1) {
            $html = view('mobile.app.person.ajax_tpl.ajax_get_education_list', ['content' => $res['info']])->render();
            return $this->sendSuccessResponse($html);
        } else {
            return $this->sendErrorResponse('更新失败', '', 400);
        }
    }

    public function resumeTrainAdd()
    {
        $res = $this->resumeTrainService->resumeTrainAdd(request()->all(), auth('web-member')->user());
        if ($res['code'] == 1) {
            $html = view('mobile.app.person.ajax_tpl.ajax_get_training_list', ['content' => $res['info']])->render();
            return $this->sendSuccessResponse($html);
        } else {
            return $this->sendErrorResponse('更新失败', '', 400);
        }
    }

    public function resumeCredentAdd()
    {
        $res = $this->resumeCredentService->resumeCredentAdd(request()->all(), auth('web-member')->user());
        if ($res['code'] == 1) {
            $html = view('mobile.app.person.ajax_tpl.ajax_get_credent_list', ['content' => $res['info']])->render();
            return $this->sendSuccessResponse($html);
        } else {
            return $this->sendErrorResponse('更新失败', '', 400);
        }
    }

    public function saveLanguage()
    {
        $res = $this->resumeLanguageService->mobileSaveLanguage(request()->all(), auth('web-member')->user());
        if ($res['code'] == 1) {
            $html = view('mobile.app.person.ajax_tpl.ajax_get_language_list', ['content' => $res['info']])->render();
            return $this->sendSuccessResponse($html);
        } else {
            return $this->sendErrorResponse('添加失败', '', 400);
        }
    }


    public function updateSpecialty()
    {
        $res = $this->resumeService->updateSpecialty(request()->except('_token'), auth('web-member')->user());
        if ($res['code'] == 1) {
            return $this->sendSuccessResponse('更新成功');
        } else {
            return $this->sendErrorResponse('更新失败', '', 400);
        }
    }


    public function refreshResume()
    {
        $res = $this->resumeService->refreshResume(request()->id, auth('web-member')->user());
        if ($res['code'] == 1) {
            return $this->sendSuccessResponse($res['info']);
        } else {
            return $this->sendErrorResponse($res['info']);
        }
    }

    public function resume()
    {
        $content = $this->resumeService->myResume(auth('web-member')->user());
        return view('mobile.app.person.resume_list', ['content' => $content, 'wap_title' => '简历管理']);
    }

    public function set_entrust()
    {
        $res = $this->resumeService->setEntrust(request()->id, auth('web-member')->user());
        if ($res['code'] == 1) {
            return $this->sendSuccessResponse($res['info']);
        } else {
            return $this->sendErrorResponse($res['info'], '', 400);
        }
    }

    public function set_entrust_del()
    {
        $res = $this->resumeService->setEntrustDel(request()->id, auth('web-member')->user());
        if ($res['code'] == 1) {
            return $this->sendSuccessResponse($res['info']);
        } else {
            return $this->sendErrorResponse($res['info'], '', 400);
        }
    }

    public function setDelResume()
    {
        $res = $this->resumeService->setDelResume(request()->id, auth('web-member')->user());
        if ($res) {
            return $this->sendSuccessResponse('删除成功');
        } else {
            return $this->sendErrorResponse('删除失败', '', 400);
        }
    }

    public function setDef()
    {
        $res = $this->resumeService->setDef(request()->id, auth('web-member')->user());
        if ($res['code'] == 1) {
            return $this->sendSuccessResponse($res['info']);
        } else {
            return $this->sendErrorResponse($res['info'], '', 400);
        }
    }

    public function resumeUpdate()
    {
        $de_resume = Resume::find(request()->id);
        $back_url  = \Illuminate\Support\Facades\URL::previous();
        if (!$de_resume) {
            return $this->showMessage('对不起,您只能查看自己的简历!', $back_url, true, '上一页', '3');
        }
        if ($de_resume->uid != auth('web-member')->user()->id) {
            return $this->showMessage('对不起,您只能查看自己的简历!', $back_url, true, '上一页', '3');
        }
        $res           = $this->resumeService->getResumeById(request()->id, auth('web-member')->user());
        $district      = $this->categoryService->getDefaultDistrict();
        $subsiteResume = $this->subsiteResumeService->getSubsiteResumeById(auth('web-member')->user(), request()->id);
        $subsiteAll    = $this->subsiteService->getSubsite(auth('web-member')->user());
        return view('mobile.app.person.resume_edit', [
            'resume'        => $res['resume'],
            'member'        => $res['member'],
            'imgs'          => $res['imgs'],
            'defaultCity'   => $district->defaultCity,
            'subsiteResume' => $subsiteResume['sub'],
            'subsiteAll'    => $subsiteAll,
            'subId'         => $subsiteResume['subId'],
            'wap_title'     => '编辑简历',
        ]);
    }

    public function updateTitle()
    {
        $res = $this->resumeService->updateTitle(request()->title, request()->id, auth('web-member')->user());
        if ($res) {
            return $this->sendSuccessResponse('更新成功');
        } else {
            return $this->sendErrorResponse('更新失败', '', 400);
        }
    }

    public function resumeEducation()
    {
        $res = $this->resumeEducationService->getResumeEducationByResumeId(request()->resume_id, auth('web-member')->user());
        return view('mobile.app.person.ajax_tpl.default_education', ['content' => $res]);
    }

    public function resumeWork()
    {
        $res = $this->resumeWorkService->getResumeWorkByResumeId(request()->resume_id, auth('web-member')->user());
        return view('mobile.app.person.ajax_tpl.default_work', ['content' => $res]);
    }

    public function resumeTrain()
    {
        $res = $this->resumeTrainService->getResumeTrainByResumeId(request()->resume_id, auth('web-member')->user());
        return view('mobile.app.person.ajax_tpl.default_train', ['content' => $res]);
    }

    public function resumeCredent()
    {
        $res = $this->resumeCredentService->getResumeCredentByResumeId(request()->resume_id, auth('web-member')->user());
        return view('mobile.app.person.ajax_tpl.default_credent', ['content' => $res]);
    }

    public function getLanguageL()
    {
        $res = $this->resumeLanguageService->getLanguageL(request()->resume_id, auth('web-member')->user());
        return view('mobile.app.person.ajax_tpl.default_language', ['content' => $res]);
    }

    public function memberInfo()
    {
        $resume_id = [];
        $resume    = $this->resumeService->myResumeAjax(auth('web-member')->user());
        if (!$resume->isEmpty()) {
            $resume_id = array_column($resume->toArray(), 'id');
        }
        $res      = $this->resumeService->getUserInfo(auth('web-member')->user(), $resume_id);
        $district = $this->categoryService->getDefaultDistrict();
        return view('mobile.app.person.resume_edit_basis')->with([
            'content'     => $res->member,
            'defaultCity' => $district->defaultCity,
            'memberInfo'  => $res,
            'resume_id'   => request()->resume_id,
            'wap_title'   => '个人资料',
        ]);
    }

    public function uploadHead()
    {
        $res = $this->memberInfoService->updateHead(request()->pic1, auth('web-member')->user());
        return response()->json($res);
    }

    public function updateInfo(PersonValidatorRequest $request)
    {
        $res = $this->memberInfoService->updateInfo(request()->all(), auth('web-member')->user());
        if ($res['code']) {
            return $this->sendSuccessResponse($res['info']);
        } else {
            return $this->sendErrorResponse('更新失败', '', 400);
        }
    }

    public function updateHunt()
    {
        $res           = Resume::findOrFail(request()->resume_id);
        $district      = $this->categoryService->getDefaultDistrict();
        $subsiteResume = $this->subsiteResumeService->getSubsiteResumeById(
            auth('web-member')->user(), request()->resume_id);

        $SubsitTitle = '';
        foreach ($subsiteResume['sub'] as $key => $val) {
            if ($val['subsites']) {
                $SubsitTitle .= $val['subsites']['sitename'] . ',';
            } else {
                $SubsitTitle .= '总站' . ',';
            }
        }
        $subsiteAll = $this->subsiteService->getSubsite(auth('web-member')->user());
        $deSubsite  = [];
        foreach ($subsiteAll as $key => $val) {
            $deSubsite[] = $val['id'] . ',' . $val['sitename'];
        }
        return view('mobile.app.person.resume_edit_intent', [
            'resume'      => $res,
            'defaultCity' => $district->defaultCity,
            'subsite'     => $deSubsite,
            'SubsitTitle' => trim($SubsitTitle, ','),
            'subsiteId'   => implode(',', $subsiteResume['subId']),
            'wap_title'   => '求职意向',

        ]);
    }

    public function updHunt()
    {
        $res = $this->resumeService->updateHunting(request()->except('_token'), auth('web-member')->user());
        if ($res) {
            return $this->sendSuccessResponse('更新成功');
        } else {
            return $this->sendErrorResponse('更新失败', '', 400);
        }
    }

    public function updateDescription()
    {
        $res = Resume::findOrFail(request()->resume_id);
        return view('mobile.app.person.resume_edit_description', [
            'resume'    => $res,
            'wap_title' => '自我描述',
        ]);
    }

    public function educationEdit(Request $request)
    {
        $resumeEdu = $this->resumeEducationService->educationEdit($request->id);
        return view('mobile.app.person.resume_edit_edu', [
            'resume_id' => request()->resume_id,
            'resumeEdu' => $resumeEdu,
            'wap_title' => '教育经历',
        ]);
    }

    public function workEdit(Request $request)
    {
        $workEdu = $this->resumeWorkService->workEdit($request->id);
        return view('mobile.app.person.resume_edit_work', [
            'resume_id' => request()->resume_id,
            'workEdu'   => $workEdu,
            'wap_title' => '工作经历',
        ]);
    }

    public function trainEdit(Request $request)
    {
        $trainEdu = $this->resumeTrainService->trainEdit($request->id);
        return view('mobile.app.person.resume_edit_train', [
            'resume_id' => request()->resume_id,
            'trainEdu'  => $trainEdu,
            'wap_title' => '培训经历',
        ]);
    }

    public function certificate(Request $request)
    {
        $certificateEdu = $this->resumeCredentService->certificate($request->id);
        return view('mobile.app.person.resume_edit_certificate', [
            'resume_id'      => request()->resume_id,
            'certificateEdu' => $certificateEdu,
            'wap_title'      => '获得证书',
        ]);
    }

    public function language(Request $request)
    {
        $languageEdu = $this->resumeLanguageService->language($request->id);
        return view('mobile.app.person.resume_edit_lang', [
            'resume_id'   => request()->resume_id,
            'languageEdu' => $languageEdu,
            'wap_title'   => '语言能力',
        ]);
    }

    public function speciality()
    {
        $resume = Resume::findOrFail(request()->resume_id);
        return view('mobile.app.person.resume_edit_speciality', [
            'resume'    => $resume,
            'wap_title' => '特长标签',
        ]);
    }

    public function tagSave()
    {
        $resume_id = request()->resume_id;
        $this->resumeService->isOwn($resume_id, auth('web-member')->user());
        $res = $this->resumeService->tagSave(request()->all());
        if ($res['code'] == 1) {
            return $this->sendSuccessResponse('更新成功');
        } else {
            return $this->sendErrorResponse('更新失败', '', 400);
        }
    }

    public function tagDelete(Request $request)
    {
        $res = $this->resumeService->tagDelete($request->input('resume_id', ''), $request->input('tag_cn', ''), auth('web-member')->user());
        if ($res['code'] == 1) {
            return $this->sendSuccessResponse('删除成功');
        } else {
            return $this->sendErrorResponse('删除失败', '', 400);
        }
    }

    public function images(Request $request)
    {
        $imagesEdu = $this->resumeImageService->images($request->id);
        return view('mobile.app.person.resume_edit_img', [
            'resume_id' => $request->resume_id,
            'imagesEdu' => $imagesEdu,
            'wap_title' => '照片作品',
        ]);
    }

    public function resumeImages(Request $request)
    {
        $res = $this->resumeImageService->resumeImages
        (
            $request->input('images', ''),
            $request->input('title', ''),
            $request->input('id', ''),
            $request->input('resume_id', ''),
            auth('web-member')->user()
        );
        return response()->json($res);
    }

    public function recruit(Request $request)
    {
        $user = auth('web-member')->user();
        $list = RecruitAppointInfo::where('uid', $user->id)
            ->join('recruit', 'recruit.id', '=', 'recruit_appoint_info.recruit_id', 'left')
            ->join('recruit_post', 'recruit_post.id', '=', 'recruit_appoint_info.post_id', 'left')
            ->select('recruit.name as recruit_name', 'recruit_appoint_info.*', 'recruit_post.code', 'recruit_post.name')
            ->get();

        return view('mobile.app.person.recruit')->with(['list' => $list, 'total' => count($list)]);
    }


    public function recruit_info(Request $request)
    {
        $info       = $this->_getRecruitInfo();
        $recruit_id = $request->input('recruit_id', 0);
        return view('mobile.app.person.recruit_info', [
            'info'                  => $info,
            'recruit_id'            => $recruit_id,
            'political_affiliation' => RecruitAppointBasic::$political_affiliation,
        ]);
    }

    public function recruit_family(Request $request)
    {
        $key        = $request->input('key', '');
        $recruit_id = $request->input('recruit_id', 0);
        if ($key !== '') {
            $user   = auth('web-member')->user();
            $basic  = RecruitAppointBasic::where('uid', $user->id)->first();
            $family = json_decode($basic->family, true);
            $info   = $family[$key];
        } else {
            $info = [
                'work'                  => '',
                'birthday'              => '',
                'realname'              => '',
                'relation'              => '',
                'political_affiliation' => '13',
            ];
        }
        return view('mobile.app.person.recruit_family', [
            'info'                  => $info,
            'key'                   => $key,
            'recruit_id'            => $recruit_id,
            'political_affiliation' => RecruitAppointBasic::$political_affiliation,
        ]);
    }

    public function delRecruitFamily(Request $request)
    {
        $key    = $request->input('key');
        $user   = auth('web-member')->user();
        $info   = RecruitAppointBasic::where('uid', $user->id)->first();
        $family = json_decode($info->family, true);
        unset($family[$key]);
        RecruitAppointBasic::where('uid', $user->id)->update(['family' => json_encode($family)]);
        return response()->json(['status' => 1]);
    }

    public function postRecruitFamily(Request $request)
    {
        $data   = $request->post();
        $user   = auth('web-member')->user();
        $info   = RecruitAppointBasic::where('uid', $user->id)->first();
        $family = json_decode($info->family, true);
        if (isset($data['key'])) {
            $key = $data['key'];
            unset($data['key']);
            $family[$key] = $data;
        } else {
            $family[] = $data;
        }
        RecruitAppointBasic::where('uid', $user->id)->update(['family' => json_encode($family)]);
        return response()->json(['status' => 1]);
    }

    public function recruit_basic(Request $request)
    {
        $info = $this->_getRecruitInfo();
        $recruit_id = $request->input('recruit_id', 0);
        return view('mobile.app.person.recruit_basic', [
            'info'                  => $info,
            'recruit_id'            => $recruit_id,
            'political_affiliation' => RecruitAppointBasic::$political_affiliation,
            'edu_type'              => RecruitAppointBasic::$edu_type,
            'education'             => RecruitAppointBasic::$education,
        ]);
    }

    public function saveRecruitBasic(RecruitValidatorRequest $request)
    {
        $user           = auth('web-member')->user();
        $basic          = RecruitAppointBasic::where('uid', $user->id)->first();
        $data           = $request->only('realname', 'sex', 'birthday', 'avatar', 'nation', 'native_place', 'political_affiliation', 'titles', 'work', 'house_register', 'join_time', 'edu_type', 'education', 'school', 'degree', 'pro', 'address', 'card', 'mobile', 'email', 'concat_name', 'concat_mobile', 'resume', 'is_push');
        $data['avatar'] = $data['avatar'] ?: '';
        if ($basic) {
            //更新基础信息
            $res = RecruitAppointBasic::where('uid', $user->id)->update($data);
            if (!$res) {
                return response()->json(['status' => 0, 'msg' => '保存失败,请联系客服']);
            } else {
                return response()->json(['status' => 1]);
            }
        } else {
            //新增基础信息
            $data['uid'] = $user->id;
            $res         = RecruitAppointBasic::create($data);
            if (!$res) {
                return response()->json(['status' => 0, 'msg' => '保存失败,请联系客服']);
            } else {
                return response()->json(['status' => 1]);
            }
        }
    }

    private function _getRecruitInfo()
    {
        $user = auth('web-member')->user();
        $info = RecruitAppointBasic::where('uid', $user->id)->first();
        if (!$info) {
            $info = [
                'uid'                   => $user->id,
                'realname'              => '',
                'sex'                   => 0,
                'birthday'              => '',
                'avatar'                => '',
                'nation'                => '',
                'native_place'          => '',
                'political_affiliation' => '13',
                'titles'                => '',
                'work'                  => '',
                'house_register'        => '',
                'join_time'             => '',
                'edu_type'              => 1,
                'education'             => '本科',
                'school'                => '',
                'degree'                => '',
                'pro'                   => '',
                'address'               => '',
                'card'                  => '',
                'mobile'                => '',
                'email'                 => '',
                'concat_name'           => '',
                'concat_mobile'         => '',
                'resume'                => '',
                'family'                => [],
                'is_push'               => 1,
            ];
            RecruitAppointBasic::create($info);
        } else {
            $info->sex      = (string)$info->sex;
            $info->edu_type = (string)$info->edu_type;
            $info->is_push  = (string)$info->is_push;
            $info->family   = empty($info->family) ? [] : json_decode($info->family,true);
        }

        return $info;
    }
}