<?php

namespace app\enterprise\controller;

use app\common\api\DictApi;
use app\common\api\EnterpriseApi;
use app\enterprise\common\EnterpriseController;
use app\enterprise\api\TalentApi;
use app\enterprise\model\Talent as TalentModel;
use think\facade\Db;
use app\common\api\TalentLogApi;
use app\common\api\TalentState;
use think\exception\ValidateException;
use app\enterprise\validate\TalentInfo;

// 0正在填写 1保存未提交 2已提交未审核 3已审核 4驳回 5保存补充材料未提交 6提交补充材料进入初审 7初审通过 8初审驳回 9部门审核通过 10部门审核驳回 11复核通过 12复核驳回 13复核失败

/**
 * Description of Base
 *
 * @author sgq
 */
class Base extends EnterpriseController {

    public function index() {
        return view();
    }

    public function list() {
        $step = 1;
        $res = TalentApi::getList($this->request, $step);
        return json($res);
    }

    public function add() {
        if($this->user["type"] != 1)
            return "此入口仅供晋江市人才申报，晋江集成电路人才请使用新统一申报入口";
        $request = $this->request;
        $param = $request->param();
        $id = isset($param["id"]) ? $param["id"] : 0;
        $info = TalentApi::chkIsOwner($id, $this->user["uid"]);
        $ep = EnterpriseApi::getOne($this->user["uid"]);
        if (!chkEnterpriseFull($ep))
            return;
        $tagList = DictApi::selectByParentCode('enterprise_tag');
        $streetList = DictApi::selectByParentCode('street');
        $industryFieldNew = DictApi::selectByParentCode('industry_field');
        $ep->enterpristTagName = $tagList[$ep->enterpriseTag];
        $ep->streetName = $streetList[$ep->street];
        $ep->industryFieldNewName = $industryFieldNew[$ep->industryFieldNew];
        if ($info) {
            $info["real_state"] = TalentLogApi::getLastLog($id, 1)["state"];
        }
        if ($info && in_array($info["checkState"], [TalentState::FST_VERIFY_PASS, TalentState::DEPT_VERIFY_PASS, TalentState::REVERIFY_PASS, TalentState::REVERIFY_FAIL])) {
            return $this->view($request);
            exit();
        }
        if ($request->isPost()) {
            $checkState = $info["checkState"] ?: 0;
            if ($checkState == TalentState::FST_SAVE || $checkState == 0) {
                $this->save($info, $request, TalentState::FST_SAVE);
                exit();
            } else if (in_array($checkState, [TalentState::BASE_VERIFY_FAIL, TalentState::BASE_REVERIFY_FAIL, TalentState::FST_VERIFY_FAIL, TalentState::REVERIFY_FAIL])) {
                $res = ["msg" => "审核失败，不能再保存"];
                echo sprintf("<script>parent.TalentInfoInfoDlg.infoCallback(%s);</script>", json_encode($res));
                exit;
            }
            $res = ["msg" => "已提交审核，请耐心等待"];
            echo sprintf("<script>parent.TalentInfoInfoDlg.infoCallback(%s);</script>", json_encode($res));
            exit;
        }
        $checkState = $info["checkState"] ?: 0;

        $info["enterprise"] = $ep;
        $info["talent_type_list"] = \app\common\api\DictApi::findChildDictByCode("talent_type");
        return view("first", ["year" => date("Y"), "checkState" => $checkState, "row" => $info]);
    }

    public function view(\think\Request $request) {
        $id = $request->param("id");
        $info = \app\common\api\VerifyApi::getTalentInfoById($id);
        return view("view", ["row" => $info]);
    }

    // 1保存未提交 2已提交未审核 3已审核 4驳回 5保存补充材料未提交 6提交补充材料进入初审 7初审通过 8初审驳回 9部门审核通过 10部门审核驳回 11复核通过 12复核驳回 13复核失败
    public function submit() {
        $param = $this->request->param();
        $id = $param["id"];
        $info = TalentApi::chkIsOwner($id, $this->user["uid"]);
        $checkState = $info["checkState"] ?: 0;
        if ($checkState == TalentState::FST_SAVE || $checkState == 0) {

            $filed_dict = \app\common\api\DictApi::getTalentFields(1);
            $no_empty = ["talent_type", "name", "card_type", "card_number", "sex", "birthday", "nationality", "province", "city", "county", "nation", "politics", "experience", "education"];


            if (in_array($param["talent_type"], [1, 2])) {
                $no_empty[] = "tax_insurance_month";
                $no_empty[] = "labor_contract_rangetime";
                $no_empty[] = "salary_pay_way";
                $no_empty[] = "salary_pay_month";
            }
            if ($param["talent_type"] == 3) {
                $no_empty[] = "pre_import_type";
            }
            $return = [];
            foreach ($no_empty as $key) {
                if (!$param[$key]) {
                    $return[] = sprintf("请填写“%s”", $filed_dict[$key]);
                }
            }
            if (count($return) > 0) {
                $res = ["msg" => implode("<br>", $return)];
                echo sprintf("<script>parent.TalentInfoInfoDlg.submitCallback(%s);</script>", json_encode($res));
                exit;
            }
            $birthday = $param["birthday"];
            $birthdayYear = substr($birthday, 0, 4);
            $currentYear = date("Y");
            $age = $currentYear - $birthdayYear;

            $where = [];
            $where[] = ["step", "=", 1];
            $where[] = ["project", "=", 1];
            $where[] = ["type", "=", $this->user["type"]];
            $where[] = ["must", "=", 1];
            $where[] = ["active", "=", 1];
            $where[] = ["delete", "=", 0];
            $filetypes = Db::table("new_common_filetype")->where($where)->select()->toArray();

            $ft_ids = [];
            foreach ($filetypes as $ft) {
                if ($ft["option"]) {
                    if ($ft["rel"] == "birthday") {
                        if ($age < $ft["option"]) {
                            $deletes[] = $ft["id"];
                            continue;
                        }
                    } else {
                        $selectVal = $param[$ft["rel"]];
                        $conditions = array_filter(explode(",", $ft["option"]));
                        if (!in_array($selectVal, $conditions)) {
                            $deletes[] = $ft["id"];
                            continue;
                        }
                    }
                }
                $ft_ids[] = $ft["id"];
            }

            //$ft_ids = array_column($filetypes, "id");
            $whr = [];
            $upload_type_counts = 0;
            if ($ft_ids) {
                $whr[] = ["typeId", "in", $ft_ids];
                $whr[] = ["mainId", "=", $id];
                $distinct_filetypes = Db::table("new_talent_file")->where($whr)->distinct(true)->field("typeId")->select();
                $upload_type_counts = count($distinct_filetypes);
            }
            if ($upload_type_counts != count($ft_ids)) {
                $res = ["msg" => "请留意附件上传栏中带*号的内容均为必传项，请上传完整再提交审核"];
                echo sprintf("<script>parent.TalentInfoInfoDlg.submitCallback(%s);</script>", json_encode($res));
                exit;
            }

            $this->save($info, $this->request, TalentState::FST_SUBMIT);
            //初次提交材料
        } else if (in_array($checkState, [TalentState::BASE_VERIFY_FAIL, TalentState::BASE_REVERIFY_FAIL, TalentState::FST_VERIFY_FAIL, TalentState::REVERIFY_FAIL])) {
            $res = ["msg" => "审核失败，不能再提交审核"];
            echo sprintf("<script>parent.TalentInfoInfoDlg.submitCallback(%s);</script>", json_encode($res));
            exit;
        }
        $res = ["msg" => "已提交审核，请耐心等待"];
        echo sprintf("<script>parent.TalentInfoInfoDlg.submitCallback(%s);</script>", json_encode($res));
        exit;
    }

    /**
     * 保存表单
     * @param type $info talent_info
     * @param type $param request->param();
     */
    private function save($info, \think\Request $request, $checkState) {
        try {
            $param = $request->param();
            validate(TalentInfo::class)->check($param);
            $id = $param["id"];
            if ($id) {
                $data["id"] = $id;
                if (!$info) {
                    throw new ValidateException("没有对应的人才认定申报信息");
                }
            }
            $files = $param["uploadFiles"];
            $data["headimgurl"] = $info["headimgurl"];
            if ($request->file()) {
                $headimg = $request->file("photo");
                $upload = new \app\common\api\UploadApi();
                $result = $upload->uploadOne($headimg, "image", "talent/photo");
                $file = imagecreatefromstring(file_get_contents("storage/" . $result->filepath));
                $width = imagesx($file);
                $height = imagesy($file);
                //免冠二寸照长宽413：579
                if ($width * 579 != $height * 413) {
                    @unlink("storage/" . $result->filepath); //像素不符合，删除上传文件                    
                    throw new ValidateException("近期免冠半身彩照（二寸）不符合二寸像素标准。*<span style='color:#ff0000;'>二寸像素标准[413*579]</span>");
                }
                if ($info && $info["headimgurl"]) {
                    //如果新照片符合像素要求，则删除旧照片
                    $old_head_url = "storage/" . $info["headimgurl"];
                    if (file_exists($old_head_url))
                        @unlink($old_head_url);
                }
                $data["headimgurl"] = $result->filepath;
            }
            if (!$data["headimgurl"] && $checkState == TalentState::FST_SUBMIT)
                throw new ValidateException("请上传头像。*<span style='color:#ff0000;'>二寸像素标准[413*579]</span>");
            $where = [];
            $where[] = ["step", "=", 1];
            $where[] = ["project", "=", 1];
            $where[] = ["type", "=", $this->user["type"]];
            $where[] = ["must", "=", 1];
            $where[] = ["active", "=", 1];
            $where[] = ["delete", "=", 0];
            $filetypes = Db::table("new_common_filetype")->where($where)->select()->toArray();

            $age = 0;
            if ($param["birthday"]) {
                $birthday = $param["birthday"];
                $birthdayYear = substr($birthday, 0, 4);
                $currentYear = date("Y");
                $age = $currentYear - $birthdayYear;
            }
            $ft_ids = [];
            $deletes = [];
            foreach ($filetypes as $ft) {
                if ($ft["option"]) {
                    if ($ft["rel"] == "birthday") {
                        if ($age < $ft["option"]) {
                            $deletes[] = $ft["id"];
                            continue;
                        }
                    } else {
                        $selectVal = $param[$ft["rel"]];
                        $conditions = array_filter(explode(",", $ft["option"]));
                        if (!in_array($selectVal, $conditions)) {
                            $deletes[] = $ft["id"];
                            continue;
                        }
                    }
                }
                $ft_ids[] = $ft["id"];
            }

            $data["name"] = $param["name"];
            $data["enterprise_id"] = $this->user["uid"];
            $data["nation"] = $param["nation"];
            $data["card_type"] = $param["card_type"];
            $data["card_number"] = $param["card_number"];
            $data["sex"] = $param["sex"];
            $data["birthday"] = $param["birthday"];
            $data["politics"] = $param["politics"];
            $data["nationality"] = $param["nationality"];
            $data["province"] = $param["province"];
            $data["city"] = $param["city"];
            $data["county"] = $param["county"];
            $data["talent_type"] = $param["talent_type"];
            if (in_array($data["talent_type"], [1, 2])) {
                $data["tax_insurance_month"] = $param["tax_insurance_month"];
                $data["labor_contract_rangetime"] = $param["labor_contract_rangetime"];
                $data["salary_pay_way"] = $param["salary_pay_way"];
                $data["salary_pay_month"] = $param["salary_pay_month"];
                $data["fst_work_time"] = $param["fst_work_time"];
                $data['pre_import_type'] = null;
            } else {
                $data["tax_insurance_month"] = null;
                $data["labor_contract_rangetime"] = null;
                $data["salary_pay_way"] = null;
                $data["salary_pay_month"] = null;
                $data["fst_work_time"] = null;
                $data['pre_import_type'] = $param["pre_import_type"];
            }
            $data["experience"] = $param["experience"];
            $data["education"] = $param["education"];
            if ($info["real_state"] == 4) {
                //真实状态4是驳回，需要判断什么字段可以提交                
                $modify_fields = array_filter(explode(",", $info["modify_fields"]));
                $tmp_data = $data;
                $data = [];
                if ($tmp_data["id"]) {
                    $data["id"] = $tmp_data["id"];
                }
                foreach ($modify_fields as $field) {
                    $data[$field] = $tmp_data[$field];
                }
            }
            $success_msg = "保存成功";
            $error_msg = "保存失败";
            if ($checkState == TalentState::FST_SAVE) {
                if ($data["id"] > 0) {
                    TalentModel::update($data);
                } else {
                    $data["checkState"] = $checkState;
                    $id = TalentModel::insertGetId($data);
                    TalentLogApi::write(1, $id, $checkState, "添加人才认定申报", 1);
                    $whr = [];
                    $whr[] = ["fileId", "in", $files];
                    $upd_checklog["mainId"] = $id;
                    Db::table("new_talent_checklog")->where($whr)->save($upd_checklog);
                }
            } else if ($checkState == TalentState::FST_SUBMIT) {
                $success_msg = "提交成功";
                $error_msg = "提交失败";
                $data["checkState"] = $checkState;
                $data["first_submit_time"] = date("Y-m-d H:i:s");
                if ($data["id"] > 0) {
                    TalentModel::update($data);
                } else {
                    $id = TalentModel::insertGetId($data);
                    $whr = [];
                    $whr[] = ["fileId", "in", $files];
                    $upd_checklog["mainId"] = $id;
                    Db::table("new_talent_checklog")->where($whr)->save($upd_checklog);
                }
                TalentLogApi::write(1, $id, $checkState, "提交基础判定材料待审核", 1);
            } else {
                throw new ValidateException("错误的审核状态");
            }
            if ($id) {
                if ($deletes) {
                    //删除多余的附件，一般是选择人才类型留下来的
                    $whr = [];
                    $whr[] = ["typeId", "in", $deletes];
                    $whr[] = ["id", "in", $files];
                    $_wait_del_files = Db::table("new_talent_file")->where($whr)->select()->toArray();
                    $_logfileIds[] = [];
                    foreach ($_wait_del_files as $_del_file) {
                        $_logfileIds[] = $_del_file["id"];
                        @unlink("storage/" . $_del_file["url"]);
                    }
                    Db::table("new_talent_file")->where($whr)->delete();
                    if ($_logfileIds) {
                        $whr = [];
                        $whr[] = ["fileId", "in", $_logfileIds];
                        $_upd_checklog["description"] = "人才申报过程1中取消且已经彻底删除的附件";
                        $_upd_checklog["updateUser"] = sprintf("%s(%s)", $this->user["account"], $this->user["companyName"] ?: $this->user["rolename"]);
                        $_upd_checklog["updateTime"] = date("Y-m-d H:i:s");
                        Db::table("new_talent_checklog")->where($whr)->save($_upd_checklog);
                    }
                }

                $whr = [];
                $whr[] = ["id", "in", $files];
                Db::table("new_talent_file")->where($whr)->save(["mainId" => $id]);
                $res = ["code" => 200, "msg" => $success_msg, "obj" => ["id" => $id, "checkState" => $checkState]];
                $callback = $checkState == TalentState::FST_SAVE ? "infoCallback" : "submitCallback";
                echo sprintf("<script>parent.TalentInfoInfoDlg.{$callback}(%s);</script>", json_encode($res));
                exit();
            } else {
                throw new ValidateException($error_msg);
            }
        } catch (ValidateException $e) {
            $res = ["msg" => $e->getMessage()];
            $callback = $checkState == TalentState::FST_SAVE ? "infoCallback" : "submitCallback";
            echo sprintf("<script>parent.TalentInfoInfoDlg.{$callback}(%s);</script>", json_encode($res));
            exit();
        }
    }

    public function delete() {
        $id = $this->request->param("talentInfoId");
        $info = Talent::chkIsOwner($id, $this->user["uid"]);
        if (!$info) {
            return json(["msg" => "操作失败"]);
        }
        $checkState = $info["checkState"];
        if (in_array($checkState, [0, 1])) {
            $log = TalentLogApi::getLastLog($id, 1);
            if ($log["state"] > 1) {
                //有提交审核记录
                return json(["msg" => "操作失败"]);
            }
        }
        $data["id"] = $id;
        $data["delete"] = 1;
        TalentModel::update($data);
        return json(["msg" => "删除成功"]);
    }

}
