package com.infinite.focus.server.auth;

import java.util.Date;
import java.util.Random;
import java.util.UUID;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

import com.fasterxml.jackson.annotation.JsonIgnore;

@Entity
public class AccessCode {
	
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name="access_code_id")
	private long accessCodeId;
	
	@Transient
	private long student_id;
	 
	//Parent company id
	@Transient
	private long instructor_id;
	
	@Column(name="access_code")
	private String accessCode;
	
	@Enumerated(EnumType.STRING)
	@Column(name="status", columnDefinition = "enum('PENDING','ACCEPTED','REJECTED')")
	private Status status;
	
	@Temporal(TemporalType.TIMESTAMP)
	private Date createdDate;
	
	@OneToOne(targetEntity = Student.class, fetch = FetchType.EAGER)
    @JoinColumn(nullable = false, name = "student_id")
    private Student student;
	
	@OneToOne(targetEntity = Instructor.class, fetch = FetchType.EAGER)
    @JoinColumn(nullable = false, name = "instructor_id")
    private Instructor instructor;
	
	public AccessCode() {
	}
	
	public AccessCode(Student student, Instructor instructor) {
		this.student = student;
		this.instructor = instructor;
		accessCode = getRandomNumberString();
		status = Status.PENDING;
		createdDate = new Date();
	}

	public String getAccessCode() {
		return accessCode;
	}

	public void setAccessCode(String accessCode) {
		this.accessCode = accessCode;
	}
	public long getStudent_id() {
		return student.getStudent_id();
	}


	public void setStudent_id(long student_id) {
		this.student_id = student_id;
	}
	public Date getCreatedDate() {
		return createdDate;
	}

	public void setCreatedDate(Date createdDate) {
		this.createdDate = createdDate;
	}
	

	public void setStudent(Student student) {
		this.student = student;
	}
	
	public Student getStudent() {
		return student;
	}

	public void setInstructor(Instructor instructor) {
		this.instructor = instructor;
	}
	
	public Instructor getInstructor() {
		return instructor;
	}
	
	public long getInstructor_id() {
		return instructor.getInstructor_id();
	}


	public void setInstructor_id(long instructor_id) {
		this.instructor_id = instructor_id;
	}
	
	public Status getStatus() {
		return status;
	}

	public void setStatus(Status status) {
		this.status = status;
	}
	
	public long getAccessCodeId() {
		return accessCodeId;
	}

	public void setAccessCodeId(long accessCodeId) {
		this.accessCodeId = accessCodeId;
	}
	
	@JsonIgnore
	public String getRandomNumberString() {
	    // It will generate 6 digit random Number.
	    // from 0 to 999999
	    Random rnd = new Random();
	    int number = rnd.nextInt(999999);

	    // this will convert any number sequence into 6 character.
	    return String.format("%06d", number);
	}
}