import re

# Constantes para indexar os tuplos:
NAME, DATE, OPEN, MAX, MIN, CLOSE, VOLUME = 0, 1, 2, 3, 4, 5, 6


def main():
    lst = loadStockFile("datafiles/nasdaq.csv")
    # Show just first and last tuples:
    print("first:", lst[1])
    print("last:", lst[-1])

    print("a) totVol=", totalVolume(lst))

    print("b) maxVal=", maxValorization(lst))

    stocksDic = stocksByDateByName(lst)
    print("c) CSCO@11:", stocksDic['2020-10-12']['CSCO'])
    print("c) AMZN@22:", stocksDic['2020-10-22']['AMZN'])

    # Parte incompleta
    port = {'NFLX': 100, 'CSCO': 80}
    print("d) portfolio@01:", portfolioValue(stocksDic, port, "2020-10-01"))
    print("d) portfolio@30:", portfolioValue(stocksDic, port, "2020-10-30"))


def loadStockFile(filename):
    lst = []
    with open(filename) as f:
        for line in f:
            parts = line.strip().split('\t')
            name = parts[NAME]
            date = parts[DATE]
            tup = (name, date, float(parts[OPEN]), float(parts[MAX]),
                   float(parts[MIN]), float(parts[CLOSE]), int(parts[VOLUME]))
            lst.append(tup)
    return lst


def totalVolume(lst):
    totVol = {}
    # Complete ...
    for tup in lst:
        if tup[NAME] not in totVol:
            totVol[tup[NAME]] = tup[VOLUME]
        else:
            totVol[tup[NAME]] += tup[VOLUME]

    return totVol


def maxValorization(lst):
    vMax = {}
    # Complete ...
    for data in range(1, 31):
        maxDiario = 0
        maxDiarioComp = "No data"
        for tup in lst:
            pat = r"0[1-9]"
            dia = tup[DATE].split('-')[2]
            if re.match(pat, dia):
                dia = dia[1]
            if data == int(dia):
                maxcomp = tup[OPEN] / tup[CLOSE] * 100
                if maxcomp > maxDiario:
                    maxDiario = maxcomp
                    maxDiarioComp = tup[NAME]

        if maxDiarioComp != "No data":
            vMax[data] = (maxDiarioComp, f"{maxDiario:.1f}%")

    return vMax


def stocksByDateByName(lst):
    dic = {}
    # Complete ...
    for tup in lst:
        if tup[DATE] not in dic:
            dic[tup[DATE]] = {}
        dic[tup[DATE]][tup[NAME]] = tup

    return dic


def portfolioValue(stocks, portfolio, date):
    assert date in stocks
    val = 0.0
    # Complete ...
    for comp in portfolio:
        val += portfolio[comp] * stocks[date][comp][CLOSE]

    return val


if __name__ == "__main__":
    main()