package com.uas.platform.b2b.model;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Index;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;

import org.codehaus.jackson.annotate.JsonIgnore;
import org.springframework.util.StringUtils;

import com.alibaba.fastjson.annotation.JSONField;
import com.uas.platform.b2b.core.util.DateFormatUtils;
import com.uas.platform.b2b.support.SystemSession;
import com.uas.platform.core.logging.BufferedLogable;

/**
 * 平台使用日志
 * 
 * @author yingp
 * 
 */
@Entity
@Table(name = "log$usage", indexes = { @Index(name = "log$usage_enuu_idx", columnList = "log_enuu") })
public class UsageLog extends BufferedLogable implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "log_id")
	private Long id;

	@Column(name = "log_enuu")
	private Long enUU;

	@OneToOne(cascade = { CascadeType.REFRESH })
	@JoinColumn(name = "log_useruu", insertable = false, updatable = false)
	private UserBaseInfo user;

	@NotNull
	@Column(name = "log_useruu")
	private Long userUU;

	/**
	 * 日志时间
	 */
	@Column(name = "log_time")
	private Long time;

	/**
	 * ip
	 */
	@Column(name = "log_ip")
	private String ip;

	@Column(name = "log_title")
	private String title;

	@Column(name = "log_message")
	private String message;

	@Column(name = "log_detail", length = 1000)
	private String detail;

	/**
	 * 相关单据号
	 */
	@Column(name = "rel_code")
	private String code;

	/**
	 * 相关单据主键
	 */
	@Column(name = "rel_key")
	private Long key;

	@JsonIgnore
	@JSONField(serialize = false)
	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public Long getEnUU() {
		return enUU;
	}

	public void setEnUU(Long enUU) {
		this.enUU = enUU;
	}

	public Long getUserUU() {
		return userUU;
	}

	public void setUserUU(Long userUU) {
		this.userUU = userUU;
	}

	public Long getTime() {
		return time;
	}

	public void setTime(Long time) {
		this.time = time;
	}

	public String getIp() {
		return ip;
	}

	public void setIp(String ip) {
		this.ip = ip;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getMessage() {
		return message;
	}

	public void setMessage(String message) {
		this.message = message;
	}

	public String getDetail() {
		return detail;
	}

	public void setDetail(String detail) {
		this.detail = detail;
	}

	public String getCode() {
		return code;
	}

	public void setCode(String code) {
		this.code = code;
	}

	public Long getKey() {
		return key;
	}

	public void setKey(Long key) {
		this.key = key;
	}

	public UserBaseInfo getUser() {
		return user;
	}

	public void setUser(UserBaseInfo user) {
		this.user = user;
	}

	@JsonIgnore
	@JSONField(serialize = false)
	public String getTimeString() {
		return DateFormatUtils.DATETIME_FORMAT.format(getTime());
	}

	public UsageLog() {

	}

	public UsageLog(String title, String message, String detail, String code,
			Long key) {
		this.enUU = SystemSession.getUser().getEnterprise().getUu();
		this.title = title;
		this.message = message;
		this.detail = detail;
		this.code = code;
		this.key = key;
		this.time = System.currentTimeMillis();
		this.userUU = SystemSession.getUser().getUserUU();
		this.ip = SystemSession.getUser().getIp();
	}

	public UsageLog(String title, String message, Long userUU, String ip,
			String code, Long key) {
		this.enUU = 0L;
		this.title = title;
		this.message = message;
		this.code = code;
		this.key = key;
		this.time = System.currentTimeMillis();
		this.userUU = userUU;
		this.ip = ip;
	}

	@Override
    public void bufferedLog(String bufferedMessage) {
		String[] strArray = bufferedMessage.split(separator);
		if (strArray.length == 9) {
			this.time = Long.parseLong(strArray[0]);
			this.ip = strArray[1];
			this.enUU = Long.parseLong(strArray[2]);
			this.userUU = Long.parseLong(strArray[3]);
			this.title = strArray[4];
			this.message = strArray[5];
			this.detail = StringUtils.hasText(strArray[6]) ? strArray[6] : null;
			this.code = StringUtils.hasText(strArray[7]) ? strArray[7] : null;
			this.key = StringUtils.hasText(strArray[8]) ? Long
					.parseLong(strArray[8]) : null;
		}
	}

	@Override
	public String bufferedMessage() {
		StringBuffer sb = new StringBuffer();
		sb.append(this.time).append(separator);
		sb.append(this.ip).append(separator);
		sb.append(this.enUU).append(separator);
		sb.append(this.userUU).append(separator);
		sb.append(this.title).append(separator);
		sb.append(this.message).append(separator);
		sb.append(this.detail == null ? "" : this.detail).append(separator);
		sb.append(this.code == null ? "" : this.code).append(separator);
		sb.append(this.key == null ? " " : this.key);
		return sb.toString();
	}

	public UsageLog(Long useruu, Long enuu, String title, String message, String description) {
		this.enUU = enuu;
		this.title = title;
		this.message = message;
		this.time = System.currentTimeMillis();
		this.userUU = useruu;
		this.detail = description;
	}
}
