package eu.dnetlib.goldoa.domain;

import com.google.gwt.user.client.rpc.IsSerializable;

import javax.persistence.*;
import java.util.Date;

@Entity
@Table(name="Budget")
public class Budget implements IsSerializable {
	private static final long serialVersionUID = 1L;

	public enum Status implements IsSerializable {
		INCOMPLETE("Incomplete", 1),
		SUBMITTED("Submitted", 2),
		INITIALLY_APPROVED("Initially approved", 4),
		APPROVED("Approved", 8),
		REJECTED("Rejected", 16),
		ACCOUNTING_PROCESSING("Processing payment", 32),
		ACCOUNTING_ONHOLD("Processing payment", 64),
		ACCOUNTING_DENIED("Payment denied", 128),
		ACCOUNTING_PAID("Paid", 256),
		EXPIRED("Expired", 512);

		private String value;
		private int code;

		Status(String value, int code) {
			this.value = value;
			this.code = code;
		}

		public String getValue() {
			return value;
		}

		public int getCode() {
			return code;
		}

		public static Status forStatus(int status) {
			if (status == 1)
				return INCOMPLETE;
			else
				return Status.values()[((int) Math.round(Math.log(status)/Math.log(2)))];
		}
	}

	@Id
	@Column(columnDefinition = "text")
	private String id;


	@Temporal(TemporalType.DATE)
	private Date startdate;

	@Temporal(TemporalType.DATE)
	private Date enddate;

	@OneToOne(cascade = CascadeType.ALL)
	@JoinColumn(name="bankreceipt")
	private BankTransferReceipt bankTransferReceipt;

	@OneToOne(cascade = CascadeType.ALL)
	@JoinColumn(name="contract")
	private File bankAccount;

	@OneToOne(cascade = CascadeType.ALL)
	@JoinColumn(name = "invoice")
	private Invoice invoice;

	@Basic
	@Convert( converter=BudgetStatusConverter.class )
	private Status status;

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "fund", nullable = false)
	private Fund fund;

	public Budget() {
	}

	public String getId() {
		return id;
	}

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

	public Date getStartdate() {
		return startdate;
	}

	public void setStartdate(Date startdate) {
		this.startdate = startdate;
	}

	public Date getEnddate() {
		return enddate;
	}

	public void setEnddate(Date enddate) {
		this.enddate = enddate;
	}

	public BankTransferReceipt getBankTransferReceipt() {
		return bankTransferReceipt;
	}

	public void setBankTransferReceipt(BankTransferReceipt bankTransferReceipt) {
		this.bankTransferReceipt = bankTransferReceipt;
	}

	public File getBankAccount() {
		return bankAccount;
	}

	public void setBankAccount(File bankAccount) {
		this.bankAccount = bankAccount;
	}

	public Invoice getInvoice() {
		return invoice;
	}

	public void setInvoice(Invoice invoice) {
		this.invoice = invoice;
	}

	public Status getStatus() {
		return status;
	}

	public void setStatus(Status status) {
		this.status = status;
	}
}