import com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx;
import com.orientechnologies.orient.core.metadata.schema.OClass;
import com.orientechnologies.orient.core.metadata.schema.OType;


public class CDatabaseCreator 
{
	private ODatabaseDocumentTx m_db;
	
	CDatabaseCreator(ODatabaseDocumentTx db)
	{
		m_db = db;
	}
	
	public boolean setRawClasses()
	{
		try
		{
			// abstract class person 
			OClass person = m_db.getMetadata().getSchema().getClass("Person");
			if (m_db.getMetadata().getSchema().getClass("Person") == null)
			{
				person = m_db.getMetadata().getSchema().createClass("Person").setAbstract(true).setStrictMode(false);
				
				person.createProperty("Name", OType.STRING).setMandatory(true).setNotNull(true);
				person.createProperty("Surname", OType.STRING).setMandatory(true).setNotNull(true);
				person.createProperty("DateOfBirth", OType.DATE).setMandatory(true).setNotNull(true);
				person.createProperty("Picture", OType.BINARY).setMandatory(true).setNotNull(true);
				person.createProperty("Number", OType.INTEGER).setRegexp("[1-9]{5}").setMandatory(true).setNotNull(true);
				
				person.createIndex("PersonIdx", OClass.INDEX_TYPE.UNIQUE, "Number","Name","Surname","DateOfBirth");
				person.createIndex("NumberIdx", OClass.INDEX_TYPE.UNIQUE, "Number");
			}
			
			//inherited class Professor
			OClass professor = m_db.getMetadata().getSchema().getClass("Professor");
			if (professor == null)
			{
				professor = m_db.getMetadata().getSchema().createClass("Professor").addSuperClass(person);
			}	
			
			// inherited class lecture
			OClass lecture = m_db.getMetadata().getSchema().getClass("Lecture");
			if (lecture == null)
			{
				lecture = m_db.getMetadata().getSchema().createClass("Lecture");
				
				lecture.createProperty("Name", OType.STRING).setMandatory(true).setNotNull(true);
				lecture.createProperty("Number", OType.INTEGER).setRegexp("[1-9]{4}").setMandatory(true).setNotNull(true);
				lecture.createProperty("Credits", OType.INTEGER).setMandatory(true).setNotNull(true);
				lecture.createProperty("LecturedBy", OType.LINK, professor).setMandatory(true).setNotNull(true);
			}
			
			// inherited class student
			OClass student = m_db.getMetadata().getSchema().getClass("Student");
			if (student == null)
			{
				student = m_db.getMetadata().getSchema().createClass("Student").addSuperClass(person);
				
				// LINKSET doesn't allow duplicates.
				student.createProperty("RegisteredIn", OType.LINKSET, lecture).setMandatory(false);
	
			}
			
			m_db.getMetadata().getSchema().save();
			
			System.out.println("Classes created.");
			
			return true;
		}
		catch(Exception e)
		{
			System.err.println("Some error occured creating schema & classes.");
			System.err.println(e.getMessage());
			
			return false;
		}
	} 
}
