package com.proit.debitors.model;

import com.fasterxml.jackson.annotation.JsonFormat;
import org.codehaus.jackson.annotate.JsonIgnore;
import org.hibernate.validator.constraints.NotEmpty;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.multipart.MultipartFile;

import javax.persistence.*;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.nio.file.SimpleFileVisitor;
import java.text.SimpleDateFormat;
import java.util.Date;

@Entity
@Table(name="APP_DEBITOR")
public class Debitor implements Serializable{

	@JsonIgnore
	@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
	private Integer id;

	@NotEmpty
	@Column(name="IDNO", nullable=false)
	private String idno;


	@Column(name="NUME_DIRECTOR", nullable=true)
	private String directorName;

	@Column(name="TELEFON", nullable=true)
	private String telefon;

	@Column(name="EMAIL", nullable=true)
	private String email;

	@NotNull
	@Column(name="SUMA_DATORIE", nullable = false)
	private Long sumaDatorie;

	@JsonIgnore
	@NotNull
	@DateTimeFormat(pattern = "yyyy-MM-dd")
	@Column(name="DATA_DATORIE", nullable=false)
	private Date dataDatorie;


	@JsonIgnore
	@ManyToOne(fetch=FetchType.EAGER)
	@JoinColumn(name="user_id")
	private User user;


	@Column(name="FILE_NAME", nullable=true)
	private String fileName;

	@JsonIgnore
	@Column(name="FILE_TYPE", nullable=true)
	private String fileType;

	//@Lob
	@JsonIgnore
	@Column(name="FILE_DATA", nullable=true, columnDefinition = "blob")
	private byte[] fileData;

	@JsonIgnore
	@Transient
    private MultipartFile file;

	public MultipartFile getFile() {
		return file;
	}

	public void setFile(MultipartFile file) {
		this.file = file;
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getIdno() {
		return idno;
	}

	public void setIdno(String idno) {
		this.idno = idno;
	}

	public String getDirectorName() {
		return directorName;
	}

	public void setDirectorName(String directorName) {
		this.directorName = directorName;
	}

	public String getTelefon() {
		return telefon;
	}

	public void setTelefon(String telefon) {
		this.telefon = telefon;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public Long getSumaDatorie() {
		return sumaDatorie;
	}

	public void setSumaDatorie(Long sumaDatorie) {
		this.sumaDatorie = sumaDatorie;
	}


	public Date getDataDatorie() {
		return dataDatorie;
	}

	//@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
	@Transient
	public String getData()
	{
		if (dataDatorie == null) {
			return "";
		}
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
		return df.format(dataDatorie);
	}

	public void setDataDatorie(Date dataDatorie) {
		this.dataDatorie = dataDatorie;
	}

	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}


	public String getFileName() {
		return fileName;
	}

	public void setFileName(String fileName) {
		this.fileName = fileName;
	}

	public String getFileType() {
		return fileType;
	}

	public void setFileType(String fileType) {
		this.fileType = fileType;
	}

	public byte[] getFileData() {
		return fileData;
	}

	public void setFileData(byte[] fileData) {
		this.fileData = fileData;
	}

	@Override
	public boolean equals(Object o) {
		if (this == o) return true;
		if (o == null || getClass() != o.getClass()) return false;

		Debitor debitor = (Debitor) o;

		if (id != null ? !id.equals(debitor.id) : debitor.id != null) return false;
		if (idno != null ? !idno.equals(debitor.idno) : debitor.idno != null) return false;
		if (directorName != null ? !directorName.equals(debitor.directorName) : debitor.directorName != null)
			return false;
		if (telefon != null ? !telefon.equals(debitor.telefon) : debitor.telefon != null) return false;
		if (email != null ? !email.equals(debitor.email) : debitor.email != null) return false;
		if (sumaDatorie != null ? !sumaDatorie.equals(debitor.sumaDatorie) : debitor.sumaDatorie != null) return false;
		if (dataDatorie != null ? !dataDatorie.equals(debitor.dataDatorie) : debitor.dataDatorie != null) return false;
		if (user != null ? !user.equals(debitor.user) : debitor.user != null) return false;
		if (fileName != null ? !fileName.equals(debitor.fileName) : debitor.fileName != null) return false;
		if (fileType != null ? !fileType.equals(debitor.fileType) : debitor.fileType != null) return false;
		//return Arrays.equals(fileData, debitor.fileData);

		return true;

	}

	@Override
	public int hashCode() {
		int result = id != null ? id.hashCode() : 0;
		result = 31 * result + (idno != null ? idno.hashCode() : 0);
		result = 31 * result + (directorName != null ? directorName.hashCode() : 0);
		result = 31 * result + (telefon != null ? telefon.hashCode() : 0);
		result = 31 * result + (email != null ? email.hashCode() : 0);
		result = 31 * result + (sumaDatorie != null ? sumaDatorie.hashCode() : 0);
		result = 31 * result + (dataDatorie != null ? dataDatorie.hashCode() : 0);
		result = 31 * result + (user != null ? user.hashCode() : 0);
		result = 31 * result + (fileName != null ? fileName.hashCode() : 0);
		result = 31 * result + (fileType != null ? fileType.hashCode() : 0);
		//result = 31 * result + Arrays.hashCode(fileData);
		return result;
	}

	@Override
	public String toString() {
		return "Debitor{" +
				"id=" + id +
				", idno='" + idno + '\'' +
				", directorName='" + directorName + '\'' +
				", telefon='" + telefon + '\'' +
				", email='" + email + '\'' +
				", sumaDatorie=" + sumaDatorie +
				", dataDatorie=" + dataDatorie +
				", user=" + user +
				", fileName='" + fileName + '\'' +
				", fileType='" + fileType + '\'' +
				'}';
	}
}
