package fr.atlantique.imt.ueirs6.comrec.model;

import java.util.*;

import jakarta.persistence.*;

/**
 * Entity implementation class for Entity: Emp
 * 
 */
// @PrimaryKeyJoinColumn(name = "ref_person")
@Table(name = "employees")
@Entity
public class Emp {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Integer empno;

	@Column(name = "ename")
	private String name;
	private String job;

	private Date hiredate;
	private float salary;
	private float commission;

	@ManyToOne
	@JoinColumn(name = "dept_fk")
	private Dept dept;

	@ManyToOne
	@JoinColumn(name = "mngr_fk")
	private Emp manager;

	@OneToMany(mappedBy = "manager")
	private Set<Emp> lowers;

	/*
	 * No argument constructor. Needed for persistence
	 */
	public Emp() {
	}

	public Emp(String ename, String job, Emp mngr, Dept dept, Date hiredate, float sal, float comm) {
		if (ename == null || ename.isEmpty())
			throw new IllegalArgumentException("Name cannot be null or empty");
		if (job == null || job.isEmpty())
			throw new IllegalArgumentException("Job cannot be null or empty");

		if (hiredate == null)
			throw new IllegalArgumentException("Hiredate cannot be null");
		if (sal < 0)
			throw new IllegalArgumentException("Salary cannot be negative");
		if (comm < 0)
			throw new IllegalArgumentException("Commission cannot be negative");

		this.setName(ename);
		this.setJob(job);
		if (mngr != null)
			this.setManager(mngr);
		if (dept != null)
			this.setDept(dept);
		this.setHiredate(hiredate);
		this.setSalary(sal);
		this.setCommission(comm);
		this.lowers = new HashSet<Emp>();
	}

	// Getter methods
	public int getEmpno() {
		return empno;
	}

	public String getName() {
		return name;
	}

	public String getJob() {
		return job;
	}

	public Emp getManager() {
		return manager;
	}

	public Set<Emp> getLowers() {
		return lowers;
	}

	public Date getHiredate() {
		return hiredate;
	}

	public float getSalary() {
		return salary;
	}

	public float getCommission() {
		return commission;
	}

	public Dept getDept() {
		return dept;
	}

	// ------------------------------------------------------
	// Setter methods
	public void setEmpno(int empno) {
		this.empno = empno;
	}

	public void setJob(String job) {
		this.job = job;
	}

	private void setName(String name) {
		this.name = name;
	}

	public void setManager(Emp manager) {
		this.manager = manager;
	}

	public void setLowers(Set<Emp> lower) {
		this.lowers = lower;
	}

	public void setHiredate(Date hiredate) {
		this.hiredate = hiredate;
	}

	public void setSalary(float salary) {
		this.salary = salary;
	}

	public void setCommission(float commission) {
		this.commission = commission;
	}

	public void setDept(Dept dept) {
		this.dept = dept;
	}

	@Override
	public String toString() {
		String ret = "Emp [" + getEmpno() + ", " + getName() + ", " + getJob() + ", ";
		Emp m = getManager();
		Dept d = getDept();
		if (m != null)
			ret += "(mngr : " + m.getName() + "), ";
		else
			ret += "(mngr : NULL), ";
		if (d != null)
			ret += "(dept : " + d.getDName() + "), ";
		else
			ret += "(dept : NULL), ";

		if (lowers != null && !lowers.isEmpty()) {
			ret += "(lowers : ";
			for (Emp e : lowers)
				ret += e.getName() + ", ";
			ret += "), ";
		} else
			ret += "(lowers : NULL), ";

		ret += " " + getSalary() + " (" + getCommission() + ")]";
		return ret;
	}

	// ------------------------------------------------------

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((empno == null) ? 0 : empno.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Emp other = (Emp) obj;
		if (empno == null) {
			if (other.empno != null)
				return false;
		} else if (!empno.equals(other.empno))
			return false;
		return true;
	}
}