
package utiles;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

/**
 * Esta clase se dedica en especifico al tratamiento de archivos. Contiene
 * metodos que permiten un manejo de archivos con el formato
 * "dato11;dato12;dato13*!dato21;dato22;dato23" pudiendo modificar las lineas,
 * las cuales estan separadas por *!
 */

public class Archivo {
	protected File archivo;
	protected FileReader fr;
	protected BufferedReader br;
	protected FileWriter fw;

	/**
	 * Constructor para la clase archivo, recibiendo el nombre del archivo que
	 * debera manejar, y creandolo si es que no existia previamente
	 * 
	 * @param archivo
	 *            String con el nombre del archivo al que se desea acceder/crear
	 */

	public Archivo(String archivo) {

		String ruta = getRuta(archivo);

		try {
			this.archivo = new File(ruta);
			if (!this.archivo.exists()) {

				this.archivo.createNewFile();
			}
		} catch (Exception e) {
		}
	}

	/**
	 * Actualiza el nombre de un archivo
	 * 
	 * @param nuevo
	 *            Nuevo nombre para el archivo
	 * @param old
	 *            El nombre que tiene actualmente el archivo
	 */

	public static void changeName(String nuevo, String old) {

		File oldArch = new File(getRuta(old));
		File newArch = new File(getRuta(nuevo));

		oldArch.renameTo(newArch);

	}

	/**
	 * Este metodo asigna una ruta al archivo dependiendo del sistema operativo.
	 * <p>
	 * Si es Windows lo asignara a la ruta C:\P.A.M\
	 * </p>
	 * <p>
	 * Si es Linux lo asignara al directorio de usuario en la carpeta /P.A.M/
	 * </p>
	 * 
	 * @param archivo
	 *            Nombre del archivo al que se le asignara la ruta
	 * @return La ruta completa que tendra el archivo
	 */

	public static String getRuta(String archivo) {

		String ruta = "";
		String os = System.getProperty("os.name");
		if (os.contains("Windows")) {
			ruta = "C:\\P.A.M\\";
			new File(ruta).mkdir();
			ruta += archivo;
		} else if (os.contains("Linux")) {
			ruta = System.getProperty("user.home") + "/P.A.M/";
			new File(ruta).mkdir();
			ruta += archivo;
		}
		return ruta;
	}

	/**
	 * Lee el contenido del archivo y une todas sus lineas en un solo string
	 * para ser procesado mas tarde
	 * 
	 * @return Contenido del archivo en un solo String
	 */

	public String leerArchivo() {

		abrirLeer();
		String cadena = "";
		String cadenaFinal = "";
		try {
			while ((cadena = br.readLine()) != null) {
				cadenaFinal += cadena;
			}
		} catch (IOException e) {

		}
		cerrarLeer();
		return cadenaFinal;
	}

	/**
	 * Aņade el String entregado al final del archivo
	 * 
	 * @param texto
	 *            Texto a aņadir
	 */

	public void escribirArchivo(String texto) {

		abrirEscribir();
		try {
			fw.append(texto + "*!");
		} catch (IOException e) {

		}
		cerrarEscribir();
	}

	/**
	 * Toma el contenido del archivo y lo divide en los saltos de linea, los
	 * cuales son representados por *!
	 * 
	 * @return contenido del archivo dividido en *!
	 */

	public String[] entregarProcesado() {

		String[] datos;
		datos = leerArchivo().split("\\*!");
		return datos;
	}

	/**
	 * Borra una linea respecto al id entregado
	 * @param id Texto el cual esta en el primer espacio en la lina a borrar
	 */
	
	public void borrarLinea(String id) {

		String[] arch = entregarProcesado();

		if (arch.length > 1) {

			for (int x = 0; x < arch.length; x++) {

				if (arch[x].split(";")[0].equals(id)) {

					arch[x] = "";
					break;

				}

			}

			String[] nArch = new String[arch.length - 1];
			int z = 0;

			for (int x = 0; x < arch.length; x++) {

				if (arch[x].length() > 1) {

					nArch[z] = arch[x];
					z++;

				}

			}

			actArchivo(nArch);

		} else {

			clearFile();

		}
	}

	/**
	 * Remplaza el contenido del archivo por el String[] entregado
	 * @param texto Texto con el que se remplazara el archivo
	 */
	
	public void actArchivo(String[] texto) {
		clearFile();
		abrirEscribir();
		for (int x = 0; x < texto.length; x++) {
			try {
				fw.append(texto[x] + "*!");
			} catch (IOException e) {
			}
		}
		cerrarEscribir();
	}

	/**
	 * Elimina todo el contenido del archivo
	 */
	
	public void clearFile() {
		try {
			fw = new FileWriter(archivo, false);
			fw.write("");
			fw.close();
		} catch (IOException e) {

		}
	}

	
	/**
	 * Cambia una linea del archivo
	 * 
	 * @param linea Linea original a cambiar
	 * @param nueva Linea que remplaza a la original
	 */
	public void modificarLinea(String linea, String nueva) {

		abrirEscribir();
		String[] arch = entregarProcesado();
		for (int x = 0; x < arch.length; x++) {
			if (arch[x].equals(linea)) {
				arch[x] = nueva;
				break;
			}
		}
		actArchivo(arch);
		cerrarEscribir();

	}

	private void abrirLeer() {
		try {
			fr = new FileReader(archivo);
		} catch (FileNotFoundException e) {

		}
		br = new BufferedReader(fr);
	}

	private void cerrarLeer() {
		try {
			fr.close();
		} catch (IOException e) {

		}
		try {
			br.close();
		} catch (IOException e) {

		}
	}

	private void abrirEscribir() {
		try {
			fw = new FileWriter(archivo, true);
		} catch (IOException e) {

		}
	}

	private void cerrarEscribir() {
		if (fw != null) {
			try {
				fw.close();
			} catch (IOException e) {

			}
		}
	}
}
