import java.io.BufferedReader;
import java.util.ArrayList;
import java.util.List;

import com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx;
import com.orientechnologies.orient.core.db.record.OIdentifiable;
import com.orientechnologies.orient.core.metadata.schema.OType;
import com.orientechnologies.orient.core.record.impl.ODocument;
import com.orientechnologies.orient.core.sql.OCommandSQL;
import com.orientechnologies.orient.core.sql.query.OSQLSynchQuery;
import com.orientechnologies.orient.core.storage.ORecordDuplicatedException;


public class CDatabaseSetData 
{
	ODatabaseDocumentTx m_aq_db = null;
	
	
	CDatabaseSetData()
	{
		// nothing to do here 
	}
	
	public void setDatabase(ODatabaseDocumentTx aq_db)
	{
		m_aq_db = aq_db;
	}	
	
	public boolean createDocument(ODocument doc)
	{
		return false;
	}
	
	public boolean deleteDocument(ODocument doc)
	{
		try
		{
			m_aq_db.begin();
			doc.delete();
			m_aq_db.commit();
			System.out.println("Document successfully deleted.");
			return true;
		}
		catch(Exception e)
		{
			System.err.println("An error occured while deleting the document.");
			System.err.println(e.getMessage());
			return false;
		}

	}
	
	public boolean alterDocument(String uip, ODocument doc)
	{
		String[] m_uip = uip.split(",");
		String m_cmd = null;
		String m_key = m_uip[0].trim();
		String m_val = m_uip[1].trim();
		
		
		if(m_uip.length == 3)
		{
			m_cmd = m_uip[2].trim();
		}		
		try
		{
			//m_aq_db.begin();  updates are outside transactions!!!!
			
			if(m_cmd != null)
			{
				
				if(m_cmd.toLowerCase().equals("add"))
				{				
					int ret = m_aq_db.command(new OCommandSQL("update "+doc.getIdentity().toString()+" add RegisteredIn = #"+m_val)).execute();
					System.out.println(ret);
				}
				else if(m_cmd.toLowerCase().equals("remove"))
				{
					int ret = m_aq_db.command(new OCommandSQL("update "+doc.getIdentity().toString()+" remove RegisteredIn = #"+m_val)).execute();
					System.out.println(ret);
				}
					
			}
			else
			{
				doc.field(m_key,m_val);		
			}
			
			m_aq_db.getMetadata().getSchema().reload();
			doc.save();
			//m_aq_db.commit();
			System.out.println("Document successfully altered.");
			return true;
		}
		catch(Exception e)
		{
			System.err.println("An error occured altering the document.");
			System.err.println(e.getMessage());
			
			return false;
		}
	}
	
	public void setPredefinedData()
	{
		try
		{
			// signalize begin of new transaction
			m_aq_db.begin();
			
			// predefined professors
			ODocument professor_1 = new ODocument("Professor");
			professor_1.field("Name", "Dagobert");
			professor_1.field("Surname", "Duck");
			professor_1.field("DateOfBirth","1952-05-05");
			professor_1.field("Picture", "link/to/picture");
			professor_1.field("Number", 12345);
			
			// non predefined fields also possible
			professor_1.field("Lecture", "Databases");
			professor_1.save();
			
			ODocument professor_2 = new ODocument("Professor");
			professor_2.field("Name", "Nicky");
			professor_2.field("Surname", "Duck");
			professor_2.field("DateOfBirth","1990-12-05");
			professor_2.field("Picture", "link/to/picture");
			professor_2.field("Number", 65432);
			
			// non predefined fields also possible
			professor_2.field("Lecture", "Dancing");
			professor_2.save();
			
			ODocument professor_3 = new ODocument("Professor");
			professor_3.field("Name", "Quack");
			professor_3.field("Surname", "Duck");
			professor_3.field("DateOfBirth","1955-05-05");
			professor_3.field("Picture", "link/to/picture");
			professor_3.field("Number", 23472);
			
			// non predefined fields also possible
			professor_3.field("Lecture", "Artificial Intelligence");
			professor_3.save();
			
			ODocument professor_4 = new ODocument("Professor");
			professor_4.field("Name", "Daniel");
			professor_4.field("Surname", "Düsentrieb");
			professor_4.field("DateOfBirth","1972-05-05");
			professor_4.field("Picture", "link/to/picture");
			professor_4.field("Number", 34526);
			
			// non predefined fields also possible
			professor_4.field("Lecture", "Machine Learning");
			professor_4.save();
			
			
			// predefinded lectures
			ODocument lecture_1 = new ODocument("Lecture");
			lecture_1.field("Name", "Databases");
			lecture_1.field("Number", 3465);
			lecture_1.field("Credits","5");
			lecture_1.field("LecturedBy", professor_1);
			lecture_1.save();
			
			ODocument lecture_2 = new ODocument("Lecture");
			lecture_2.field("Name", "Artificial Intelligence");
			lecture_2.field("Number", 7634);
			lecture_2.field("Credits","5");
			lecture_2.field("LecturedBy", professor_3);
			lecture_2.save();
			
			ODocument lecture_3 = new ODocument("Lecture");
			lecture_3.field("Name", "Machine Learning");
			lecture_3.field("Number", 2386);
			lecture_3.field("Credits","5");
			lecture_3.field("LecturedBy", professor_4);
			lecture_3.save();
			
			ODocument lecture_4 = new ODocument("Lecture");
			lecture_4.field("Name", "Mathematics");
			lecture_4.field("Number", 2357);
			lecture_4.field("Credits","5");
			lecture_4.field("LecturedBy", professor_4);
			lecture_4.save();
			
			ODocument lecture_5 = new ODocument("Lecture");
			lecture_5.field("Name", "Robotics");
			lecture_5.field("Number", 9934);
			lecture_5.field("Credits","5");
			lecture_5.field("LecturedBy", professor_3);
			lecture_5.save();
			
			ODocument lecture_6 = new ODocument("Lecture");
			lecture_6.field("Name", "Dancing");
			lecture_6.field("Number", 2222);
			lecture_6.field("Credits","30");
			lecture_6.field("LecturedBy", professor_4);
			lecture_6.save();
			
			
			// predefined students
			
			List<OIdentifiable> linklist_student = new ArrayList<OIdentifiable>();
			linklist_student.add(lecture_3);
			linklist_student.add(lecture_2);
			linklist_student.add(lecture_1);
			linklist_student.add(lecture_5);
			linklist_student.add(lecture_4);
			
			ODocument student_1 = new ODocument("Student");
			student_1.field("Name", "Donald");
			student_1.field("Surname", "Duck");
			student_1.field("DateOfBirth","1982-09-01");
			student_1.field("Picture", "link/to/picture");
			student_1.field("Number", 19283);
			student_1.field("RegisteredIn", linklist_student);
			student_1.save();
			
			linklist_student.clear();
			linklist_student.add(lecture_1);
			linklist_student.add(lecture_5);
			linklist_student.add(lecture_4);
			
			ODocument student_2 = new ODocument("Student");
			student_2.field("Name", "Tick");
			student_2.field("Surname", "Duck");
			student_2.field("DateOfBirth","1999-09-01");
			student_2.field("Picture", "link/to/picture2");
			student_2.field("Number", 10593);
			student_2.field("RegisteredIn", linklist_student);
			student_2.save();
			
			linklist_student.clear();
			linklist_student.add(lecture_2);
			linklist_student.add(lecture_3);
			linklist_student.add(lecture_1);
			
			ODocument student_3 = new ODocument("Student");
			student_3.field("Name", "Trick");
			student_3.field("Surname", "Duck");
			student_3.field("DateOfBirth","1999-09-01");
			student_3.field("Picture", "link/to/picture3");
			student_3.field("Number", 95435);
			student_3.field("RegisteredIn", linklist_student);
			student_3.save();
			
			linklist_student.clear();
			linklist_student.add(lecture_1);
			linklist_student.add(lecture_5);
			linklist_student.add(lecture_3);
			linklist_student.add(lecture_4);
			
			ODocument student_4 = new ODocument("Student");
			student_4.field("Name", "Track");
			student_4.field("Surname", "Duck");
			student_4.field("DateOfBirth","1999-09-01");
			student_4.field("Picture", "link/to/picture4");
			student_4.field("Number", 34981);
			student_4.field("RegisteredIn", linklist_student);
			student_4.save();
			
			linklist_student.clear();
			linklist_student.add(lecture_6);
			
			ODocument student_5 = new ODocument("Student");
			student_5.field("Name", "Doofy");
			student_5.field("Surname", "Duck");
			student_5.field("DateOfBirth","1995-09-01");
			student_5.field("Picture", "link/to/picture5");
			student_5.field("Number", 23523);
			student_5.field("Status", "longterm student");
			student_5.field("RegisteredIn", linklist_student);
			student_5.save();
	
			// signalize end of transaction
			m_aq_db.commit();
			
			System.out.println("Documents created");
		}
		catch(ORecordDuplicatedException e)
		{
			System.err.println(e.getMessage());
		}
	}
}
