/* 
 * This is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 * 
 * This software is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this software; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
 * USA.
 */
/** 
	 * AndroidLog.java
	 * Autor: Alberto Población Navarro
	 * Añadido al proyecto en la version v0.2.5
	 * Añadido a:
	 		* Proyecto original: http://code.google.com/p/android-vnc-viewer/
	 		* Release: 39
*/
package android.androidVNC;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintStream;
import java.sql.Date;

import android.os.Environment;
import android.util.Log;


public class AndroidLog {

	private static final String TAG = "AndroidLog";
	//Flag para saber si esta marcado el checkbox del menu inicial
	private static boolean saveLog=true;
	//Variables para almacenar estadisticas
	private int tramas_enviadas; //No hay manera de saber si la trama ha llegado bien o no
	private int tramas_recibidas_correctas;
	private int tramas_recibidas_erroneas;
	//Clase que permite escribir en un stream
	private PrintStream printStream = null;
	//Archivo en el que vamos a escribir el log
	private File file;
	
	//Aplicamos patrón singleton para asegurarnos que solo haya una instancia de la clase	
	private static AndroidLog instancia = null;
	
	/**
	 * Constructor de instacia de esta clase. Solo se va a crear una instancia por ejecución del programa.
	 * En caso de que no se haya creado la instacia se crea, en caso contrario se devuelve la creada anteriormente.
	 * @return instancia de la clase.
	 */
	static public AndroidLog Instancia(){
		if (instancia == null)
			instancia = new AndroidLog();
		return instancia;
	}
	private AndroidLog() {
		tramas_enviadas=0;
		tramas_recibidas_correctas=0;
		tramas_recibidas_erroneas=0;
		
		if(saveLog){	
			String path;
			String sdcard_status = Environment.getExternalStorageState();
			//Comprobamos si hay un medio extraible donde se pueda guardar el log
	        if(sdcard_status.equals(Environment.MEDIA_REMOVED)){
	        	//Si no hay tarjeta de memoria crearemos el log en la memoria interna del movil
	        	//Se crea en la carpeta del propio programa
	        	path = "/data/data/android.androidVNC/";
	        }else path = "/sdcard/"; //Si hay tarjeta se guarda en la tarjeta
	        String nombre = new String("androidVNC.html");
			//Archivo que usara el buffer de salida para guardar la imagen
			file = new File(path+nombre);
			try {
				//Mediante esta clase podemos escribir en el archivo directamente
				printStream = new PrintStream(file);
														
			} catch (FileNotFoundException e) {
				Log.d(TAG, "Excepcion: "+e.toString());
				e.printStackTrace();
			}
			printStream.append("<html><body>"); //Cabezera del archivo HTML
			printStream.append("<title>AndroidVNC Log</title>");//Titulo
			printStream.append("<p><b>[INFO]<i> Ejecucion iniciada: "+new Date(System.currentTimeMillis()).toLocaleString()+"</i></b></p>");
			printStream.flush();//Liberamos el buffer de escritura
			
		}
	}
	/**
	 * Aumentará en una unidad la cantidad de tramas enviadas del cliente al servidor
	 */
	public void envio_de_trama(){
		tramas_enviadas++;
	}
	/**
	 * Cada vez que se reciba una trama correcta se ha de llamar a esa funcion para 
	 * aumentar en una unidad el numero de tramas recibidas correctas
	 */
	public void recepcion_correcta(){
		tramas_recibidas_correctas++;
	}
	/**
	 * Cada vez que se reciba una trama erronea se ha de llamar a esa funcion para 
	 * aumentar en una unidad el numero de tramas recibidas erróneas
	 */
	public void recepcion_erronea(){
		tramas_recibidas_erroneas++;
	}
	/**
	 * Función que devuelve en forma de cadena las tramas enviadas / recibidas
	 * @return cadena con la información de las tramas.
	 */
	public String FramestoString(){
		return("<b>[Info]</b> Tramas Enviadas: " + tramas_enviadas
				+" Tramas Recibidas: Correctas:" +tramas_recibidas_correctas
				+" Erroneas: "+tramas_recibidas_erroneas+"\n");
	}
	/**
	 * Añade al registro en formato HTML la cadena pasada por parametro,
	 * como identificador de la clase se utilizara el parametro TAG 
	 * @param TAG identificador de la clase donde se llame a la funcion.
	 * @param string Información que se va a imprimir en el log.
	 */
	public void log(String TAG, String string){
		if(saveLog){
		printStream.format("<p><b>[%s]</b> %s</p>",TAG, string);
		printStream.flush();
		}
	}
	/**
	 * Establace si se ha de salvar o no el registro según el checkbox del menú inicial
	 * @param save True si se ha de salvar el registro, false en caso contrario
	 * @return devuelve en nuevo valor de la variable.
	 */
	static public boolean setsaveLog(boolean save){
		return saveLog = save;
	}
	/**
	 * Devuelve true en caso de que se haya guardado el registro, false n caso contrario
	 * @return boolean se si guarda o no el registro
	 */
	static public boolean getsavelog() {
		return saveLog;
	}
	/**
	 * Cuando se llame a este procedimiento si se ha guardado el log:
	 * Imprimimos las estadisiticas y cerramos las etiquetas html.
	 * Liberamos y cerramos el buffer de escritura.
	 * Liberamos la instancia para que se cree una nueva la proxima vez. 
	 */
	@Override
	protected void finalize(){
		if(saveLog){
			printStream.append("<p>"+FramestoString()+"</p>");
			printStream.append("<p><b>[INFO]<i> Ejecucion finalizada: "+new Date(System.currentTimeMillis()).toLocaleString()+"</i></b></p>");
			printStream.append("</body></html>");
			printStream.flush();
			printStream.close();
		}
		instancia = null;	
	}

	
		
}
