#! /usr/bin/python3

from init_input import *
from print_plot import *
from raster_heuristics_three_strategies import *

def folder_name (parameters):
    '''
        Compõe o nome da pasta onde serão armazenados os resultados e a cria.
    '''
    parameters['folder'] = './RESULTS/HEURISTIC ' + str(parameters['heuristic'])

    if not (parameters['heuristic'] == 1):
        parameters['folder'] = parameters['folder'] + ' - DELTA ' + str(parameters['delta'])

    if parameters['heuristic'] == 2:
        if parameters['rasterLink']:
            parameters['folder'] = parameters['folder'] + ' (WITH RASTER LINK)'
        else:
            parameters['folder'] = parameters['folder'] + ' (WITHOUT RASTER LINK)'

    if parameters['heuristic'] == 3:
        parameters['folder'] += ' ()'
        folderName = list()
        if parameters['splitBlocks']:
            folderName.append('SPLIT')

        if parameters['limitBlocks']:
           folderName.append('LIMIT #' + str(parameters['maxLine']) + ' LINES')
        
        if parameters['limitTime']:
            folderName.append('LIMIT TIME')

        if len(folderName) > 0:
            for i in folderName:
                parameters['folder'] = parameters['folder'].replace(')', i+'&)')
            parameters['folder'] = parameters['folder'].replace('&)', ')')
                
        else:
            parameters['folder'] = parameters['folder'].replace(')', 'ORIGINAL BLOCKS)')

def apply_heuristic(parameters, R, G):
    if parameters['heuristic'] == 1:
        start_time = time.time()
        S, Tend, Cmax, smax = scan_line_order (R, parameters)
        end_time = time.time()

    elif parameters['heuristic'] == 2 and not parameters['rasterLink']:
        start_time = time.time()
        S, Tend, Cmax, smax = greedy_selection_lines_withoutRL (R, parameters['delta'], parameters, start_time)
        end_time = time.time()

    elif parameters['heuristic'] == 2:
        start_time = time.time()
        S, Tend, Cmax, smax = greedy_selection_lines_withRL (R, parameters['delta'], parameters, start_time)
        end_time = time.time()

    elif parameters['heuristic'] == 3:
        start_time = time.time()
        S, Tend, Cmax, smax = greedy_selection_blocks (R, G, parameters['delta'], parameters, start_time)
        end_time = time.time()
    execution_time = end_time-start_time

    return S, Tend, Cmax, smax, execution_time

def show_results (S, Tend, Cmax, smax, execution_time, checkCooling, folder, summary, parameters):
    out = sys.stdout

    if S == -1: # Caso o arquivo não passe no teste do delta.
        if parameters['csv']:
            summary.append([parameters['filename'].replace('.txt',''), '-', '-', '-', '-', '-', '-', str(checkCooling).replace('.', ',')])
            sys.stderr.write("*************FAILED | DELTA\n")
    
    elif S == -3: # Caso o teste atinja o tempo máximo permitido.
        if parameters['csv']:
            summary.append([parameters['filename'].replace('.txt',''), 't', 't', 't', 't', 't', 't', str(checkCooling).replace('.', ',')])
            sys.stderr.write("*************FAILED | TIME\n")

    elif S != None:
        if not os.path.exists(folder):
            os.makedirs(folder)

        blockNumber, listRaster, listAirJump, listRasterLink, listPoints = create_list_result(S, parameters)
        tE, tA = total_time (S, parameters)

        if parameters['debug']:
            plot_debug(S, listRaster, listAirJump, listRasterLink, listPoints, blockNumber, parameters)

        if parameters['png']: 
            if not os.path.exists(parameters['folder'] + '/PNG'):
                os.makedirs(parameters['folder'] + '/PNG')
            plot_slice(S, listRaster, listAirJump, listRasterLink, listPoints, parameters)

        if parameters['tex']:
            if not os.path.exists(parameters['folder'] + '/TEX'):
                os.makedirs(parameters['folder'] + '/TEX')
            create_tex(S, listRaster, listRasterLink, listPoints, parameters)

        if parameters['log']:
            if not os.path.exists(parameters['folder'] + '/LOG'):
                os.makedirs(parameters['folder'] + '/LOG')
            create_log(S, listRaster, parameters, execution_time, tE, tA, Tend, Cmax, smax, blockNumber)

        if parameters['gcode']:
            if not os.path.exists(parameters['folder'] + '/GCODE'):
                os.makedirs(parameters['folder'] + '/GCODE')
            create_gcode(S, listRaster, listRasterLink, parameters)

        if parameters['csv']:
            tE = str(tE).replace('.', ',')
            tA = str(tA).replace('.', ',')
            Tend = str(Tend).replace('.', ',')
            Cmax =  str(Cmax).replace('.', ',')
            execution_time =  str(execution_time).replace('.', ',')
            checkCooling = str(checkCooling).replace('.', ',')
            summary.append([parameters['filename'].replace('.txt',''), blockNumber, tE, tA, Tend, Cmax, execution_time, checkCooling])

        sys.stderr.write("*************SUCCEDED\n")

    else:
        if parameters['csv']:
            summary.append([parameters['filename'].replace('.txt',''), 'x', 'x', 'x', 'x', 'x', 'x', checkCooling])
            sys.stderr.write("*************FAILED\n")

    sys.stdout = out

########################################################################################
sys.setrecursionlimit(99999)
summary = list()

parameters = read_config()
folder_name(parameters)

for file in os.listdir("./INPUT - V2/"):
    if file.endswith(".txt") and "config" not in file:
        parameters['filename'] = file.replace('.txt', "")

        S = None
        R = None
        G = None
        execution_time = 0

        filename = "./INPUT - V2/" + '/' + file
        R = read_raster(filename, parameters)
        read_sides(filename, parameters, R)

        if parameters['heuristic'] == 3:
            if parameters['splitBlocks']:
                split_blocks(R, parameters)

            if parameters['limitBlocks']:
                limit_blocks (R, parameters)

            G = find_first_last (R, parameters)
            maxTime = calculate_time (R, G, parameters)

            if parameters['limitTime']:
                checkDelta = True
                while maxTime > parameters['delta'] and checkDelta:
                    checkDelta = check_delta (R, G, parameters)

                    if checkDelta:
                        #delete_rasterLink(R)
                        G = find_first_last (R, parameters)
                        maxTime = calculate_time (R, G, parameters)

        if parameters['input']:
            plot_input(R, parameters)

        checkCooling = -1

        if parameters['heuristic'] == 2:
            checkCooling = find_cooling_h2 (R, parameters) 

        elif parameters['heuristic'] == 3:
            checkCooling = find_cooling_h3 (R, G, parameters) 
        
        if checkCooling < parameters['delta']:
            S, Tend, Cmax, smax, execution_time = apply_heuristic(parameters, R, G)
        
        else:
            S = -1
            Tend = None
            Cmax = 0
            smax = 0
            execution_time = None

        show_results (S, Tend, Cmax, smax, execution_time, checkCooling, parameters['folder'], summary, parameters)

if parameters['csv']:
    if not os.path.exists('./RESULTS/CSV'):
        os.makedirs('./RESULTS/CSV')
    create_csv(summary, parameters['folder'].replace('RESULTS', 'RESULTS/CSV'))