package org.ccpit.base.user;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.OneToOne;

import org.ccpit.base.modol.BaseEntity;
import org.ccpit.base.orgManage.OrgInfo;
import org.ccpit.base.role.Role;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import org.hibernate.annotations.Where;

import com.fasterxml.jackson.annotation.JsonIgnore;

/**
 * Created by Administrator on 2015/9/2.
 */
@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@Where(clause="whetherDelete = 'false'")
public class User extends BaseEntity implements IUser,Serializable{
	
	/**
	 * serialVersionUID:TODO(用一句话描述这个变量表示什么).
	 * @since JDK 1.6
	 */
	
	
	private static final long serialVersionUID = 1L;
	/**
	 * 用户名
	 */
    private String username;
    /**
     * 密码
     */
    private String password;
    /**
     * 登录名
     */
    private String loginName;
    /**
     * 年龄
     */
    private Integer age;
    /**
     * 性别
     */
    private String sex;
    /**
     * 公司名称
     */
    private String company;
    /**
     * 邮箱
     */
    private String email;
    /**
     * 账号状态 (0 无效 | 1 有效)
     */
    private Integer countStatus;
    /**
     * 电话
     */
    private String telphone;
    /**
	 * 创建人
	 */
	private String creator;
	/**
	 * 创建人Id
	 */
	private long creatorId;
	/**
	 * 创建时间
	 */
	private Date createTime;
	/**
	 * 登录次数
	 */
    private Integer loginCount;
    /**
     * 用户类型 (back | front)
     */
    private String userType;
    @JsonIgnore
    private Set<Role> roles = new HashSet<Role>();
    @JsonIgnore
    private List<OrgInfo> orgInfo = new ArrayList<OrgInfo>();
    @JsonIgnore
    private UserEmail userEmail;
    
    /**
	 * 是否删除
	 */
	private boolean whetherDelete;
    
    @Override
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    public long getId() {
        return super.getId();
    }
    @Override
    public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String getLoginName() {
        return loginName;
    }

    public void setLoginName(String loginName) {
        this.loginName = loginName;
    }

    @Override
    public int hashCode() {
        return ("user"+getId()).hashCode();
    }
    @Override
    public boolean equals(Object o) {
        if(o == null){
            return false;
        }
        if(o == this){
            return true;
        }
        if(o.getClass() == User.class){
            return o.hashCode()==this.hashCode();
        }
        return false;
    }

    @ManyToMany(fetch = FetchType.EAGER,cascade = CascadeType.ALL)
    @JoinTable(name = "user_Roles",
            joinColumns = {@JoinColumn(name = "user_id", referencedColumnName = "id")},
            inverseJoinColumns = {@JoinColumn(name = "role_id", referencedColumnName ="id")})
    public Set<Role> getRoles() {
        return roles;
    }
    //维护端
  	@ManyToMany(fetch=FetchType.LAZY,cascade = CascadeType.PERSIST,mappedBy="users")
  	public List<OrgInfo> getOrgInfo() {
  		return orgInfo;
  	}
  	public void setOrgInfo(List<OrgInfo> orgInfo) {
  		this.orgInfo = orgInfo;
  	}
    public void setRoles(Set<Role> roles) {
        this.roles = roles;
    }
	public String getUserType() {
		return userType;
	}
	public void setUserType(String userType) {
		this.userType = userType;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public String getCompany() {
		return company;
	}
	public void setCompany(String company) {
		this.company = company;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public Integer getCountStatus() {
		return countStatus;
	}
	public void setCountStatus(Integer countStatus) {
		this.countStatus = countStatus;
	}
	public String getTelphone() {
		return telphone;
	}
	public void setTelphone(String telphone) {
		this.telphone = telphone;
	}
	public String getCreator() {
		return creator;
	}
	public void setCreator(String creator) {
		this.creator = creator;
	}
	public long getCreatorId() {
		return creatorId;
	}
	public void setCreatorId(long creatorId) {
		this.creatorId = creatorId;
	}
	public Date getCreateTime() {
		return createTime;
	}
	public void setCreateTime(Date createTime) {
		this.createTime = createTime;
	}
	public Integer getLoginCount() {
		return loginCount;
	}
	public void setLoginCount(Integer loginCount) {
		this.loginCount = loginCount;
	}
	@OneToOne
	public UserEmail getUserEmail() {
		return userEmail;
	}
	public void setUserEmail(UserEmail userEmail) {
		this.userEmail = userEmail;
	}
	public boolean isWhetherDelete() {
		return whetherDelete;
	}
	public void setWhetherDelete(boolean whetherDelete) {
		this.whetherDelete = whetherDelete;
	}
    
}