package procesador;

import java.io.BufferedWriter;
import java.io.IOException;

public class GestorError {

    private static BufferedWriter pte;
    private static int countLine = 1;
    private static Acciones currError;
    private static String errorCase;
    private static boolean outOfBound;

    public static void setOutputMessageFile(BufferedWriter buffer) {
        pte = buffer;
    }

    // Define el error a tratar,
    // accion = identificador del error
    // lexema = cadena de caracteres implicada en el error.
    public static void setError(Acciones accion, String lexema) {
        currError = accion;
        errorCase = lexema;
        printError();
    }

    public static Acciones getCurrError() {
        return currError;
    }

    public static void defErrorCase(String badChars) {
        errorCase += badChars;
    }

    public static int getCountLine() {
        return countLine;
    }

    public static void increaseCountLine() {
        countLine++;
    }

    public static boolean getOutOfBoundStatus() {
        return outOfBound;
    }

    public static void setOutOfBoundStatus(boolean t) {
        outOfBound = t;
    }

    public static void writeError(String tipo, String errorMessage) {
        try {
            pte.write("Error " + tipo + " en la linea [" + countLine + "]: " + errorMessage + "\n");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void printError() {
        if (currError != null) {
            try {
                switch (currError) {
                    case eLex0_ERROR_OC:
                        pte.write("Error linea [" + countLine + "]: Caracter no reconocido - " + errorCase + "\n");
                        break;
                    case eLex0_CIERRE_COMENTARIO_ILEGAL:
                        pte.write("Error en la linea [" + countLine + "]: Comentario no inicializado\n");
                        break;
                    case eLex2_ERROR_SALTO_LINEA:
                        pte.write("Error en la linea [" + countLine
                                + "]: La cadena de caracteres no puede contener salto de linea - " + errorCase + "\n");
                        break;
                    case eLex2_ERROR_LONGITUD_MAXIMA_CADENA:
                        pte.write("Error en la linea [" + countLine
                                + "]: La cadena no puede contener mÃ¡s de 64 caracteres - " + errorCase + "\n");
                        break;
                    case eLex2_ERROR_CADENA_INCOMPLETA:
                        pte.write("Error en la linea [" + countLine + "]: La cadena no se ha cerrado");
                        break;
                    case eLex3_ERROR_LONGITUD_MAXIMA_ID:
                        pte.write("Error en la linea [" + countLine
                                + "]: El identificador no puede contener mÃ¡s de 32 caracteres - " + errorCase + "\n");
                        break;
                    case eLex4_ERROR_VALOR_MAXIMO_ENTERO:
                        pte.write("Error en la linea [" + countLine + "]: Entero fuera de rango - " + errorCase + "\n");
                        break;
                    case eLex6_ERROR_COMENTARIO_NO_CERRADO:
                        pte.write("Error en la linea [" + countLine + "]: El comentario no se ha cerrado.");
                        break;

                    default:
                        break;
                }
                currError = null;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}
