import logging
import fileinput
import re
import os
import numpy as np
from pathlib import Path

from ajustador.helpers.loggingsystem import getlogger

logger = getlogger(__name__)
logger.setLevel(logging.DEBUG)

def get_least_fitness_params(data, fitnum= None):
    """ fitnum == None -> return last item least fitness parameters list.
        fitnum == integer -> return fitnum item from data(npz object).
    """
    row = fitnum if fitnum else np.argmin(data['fitvals'][:,-1])
    return (row, np.dstack((data['params'][row],data['paramnames']))[0])

def check_key_in_npz_data(npz_data, key):
    if key in npz_data.files:
         return True
    logger.error("No KEY {} in optimization npz data load!!!".format(key))
    return False

def make_new_file_name_from_npz(npz_data, npz_file_name, dest_path, neuron_type, file_in):
    "Makes new cond file name from npz data"
    logger.info("file_in={} npz_file={} dest_path={} {}".format(file_in, npz_file_name, dest_path, neuron_type))
    if check_key_in_npz_data(npz_data,'neuron_type') \
    and check_key_in_npz_data(npz_data,'measurment_name'): # may be removed in future.
       if npz_data['neuron_type'] in npz_data['measurment_name']:
           file_name = file_in.rstrip('.py') + '_' + npz_data['measurment_name'] + '.py'
       else:
           file_name = file_in.rstrip('.py') + '_' + npz_data['measurment_name'] + npz_data['neuron_type'] + '.py'
    else:
        file_name = file_in.rstrip('.py') + '_' + os.path.basename(npz_file_name).rpartition('-' + neuron_type + '-')[2].rstrip('.npz') + '.py'
    logger.debug("{} {}".format(file_in.rstrip('.py'), file_name))
    return os.path.join(dest_path, file_name)

def get_params(param_data_list, prefix, exclude_flag=False):
    if exclude_flag:
        return {item[1]:item[0] for item in param_data_list if not item[1].startswith(prefix)}
    else:
        return {item[1]:item[0] for item in param_data_list if item[1].startswith(prefix)}