# I. 690.
# Rajtik Sándor Barnabás 10. o.
# Budapest, Budapesti Fazekas M. Gyak. Ált. Isk. és Gimn.

import csv

def cleanup(description):
    newdesc = ""
    for char in description.lower():
        if char in "abcdefghijklmnopqrstuvwxyz ":
            newdesc += char
    filter_out = "a an the or to from of in on and for by at with".split()
    words = [w for w in newdesc.split() if w not in filter_out]
    return set(words)


WIN_COMMANDS = {}
with open('cmd_commands.csv', newline='', encoding='utf-8') as csvfile:
    linereader = csv.reader(csvfile, delimiter=',', quotechar='\"')
    for row in linereader:
        if row[0] != "":
            WIN_COMMANDS[row[1].upper()] = [row[2], cleanup(row[2])]

LIN_COMMANDS = {}
with open('linux_commands.csv', newline='', encoding='utf-8') as csvfile:
    linereader = csv.reader(csvfile, delimiter=',', quotechar='\"')
    for row in linereader:
        if row[0] != "":
            LIN_COMMANDS[row[1].upper()] = [row[2], cleanup(row[2])]

MAC_COMMANDS = {}
with open('macos_commands.csv', newline='', encoding='utf-8') as csvfile:
    linereader = csv.reader(csvfile, delimiter=',', quotechar='\"')
    for row in linereader:
        if row[0] != "":
            MAC_COMMANDS[row[1].upper()] = [row[2], cleanup(row[2])]

def score3(desc1, desc2):
    words1 = list(desc1)
    words2 = list(desc2)
    points = 0
    for w1 in words1:
        for w2 in words2:
            if w1[:5]==w2[:5]:
                points += 2
    return points

print("Válassza ki a tanulási módot!")
print("1 - keresés leírás alapján")
print("2 - utasítások összehasonlítása operációs rendszerek között")
mode = int(input())
if mode == 1:
    search = input("\nKeresőkifejezés: ").lower().split()
    search = set(search)

    all_scores = []
    for k,v in WIN_COMMANDS.items(): all_scores.append(["WIN", k, v[0], score3(v[1],search)])
    for k,v in LIN_COMMANDS.items(): all_scores.append(["LIN", k, v[0], score3(v[1],search)])
    for k,v in MAC_COMMANDS.items(): all_scores.append(["MAC", k, v[0], score3(v[1],search)])
    all_scores.sort(key=lambda e:e[3], reverse=True)
    print("\nA releváns parancsok:\n")
    for sc in all_scores:
        if sc[3] == 0:
            break
        print(sc[1], end=" ")
        if sc[0]=="WIN":print("(Windows) -", sc[3], end=" ")
        if sc[0]=="LIN":print("(Linux) -", sc[3], end=" ")
        if sc[0]=="MAC":print("(MacOS) -", sc[3], end=" ")

        print(sc[2])

elif mode == 2:
    opsys = input("\nAz operációs rendszer (\"windows\" / \"linux\" / \"macos\"): ").lower()
    try:
        opsys = {"windows":"WIN", "linux":"LIN", "macos":"MAC"}[opsys]
        command = input("A parancs neve: ").upper()
    except:
        print("Hiba: Csak \"windows\", \"linux\" és \"macos\" közül lehet választani.")
        opsys = ""

    try:
        desc = eval(opsys+"_COMMANDS")[command][1]
        similar = []
        for k,v in WIN_COMMANDS.items():
            if opsys=="WIN": break
            sc12 = 20 if k==command else (10 if (k[:5] in command) or (command[:5] in k) else 0)
            sc3 = score3(desc, v[1])
            similar.append(["WIN", k, v[0], sc12+sc3])
        for k,v in LIN_COMMANDS.items():
            if opsys=="LIN": break
            sc12 = 20 if k==command else (10 if (k[:5] in command) or (command[:5] in k) else 0)
            sc3 = score3(desc, v[1])
            similar.append(["LIN", k, v[0], sc12+sc3])
        for k,v in MAC_COMMANDS.items():
            if opsys=="MAC": break
            sc12 = 20 if k==command else (10 if (k[:5] in command) or (command[:5] in k) else 0)
            sc3 = score3(desc, v[1])
            similar.append(["MAC", k, v[0], sc12+sc3])
        similar.sort(key=lambda e:e[3], reverse=True)
        print("\nA releváns parancsok:\n")
        for sim in similar:
            if sim[3]==0:
                break
            print(sim[1], end=" ")
            if sim[0]=="WIN":print("(Windows) -", sim[3], end=" ")
            if sim[0]=="LIN":print("(Linux) -", sim[3], end=" ")
            if sim[0]=="MAC":print("(MacOS) -", sim[3], end=" ")

            print(sim[2])
    except KeyError:
        print("Hiba: Ez a parancs nem létezik.")
    except NameError:
        pass
else:
    print("Hiba: Csak \"1\" és \"2\" választható.")