package com.xmomen.module.resource.model;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.xmomen.module.resource.entity.Resource;
import com.xmomen.module.resource.service.ResourceUtilsService;
import lombok.Data;
import org.hibernate.validator.constraints.*;
import javax.validation.constraints.*;
import org.jeecgframework.poi.excel.annotation.Excel;
import org.jeecgframework.poi.excel.annotation.ExcelTarget;
import org.springframework.beans.BeanUtils;
import java.lang.Integer;
import java.lang.String;
import java.io.Serializable;

/**
 * 资源模型类，用于封装资源相关的数据，实现了 Serializable 接口以便于对象的序列化和反序列化。
 *
 * @author tanxinzheng
 * @version 1.0.0
 * @date 2017-4-10 23:26:20
 */
@ExcelTarget(value = "ResourceModel")
public class ResourceModel implements Serializable {

    /**
     * 资源的唯一标识
     * 使用 @NotBlank 注解确保该字段不为空，若为空则抛出 "为必填项" 的错误信息。
     * 使用 @Length 注解限制该字段的最大长度为 32 个字符，若超出则抛出 "字符长度限制[0,32]" 的错误信息。
     */
    @NotBlank(message = "为必填项")
    @Length(max = 32, message = "字符长度限制[0,32]")
    private String id;

    /**
     * 资源所属的实体类型
     * 使用 @Excel 注解，name 属性为空，可用于将该字段映射到 Excel 表格中。
     * 使用 @Length 注解限制该字段的最大长度为 50 个字符，若超出则抛出 "字符长度限制[0,50]" 的错误信息。
     */
    @Excel(name = "")
    @Length(max = 50, message = "字符长度限制[0,50]")
    private String entityType;

    /**
     * 资源所属的实体 ID
     * 使用 @Excel 注解，name 属性为空，可用于将该字段映射到 Excel 表格中。
     * 使用 @Length 注解限制该字段的最大长度为 100 个字符，若超出则抛出 "字符长度限制[0,100]" 的错误信息。
     */
    @Excel(name = "")
    @Length(max = 100, message = "字符长度限制[0,100]")
    private String entityId;

    /**
     * 资源的路径
     * 使用 @Excel 注解，name 属性为空，可用于将该字段映射到 Excel 表格中。
     * 使用 @Length 注解限制该字段的最大长度为 255 个字符，若超出则抛出 "字符长度限制[0,255]" 的错误信息。
     */
    @Excel(name = "")
    @Length(max = 255, message = "字符长度限制[0,255]")
    private String path;

    /**
     * 资源的类型
     * 使用 @Excel 注解，name 属性为空，可用于将该字段映射到 Excel 表格中。
     * 使用 @Length 注解限制该字段的最大长度为 30 个字符，若超出则抛出 "字符长度限制[0,30]" 的错误信息。
     */
    @Excel(name = "")
    @Length(max = 30, message = "字符长度限制[0,30]")
    private String resourceType;

    /**
     * 是否为默认资源的标识
     * 使用 @Excel 注解，name 属性为空，可用于将该字段映射到 Excel 表格中。
     * 使用 @Range 注解限制该字段的数值范围在 -999999999 到 999999999 之间，若超出则抛出 "数值范围[999999999,-999999999]" 的错误信息。
     */
    @Excel(name = "")
    @Range(max = 999999999, min = -999999999, message = "数值范围[999999999,-999999999]")
    private Integer isDefault;

    /**
     * 获取 Resource 实体对象
     * 使用 @JsonIgnore 注解，确保该方法在进行 JSON 序列化时不会被包含在内。
     * 通过 BeanUtils.copyProperties 方法将当前 ResourceModel 对象的属性复制到一个新的 Resource 实体对象中，并返回该实体对象。
     *
     * @return Resource 实体对象
     */
    @JsonIgnore
    public Resource getEntity() {
        Resource resource = new Resource();
        BeanUtils.copyProperties(this, resource);
        return resource;
    }

    /**
     * 获取资源的唯一标识
     *
     * @return 资源的唯一标识
     */
    public String getId() {
        return id;
    }

    /**
     * 设置资源的唯一标识
     *
     * @param id 资源的唯一标识
     */
    public void setId(String id) {
        this.id = id;
    }

    /**
     * 获取资源所属的实体类型
     *
     * @return 资源所属的实体类型
     */
    public String getEntityType() {
        return entityType;
    }

    /**
     * 设置资源所属的实体类型
     *
     * @param entityType 资源所属的实体类型
     */
    public void setEntityType(String entityType) {
        this.entityType = entityType;
    }

    /**
     * 获取资源所属的实体 ID
     *
     * @return 资源所属的实体 ID
     */
    public String getEntityId() {
        return entityId;
    }

    /**
     * 设置资源所属的实体 ID
     *
     * @param entityId 资源所属的实体 ID
     */
    public void setEntityId(String entityId) {
        this.entityId = entityId;
    }

    /**
     * 获取资源的完整 HTTP 路径
     * 调用 ResourceUtilsService 类的 getWholeHttpPath 方法，将当前资源的路径转换为完整的 HTTP 路径并返回。
     *
     * @return 资源的完整 HTTP 路径
     */
    public String getPath() {
        return ResourceUtilsService.getWholeHttpPath(this.path);
    }

    /**
     * 设置资源的路径
     *
     * @param path 资源的路径
     */
    public void setPath(String path) {
        this.path = path;
    }

    /**
     * 获取资源的类型
     *
     * @return 资源的类型
     */
    public String getResourceType() {
        return resourceType;
    }

    /**
     * 设置资源的类型
     *
     * @param resourceType 资源的类型
     */
    public void setResourceType(String resourceType) {
        this.resourceType = resourceType;
    }

    /**
     * 获取是否为默认资源的标识
     *
     * @return 是否为默认资源的标识
     */
    public Integer getIsDefault() {
        return isDefault;
    }

    /**
     * 设置是否为默认资源的标识
     *
     * @param isDefault 是否为默认资源的标识
     */
    public void setIsDefault(Integer isDefault) {
        this.isDefault = isDefault;
    }
}