package dao.ex2;

import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;

import dao.DAO;
import dao.Student;

public class Dao2 implements DAO<Long, Student> {

  private static final int EOF = -1;

  public Student get(Long key) {
    Student s = null;
    Socket socket;
    ObjectOutputStream out;
    ObjectInputStream in;
    try {
      socket = new Socket("localhost", 4444);
      out = new ObjectOutputStream(socket.getOutputStream());
      in = new ObjectInputStream(socket.getInputStream());
      out.writeObject(new Integer(DAO.GET));
      out.writeObject(new Long(key));
      s = (Student) in.readObject();
      out.writeObject(new Integer(EOF));
      socket.close();
      out.close();
      in.close();
    } catch (Exception e) {
      e.printStackTrace();
    }
    return s;
  }

  public void add(Long key, Student value) {
    Socket socket;
    ObjectOutputStream out;
    ObjectInputStream in;
    try {
      socket = new Socket("localhost", 4444);
      out = new ObjectOutputStream(socket.getOutputStream());
      in = new ObjectInputStream(socket.getInputStream());
      out.writeObject(new Integer(DAO.ADD));
      out.writeObject(new Long(key));
      out.writeObject(value);
      out.writeObject(new Integer(EOF));
      socket.close();
      out.close();
      in.close();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  public void update(Long key, Student value) {
    Socket socket;
    ObjectOutputStream out;
    ObjectInputStream in;
    try {
      socket = new Socket("localhost", 4444);
      out = new ObjectOutputStream(socket.getOutputStream());
      in = new ObjectInputStream(socket.getInputStream());
      out.writeObject(new Integer(DAO.UPDATE));
      out.writeObject(new Long(key));
      out.writeObject(value);
      out.writeObject(new Integer(EOF));
      socket.close();
      out.close();
      in.close();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  public void delete(Long key) {
    Socket socket;
    ObjectOutputStream out;
    ObjectInputStream in;
    try {
      socket = new Socket("localhost", 4444);
      out = new ObjectOutputStream(socket.getOutputStream());
      in = new ObjectInputStream(socket.getInputStream());
      out.writeObject(new Integer(DAO.DELETE));
      out.writeObject(new Long(key));
      out.writeObject(new Integer(EOF));
      socket.close();
      out.close();
      in.close();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  public static void main(String args[]) {
    Dao2 d = new Dao2();
    Student s = d.get(200934878L);
    System.out.println(s);
    d.add(160355385L, new Student(160355385L, "Caravaggio", 98.0));
    s = d.get(160355385L);
    System.out.println(s);
    d.update(160355385L, new Student(160355385L, "Michelangelo Merisi", 99.5));
    s = d.get(160355385L);
    System.out.println(s);
  }

}
