import csv

def writeToFile(file_name, line_number, M, J, log_type='Basic'):
    headers = ['Interaction']; values = [line_number+1]

    dataPoints = ['ac', 'amax', 'dc', 'dmax', 'HWmin', 'DT', 'v0', 'attentive', 'cooperative', 'angryAlpha', 'vD', 's0', 'waitFactor']

    more_headers, more_values = parseAttributes(M, dataPoints, prefix='M-')
    headers.extend(more_headers); values.extend(more_values)

    if log_type == 'Game':
        more_headers, more_values = parseAttributes(M, dataPoints, mode='dictionary', dictionaryName='opponentProperties', prefix='M-', suffix='J')
        headers.extend(more_headers); values.extend(more_values)

    more_headers, more_values = parseAttributes(J, dataPoints, prefix='J-')

    headers.extend(more_headers); values.extend(more_values)

    if log_type == 'Game':
        more_headers, more_values = parseAttributes(J, dataPoints, mode='dictionary', dictionaryName='opponentProperties', prefix='J-', suffix='M')
        headers.extend(more_headers); values.extend(more_values)

        more_headers, more_values = parseAttributes(M, ['action', 'signals', 'a1'], prefix='M-')
        headers.extend(more_headers); values.extend(more_values)

        headers.extend(['J-%AtCo', 'J-%AtPu', 'J-%DiCo', 'J-%DiPu', 'J-action0', 'J-action', 'M-payoff', 'J-Payoff', 'MinimumHW', 'Duration'])
        values.extend([
            J.Bayesian_probabilities[0], J.Bayesian_probabilities[1], J.Bayesian_probabilities[2], J.Bayesian_probabilities[3],
            J.taken_actions[0], J.action, M.payoff, J.payoff, M.minimumHW, M.interactionDuration
        ])


    if line_number == 0:
        
        with open('Results/'+file_name, 'w', newline='') as file:
            writer = csv.writer(file)
            writer.writerow(headers)
            file.close()
    
    with open('Results/'+file_name, 'a', newline='') as file:
        writer = csv.writer(file)
        writer.writerow(values)
        file.close()


def runStatistics(file_name, population, prefix=''):
    statistics = {}
    statistics  
    statistics[prefix+'avgPayoff'] = sum(entity.payoff for entity in population)/len(population)



def parseAttributes(entity, attributes, mode='attribute', dictionaryName='', prefix='', suffix=''):

    if mode == 'attribute':
        attributeNames = [attribute for attribute in dir(entity) if attribute in attributes]
        attributeNames.sort(key=str.casefold)
        attributeValues = [getattr(entity, attribute) for attribute in attributeNames]
    else:
        attributeNames = [attribute for attribute in getattr(entity, dictionaryName).keys() if attribute in attributes]
        attributeNames.sort(key=str.casefold)
        attributeValues = [getattr(entity, dictionaryName).get(attribute) for attribute in attributeNames]
    
    attributeNames= [prefix+attribute+suffix for attribute in attributeNames]

    return attributeNames, attributeValues