from extras.allMatches import *  # importa a função allMatches criada na aula05


def main():
    equipas = getTeams()                                                       # pede as equipas ao utilizador
    partidas = allMatches(equipas)                                             # cria a lista de partidas
    resultados = getResults(partidas)                                          # pede os resultados ao utilizador
    tabela = getTable(equipas, resultados)                                     # cria a tabela de classificação
    printTable(tabela)                                                         # imprime a tabela de classificação


def getTeams():
    teams = []                                                                 # cria uma lista vazia para as equipas

    while True:                                                                # Ciclo para obter as equipas
        team = input("Nome da equipa: ")
        if team == "" and len(teams) < 2:
            continue
        elif team == "":
            break
        teams.append(team)

    return teams


def getResults(matches):
    results = dict()                                                           # cria um dicionário vazio para os resultados
    for match in matches:
        team1, team2 = match                                                   # desempacota a partida
        print("Resultado do jogo entre", team1, "e", team2)
        goals1 = int(input("Golos da equipa 1: "))
        goals2 = int(input("Golos da equipa 2: "))
        results[match] = (goals1, goals2)                                      # adiciona o resultado ao dicionário
    return results


def getTable(teams, results):
    table = dict()                                                             # cria um dicionário vazio para a tabela
    for team in teams:
        table[team] = [0, 0, 0, 0, 0, 0]                                       # inicializa a tabela com zeros
    for match in results:
        team1, team2 = match                                                   # desempacota a partida
        goals1, goals2 = results[match]                                        # desempacota os resultados
        if goals1 > goals2:                                                    # se a equipa 1 ganhou
            # atualiza os resultados da equipa 1
            table[team1][0] += 1
            table[team1][3] += goals1
            table[team1][4] += goals2
            table[team1][5] += 3

            # atualiza os resultados da equipa 2
            table[team2][2] += 1
            table[team2][3] += goals2
            table[team2][4] += goals1
        elif goals2 > goals1:                                                  # se a equipa 2 ganhou
            # atualiza os resultados da equipa 2
            table[team2][0] += 1
            table[team2][3] += goals2
            table[team2][4] += goals1
            table[team2][5] += 3

            # atualiza os resultados da equipa 1
            table[team1][2] += 1
            table[team1][3] += goals1
            table[team1][4] += goals2
        else:                                                                  # se houve empate
            # atualiza os resultados da equipa 1
            table[team1][1] += 1
            table[team1][3] += goals1
            table[team1][4] += goals2
            table[team1][5] += 1

            # atualiza os resultados da equipa 2
            table[team2][1] += 1
            table[team2][3] += goals2
            table[team2][4] += goals1
            table[team2][5] += 1

    sortedTable = sortTable(table)                                             # ordena a tabela por pontos e diferença de golos
    return sortedTable


def printTable(table):

    print(f"\n{'Equipa':<15}\tV\tE\tD\tGM\tGS\tPts")

    for results in table:
        print(f"{results:<15}", end="\t")

        for result in table[results]:
            print(result, end="\t")

        print('')

    print(f"\nA equipa campeã é {max(table, key=lambda x: (table[x][3]- table[x][4]))}.")


def sortTable(table):
    pointsOrder = []                                                           # cria uma lista vazia para a ordenação por pontos
    for team in table:
        pointsOrder.append(table[team][5])                                     # adiciona os pontos à lista
    pointsOrder.sort()                                                         # ordena a lista de pontos (ordem crescente)

    resultsByPoints = {}                                                       # cria um dicionário vazio para os resultados ordenados por pontos
    for points in pointsOrder:                                                 # percorre a lista de pontos
        for team in table:                                                     # percorre as equipas
            if table[team][5] == points:                                       # se a equipa tiver os pontos
                resultsByPoints[team] = table[team]                            # adiciona a equipa ao dicionário

    goalDiffByTeam = {}                                                        # cria um dicionário vazio para a diferença de golos por equipa
    for team in table:                                                         # percorre as equipas
        goalDiffByTeam[team] = table[team][3] - table[team][4]                 # calcula a diferença de golos da equipa e adiciona ao dicionário

    teamOrder = []                                                             # cria uma lista vazia para a ordenação dos nomes das equipas por diferença de golos
    for team1 in resultsByPoints:
        for team2 in resultsByPoints:
            if resultsByPoints[team1][5] == resultsByPoints[team2][5]:         # se as equipas tiverem os mesmos pontos

                if goalDiffByTeam[team1] >= goalDiffByTeam[team2]:             # se a diferença de golos da equipa 1 for maior ou igual à da equipa 2
                    teamOrder.append(team1)                                    # adiciona a equipa 1 à lista

                else:                                                          # se a diferença de golos da equipa 2 for maior
                    teamOrder.append(team2)                                    # adiciona a equipa 2 à lista

    teamOrder = teamOrder[::-1]                                                # inverte a lista de equipas (ordem decrescente em diferença de golos)
    resultsByGoalDiff = {}                                                     # cria um dicionário vazio para os resultados ordenados por diferença de golos
    for team in teamOrder:
        resultsByGoalDiff[team] = resultsByPoints[team]                        # adiciona os resultados da equipa ao dicionário ordenado por diferença de golos

    return resultsByGoalDiff


if __name__ == '__main__':
    main()