package com.yiboshi.science.enumeration;

public class CommonEnum {

    protected interface INumberEnum {
        Integer getCode();

        String getDescription();
    }

    protected interface ICharEnum {
        char getCode();

        String getDescription();
    }

    protected interface IStringEnum {
        String getKey();

        String getDescription();
    }

    /**
     * 系统级别
     */
    public enum unitLevel implements INumberEnum {

        province(125, "省级"),
        prefecture(124, "地州(市)级"),
        county(123, "县级"),
        towns(800, "乡镇级"),
        village(801, "村级"),
        none(0, "无");

        unitLevel(Integer number, String description) {
            this.code = number;
            this.description = description;
        }

        private Integer code;
        private String description;

        @Override
        public Integer getCode() {
            return code;
        }

        @Override
        public String getDescription() {
            return description;
        }

        public static unitLevel getEnum(Integer value) {
            for (unitLevel e : unitLevel.values()) {
                if (e.getCode().equals(value))
                    return e;
            }
            return unitLevel.none;//For values out of enum scope
        }
    }

    public enum timeType implements INumberEnum {
        projApply(1, "项目申报"),
        taskReport(2, "任务书上报"),
        middleCheck(3, "中期考核"),
        talentApply(4, "人才申报");

        timeType(int number, String description) {
            this.code = number;
            this.description = description;
        }

        private Integer code;
        private String description;

        @Override
        public Integer getCode() {
            return code;
        }

        @Override
        public String getDescription() {
            return description;
        }

        public static timeType getEnum(Integer value) {
            for (timeType e : timeType.values()) {
                if (e.getCode().equals(value))
                    return e;
            }
            return timeType.projApply;//For values out of enum scope
        }
    }

    public enum projType implements INumberEnum {
        num(1, "卫生健康领域科技计划项目"),
        key(2, "公立医院高水平临床专科建设科技项目");

        projType(int number, String description) {
            this.code = number;
            this.description = description;
        }

        private Integer code;
        private String description;

        @Override
        public Integer getCode() {
            return code;
        }

        @Override
        public String getDescription() {
            return description;
        }

        public static projType getEnum(Integer value) {
            for (projType e : projType.values()) {
                if (e.getCode().equals(value))
                    return e;
            }
            return projType.num;//For values out of enum scope
        }
    }

    /**
     * 单位类型
     */
    public enum unitType implements INumberEnum {
        gov(0, "行政单位"),
        hospital(1, "医疗机构"),
        other(3, "其它");

        unitType(Integer number, String description) {
            this.code = number;
            this.description = description;
        }

        private Integer code;
        private String description;

        @Override
        public Integer getCode() {
            return code;
        }

        @Override
        public String getDescription() {
            return description;
        }

        public static unitType getEnum(Integer value) {
            for (unitType e : unitType.values()) {
                if (e.getCode().equals(value))
                    return e;
            }
            return unitType.gov;//For values out of enum scope
        }
    }

    /**
     * 单位状态
     */
    public enum unitState implements INumberEnum {

        normal(1, "正常"),
        cancel(2, "注销"),
        delete(5, "删除");

        unitState(int number, String description) {
            this.code = number;
            this.description = description;
        }

        private Integer code;
        private String description;

        @Override
        public Integer getCode() {
            return code;
        }

        @Override
        public String getDescription() {
            return description;
        }

        public static unitState getEnum(Integer value) {
            for (unitState e : unitState.values()) {
                if (e.getCode().equals(value))
                    return e;
            }
            return unitState.normal;//For values out of enum scope
        }
    }

    /**
     * 系统角色
     */
    public enum systemRole implements INumberEnum {
        sys(4, "超级管理员"),
        topGov(0, "最高级行政单位管理员"),
        gov(1, "行政单位管理员"),
        unit(2, "医疗机构管理员"),
        personal(3, "立项用户"),
        expert(5, "专家");

        systemRole(int number, String description) {
            this.code = number;
            this.description = description;
        }

        private Integer code;
        private String description;

        @Override
        public Integer getCode() {
            return code;
        }

        @Override
        public String getDescription() {
            return description;
        }

        public static systemRole getEnum(Integer value) {
            for (systemRole e : systemRole.values()) {
                if (e.getCode().equals(value))
                    return e;
            }
            return systemRole.unit;//For values out of enum scope
        }
    }

    /**
     * 人员状态
     */
    public enum personState implements INumberEnum {
        normal(1, "正常"),
        cancel(2, "注销");
        personState(int number, String description) {
            this.code = number;
            this.description = description;
        }

        private Integer code;
        private String description;

        @Override
        public Integer getCode() {
            return code;
        }

        @Override
        public String getDescription() {
            return description;
        }

        public static personState getEnum(Integer value) {
            for (personState e : personState.values()) {
                if (e.getCode().equals(value))
                    return e;
            }
            return personState.normal;//For values out of enum scope
        }
    }

    /**
     * 专家状态
     */
    public enum loginState implements INumberEnum {
        start(1, "启用"),
        stop(2, "停用");

        loginState(int number, String description) {
            this.code = number;
            this.description = description;
        }

        private Integer code;
        private String description;

        @Override
        public Integer getCode() {
            return code;
        }

        @Override
        public String getDescription() {
            return description;
        }

        public static loginState getEnum(Integer value) {
            for (loginState e : loginState.values()) {
                if (e.getCode().equals(value))
                    return e;
            }
            return loginState.start;//For values out of enum scope
        }
    }

    /**
     * 用户状态
     */
    public enum userState implements INumberEnum {

        normal(1, "正常"),
        cancel(2, "注销");

        userState(int number, String description) {
            this.code = number;
            this.description = description;
        }

        private Integer code;
        private String description;

        @Override
        public Integer getCode() {
            return code;
        }

        @Override
        public String getDescription() {
            return description;
        }

        public static userState getEnum(Integer value) {
            for (userState e : userState.values()) {
                if (e.getCode().equals(value))
                    return e;
            }
            return userState.normal;//For values out of enum scope
        }
    }

    /**
     * 项目状态
     */
    public enum projState implements INumberEnum {
        draft(-10, "起草"),
        waitSubmit(10, "待提交"),
        toAudit(20, "评审中"),
        returnModify(30, "返回修改"),
        failed(40, "未批准立项"),
        pass(50, "批准立项"),
        report(55, "结题上报"),
        conclusion(60, "已结题");
        projState(int number, String description) {
            this.code = number;
            this.description = description;
        }

        private Integer code;
        private String description;

        @Override
        public Integer getCode() {
            return code;
        }

        @Override
        public String getDescription() {
            return description;
        }

        public static projState getEnum(Integer value) {
            for (projState e : projState.values()) {
                if (e.getCode().equals(value))
                    return e;
            }
            return projState.draft;//For values out of enum scope
        }
    }

    public enum talentState implements INumberEnum {
        draft(-10, "起草"),
        waitSubmit(10, "待提交"),
        toAudit(20, "审核中"),
        returnModify(30, "返回修改"),
        failed(40, "审核不通过"),
        pass(50, "审核通过");
        //report(55, "结题上报"),
        //conclusion(60, "已结题");
        talentState(int number, String description) {
            this.code = number;
            this.description = description;
        }

        private Integer code;
        private String description;

        @Override
        public Integer getCode() {
            return code;
        }

        @Override
        public String getDescription() {
            return description;
        }

        public static talentState getEnum(Integer value) {
            for (talentState e : talentState.values()) {
                if (e.getCode().equals(value))
                    return e;
            }
            return talentState.draft;//For values out of enum scope
        }
    }

    /**
     * 论文上传状态
     */
    public enum thesisState implements INumberEnum {
        unFilled(0, "未上传"),
        waitAudit(1, "待审核"),
        pass(10, "通过"),
        returnModify(30, "返回修改"),
        failed(20, "不通过");
        thesisState(int number, String description) {
            this.code = number;
            this.description = description;
        }

        private Integer code;
        private String description;

        @Override
        public Integer getCode() {
            return code;
        }

        @Override
        public String getDescription() {
            return description;
        }

        public static thesisState getEnum(Integer value) {
            for (thesisState e : thesisState.values()) {
                if (e.getCode().equals(value))
                    return e;
            }
            return thesisState.unFilled;//For values out of enum scope
        }
    }


    /**
     * 结题状态
     */
    public enum conclusionState implements INumberEnum {
        unFilled(0, "未填报"),
        draft(1, "起草"),
        waitSubmit(10, "待上报"),
        report(20, "已上报"),
        returnModify(30, "返回修改"),
        failed(40, "不通过"),
        pass(50, "已通过");
        conclusionState(int number, String description) {
            this.code = number;
            this.description = description;
        }

        private Integer code;
        private String description;

        @Override
        public Integer getCode() {
            return code;
        }

        @Override
        public String getDescription() {
            return description;
        }

        public static conclusionState getEnum(Integer value) {
            for (conclusionState e : conclusionState.values()) {
                if (e.getCode().equals(value))
                    return e;
            }
            return conclusionState.unFilled;//For values out of enum scope
        }
    }

    /**
     * 任务书状态
     */
    public enum taskState implements INumberEnum {
        noWrite(0, "未填写"),
        draft(-10, "起草"),
        waitSubmit(10, "待提交"),
        review(20, "审核中"),
        returnModify(30, "返回修改"),
        failed(40, "审核不通过"),
        pass(50, "审核通过");

        taskState(int number, String description) {
            this.code = number;
            this.description = description;
        }

        private Integer code;
        private String description;

        @Override
        public Integer getCode() {
            return code;
        }

        @Override
        public String getDescription() {
            return description;
        }

        public static taskState getEnum(Integer value) {
            for (taskState e : taskState.values()) {
                if (e.getCode().equals(value))
                    return e;
            }
            return taskState.noWrite;//For values out of enum scope
        }
    }

    /**
     * 中期考核状态
     */
    public enum checkState implements INumberEnum {
        noSubmit(1, "未上报"),
        review(5, "审核中"),
        returnModify(30, "返回修改"),
        failed(20, "审核不通过"),
        pass(10, "审核通过");

        checkState(int number, String description) {
            this.code = number;
            this.description = description;
        }

        private Integer code;
        private String description;

        @Override
        public Integer getCode() {
            return code;
        }

        @Override
        public String getDescription() {
            return description;
        }

        public static checkState getEnum(Integer value) {
            for (checkState e : checkState.values()) {
                if (e.getCode().equals(value))
                    return e;
            }
            return checkState.noSubmit;//For values out of enum scope
        }
    }

    /**
     * 审核结果
     */
    public enum auditResult implements INumberEnum {
        waitAudit(1, "待审核"),
        returnModify(30, "返回修改"),
        failed(20, "审核不通过"),
        pass(10, "审核通过");

        auditResult(int number, String description) {
            this.code = number;
            this.description = description;
        }

        private Integer code;
        private String description;

        @Override
        public Integer getCode() {
            return code;
        }

        @Override
        public String getDescription() {
            return description;
        }

        public static auditResult getEnum(Integer value) {
            for (auditResult e : auditResult.values()) {
                if (e.getCode().equals(value))
                    return e;
            }
            return auditResult.waitAudit;//For values out of enum scope
        }
    }

    public enum auditMethod implements INumberEnum {
        audit(1, "审核"),
        last(5, "终审");

        auditMethod(int number, String description) {
            this.code = number;
            this.description = description;
        }

        private Integer code;
        private String description;

        @Override
        public Integer getCode() {
            return code;
        }

        @Override
        public String getDescription() {
            return description;
        }

        public static auditMethod getEnum(Integer value) {
            for (auditMethod e : auditMethod.values()) {
                if (e.getCode().equals(value))
                    return e;
            }
            return auditMethod.audit;//For values out of enum scope
        }
    }

    /**
     * 审核类型
     */
    public enum auditType implements INumberEnum {
        project(1, "项目审核"),
        task(2, "任务书审核"),
        check(3, "中期考核审核"),
        conclusion(4, "结题审核"),
        thesis(5, "论文审核"),
        talent(6, "人才申报审核");

        auditType(int number, String description) {
            this.code = number;
            this.description = description;
        }

        private Integer code;
        private String description;

        @Override
        public Integer getCode() {
            return code;
        }

        @Override
        public String getDescription() {
            return description;
        }

        public static auditType getEnum(Integer value) {
            for (auditType e : auditType.values()) {
                if (e.getCode().equals(value))
                    return e;
            }
            return auditType.check;
        }
    }

    /**
     * 日志类型
     */
    public enum logType implements IStringEnum {
        nullValue("nullValue", "空值"),
        userLogin("userLogin", "用户登录"),
        userRegister("userRegister", "用户注册"),
        userAudit("userAudit", "用户审核"),
        userReset("userReset", "重置密码"),
        sendVerificationCode("sendVerificationCode", "发送验证码"),

        personUpdate("personUpdate", "人员信息修改"),
        personInfoUpdate("personInfoUpdate", "人员信息修改(后台)"),
        personStateUpdate("personStateUpdate", "人员状态修改"),

        userStateUpdate("userStateUpdate", "用户状态修改"),

        expertAdd("expertAdd", "添加专家"),
        expertStateUpdate("expertStateUpdate", "专家状态修改"),
        expertUpdate("expertUpdate", "专家修改"),
        expertDelete("expertDelete", "删除专家"),

        managerAdd("managerAdd", "添加管理员"),
        managerStateUpdate("managerAdd", "修改管理员状态"),
        managerDelete("managerDelete", "删除管理员"),

        unitRegister("unitRegister", "单位注册"),
        unitAudit("unitAudit", "单位审核"),
        unitAdd("unitAdd", "单位添加"),
        unitUpdate("unitUpdate", "单位信息修改"),
        unitStateUpdate("unitStateUpdate", "单位状态修改"),
        unitDelete("unitDelete", "单位删除"),

        projectSave("projectSave", "项目信息保存"),
        projectComplete("projectComplete", "项目完成填写"),
        projectReport("projectReport", "项目上报"),
        projectAudit("projectAudit", "项目审核"),
        projectDelete("projectDelete", "项目删除"),
        projectAssign("projectAssign", "项目分配"),
        assignDelete("assignDelete", "删除评分记录"),

        taskSave("taskBookSave", "合同书保存"),
        taskReport("taskBookReport", "合同书上报"),
        taskAudit("taskBookAudit", "合同书审核"),

        conclusionSave("conclusionSave", "结题信息保存"),
        conclusionReport("conclusionReport", "结题上报"),
        conclusionAudit("conclusionAudit", "结题审核"),

        appUnitUpdate("appUnitUpdate", "申报单位修改"),

        thesisAudit("thesisAudit", "论文审核"),

        batchAdd("batchAdd", "批次添加"),
        batchUpdate("batchUpdate", "批次删除"),
        batchDelete("batchDelete", "批次修改"),

        checkReport("checkReport", "中期考核上报"),
        checkAudit("checkAudit", "中期考核表审核"),

        fileUpload("fileUpload", "文件上传"),
        fileDelete("fileDelete", "文件删除"),

        parameterUpdate("parameterUpdate", "保存字典"),
        parameterDelete("parameterDelete", "删除字典"),

        auditRecordDelete("auditRecordSave", "删除评审记录"),
        auditRecordSave("auditRecordSave", "修改/添加评审记录"),

        talentApplySave("talentApply", "人才申报保存"),
        talentApplyComplete("talentApplyComplete", "人才申报完成填写"),
        talentApplyReport("talentApplyReport", "人才申报信息上报"),
        talentApplyAudit("talentApplyAudit", "人才申报信息审核"),
        talentApplyDelete("talentApplyDelete", "人才申报信息删除");

        logType(String key, String description) {
            this.key = key;
            this.description = description;
        }

        private String key;
        private String description;

        @Override
        public String getKey() {
            return key;
        }

        @Override
        public String getDescription() {
            return description;
        }

        public static logType getEnum(String value) {
            for (logType e : logType.values()) {
                if (e.getKey().equals(value))
                    return e;
            }
            return logType.nullValue;//For values out of enum scope
        }
    }

    /**
     * 文件类型
     */
    public enum fileType implements INumberEnum {

        project(10, "项目附件"),
        Conclusion(20, "结题附件"),
        reviewOpinions(30, "学术委员会审查意见"),
        projectTask(40, "任务书文件"),
        talentApply(50, "人才申报");

        fileType(int number, String description) {
            this.code = number;
            this.description = description;
        }

        private Integer code;
        private String description;

        @Override
        public Integer getCode() {
            return code;
        }

        @Override
        public String getDescription() {
            return description;
        }

        public static fileType getEnum(Integer value) {
            for (fileType e : fileType.values()) {
                if (e.getCode().equals(value))
                    return e;
            }
            return fileType.project;//For values out of enum scope
        }
    }
}