package com.zipcoder.server;

import java.io.*;
import java.net.URISyntaxException;

public class Logger {

    private enum Type{
        INFO, ERROR;
    }

    public static void info(String message) {
        log(Type.INFO, message);
    }

    public static void error(String message, Exception e) {
        log(Type.ERROR, message);

        PrintWriter writer = getWriter();
        e.printStackTrace(writer);
        closeWriter(writer);
    }

    private static void log(Type type, String message) {
        Writer writer = null;
        try {
            writer = writeMessage(type, message);
        } catch (IOException e) {
            System.err.println("Unable to write message");
            e.printStackTrace();
        } finally {
            closeWriter(writer);
        }
    }

    private static Writer writeMessage(Type type, String message) throws IOException {
        Writer writer = getWriter();
        writer.append(type.name() + ": " + message + "\n");
        return writer;
    }

    private static void closeWriter(Writer writer) {
        try {
            if (writer != null){
                writer.close();
            }
        } catch (IOException e) {
            System.err.println("Unable to close log file.");
        }
    }

    private static PrintWriter getWriter() {
        PrintWriter writer = null;
        try {
            writer = new PrintWriter(new FileWriter(getLogFile(), true));
        } catch (Exception e) {
            handleException(e);
            writer = new PrintWriter(System.out);
        }
        return writer;
    }

    private static File getLogFile() throws URISyntaxException, IOException {
        File file = new File(Config.PUBLIC_DIRECTORY + Config.LOG_PATH);
        if (!file.exists()){
            file.createNewFile();
        }
        return file;
    }

    private static void handleException(Exception e) {
        System.err.println("Unable to open log file.");
        e.printStackTrace();
    }
}