import java.util.*;
import java.util.ArrayList;
import java.io.*;

import javax.swing.JOptionPane;

/** Esta clase implementará todas las interacciones de lectura y escritura
 *  con el disco, ya sea con archivos o con la base de datos.
 */
public class Datos
{
	private boolean cargado = false;
	
    /** Constructor de la clase
     */
    public Datos()
    {
    }

    /** Busca el "Usuario" que tenga el nombre que se le da como parametro
     * y se retorna el "Usuario"
     * @param nombre Es el nombre del Usuario que se está buscando.
     * @return el objeto "Usuario" buscado.
     */
    public Usuario cargarUsuario(String nombre)
    { 
        Usuario usr = new Usuario();
          
        try
        {
            FileInputStream input = 
                new FileInputStream("Datos/"+ nombre +".dat");
            ObjectInputStream in =  new ObjectInputStream(input);
            usr = (Usuario)in.readObject();
            in.close();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        catch (ClassNotFoundException e)
        {
        }
        
        cargado = true;
        return usr;
        
    }
    
    public void setCargado(boolean b){
    	cargado = b;
    }

    /** Guarda todos los datos del usuario en disco
     * @param usuario Es el "Usuario" al que se le guardarán sus 
     * atributos a disco
     */
    public void guardarUsuario(Usuario usuario)
    {
        try
        {  
            FileOutputStream output = 
                new FileOutputStream("Datos/" +usuario.getNombre()+".dat");
            ObjectOutputStream out = new ObjectOutputStream(output);
            out.writeObject(usuario);
            out.close();

            if (!cargado){
            	FileWriter outputFile = new FileWriter("Datos/Usuarios.txt", true);
            	outputFile.write(usuario.getNombre() + '\n');
            	outputFile.close();
            }
        }
        catch(NullPointerException e){
        	JOptionPane.showMessageDialog(
        			null,
        			"No ha cargado Usuario en la memoria.",
        			"Error",
        			JOptionPane.WARNING_MESSAGE);	
        }
        catch (Exception e)
        {  
            e.printStackTrace(); 
        }
    }

    /** Busca las "Carreras" que conoce el programa.
     * @return Un arreglo con las "Carreras" conocidas por el programa.
     */
    public static ArrayList < String > getCarreras()
    {
        ArrayList < String > carreras = new ArrayList < String > ();
        String str;
	   
        try
        {	
            FileReader inputFile = new FileReader("Datos/Carreras.txt");
            BufferedReader in = new BufferedReader(inputFile);

            while ((str = in.readLine())!=null)
                carreras.add(str);

            inputFile.close();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }

        return carreras;
    }

    /** Busca los "Usuarios" que conoce el programa.
     * @return Un arreglo con los "Usuarios" conocidos por el programa.
     */
    public static ArrayList < String > getUsuarios()
    {
        ArrayList < String > usuarios = new ArrayList < String > ();
        String str;
	
        try
        {	
            FileReader inputFile = new FileReader("Datos/Usuarios.txt");
            BufferedReader in = new BufferedReader(inputFile);

            while ((str = in.readLine())!=null)
                usuarios.add(str);
            inputFile.close();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        
        return usuarios;
    }


    /** Busca los Ramos encontrados en un archivo de carrera *.CAR.
     * @param s El codigo de la carrera.
     * @return Un arreglo con los "Usuarios" conocidos por el programa.
     */
    public ArrayList <Ramo> getMalla(String s)
    {
        ArrayList < Ramo > malla = new ArrayList < Ramo > ();
        String nombre, sigla, p; 
        int creditos, semestre, sem_dictados;
        ArrayList < String > prereq; 
        StringTokenizer strtok;
        Ramo ramo;

        try
        {	
            FileReader inputFile = new FileReader("Datos/" + s + ".car");
            BufferedReader in = new BufferedReader(inputFile);

            while(in.readLine().startsWith("#"));

            do
            {
                prereq = new ArrayList <String> ();
                nombre = in.readLine();
                sigla = in.readLine();
                creditos = Integer.parseInt(in.readLine());
                semestre = Integer.parseInt(in.readLine());
                sem_dictados = Integer.parseInt(in.readLine());
                p = in.readLine(); 
                if(p.compareTo("..") != 0)
                {
                    strtok = new StringTokenizer(p);
                    while(strtok.hasMoreTokens())
                        prereq.add(strtok.nextToken());
                } 
                 
                ramo = new Ramo(sigla, nombre, creditos, semestre,
                    prereq, sem_dictados);
                malla.add(ramo);
            } while (!in.readLine().startsWith("#"));  

            inputFile.close();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        return malla;
    }
}
