# msd mappings from slo to ang
class Msdmap():
    def __init__(self):
        # http://nl.ijs.si/ME/V4/msd/html/msd.categories-sl.html
        self.pos_slo_ang = [
            ("samostalnik", "S", "Noun", "N"),
            ("glagol", "G", "Verb", "V"),
            ("pridevnik", "P", "Adjective", "A"),
            ("prislov", "R", "Adverb", "R"),
            ("zaimek", "Z", "Pronoun", "P"),
            ("števnik", "K", "Numeral", "M"),
            ("predlog", "D", "Adposition", "S"),
            ("veznik", "V", "Conjunction", "C"),
            ("členek", "L", "Particle", "Q"),
            ("medmet", "M", "Interjection", "I"),
            ("okrajšava", "O", "Abbreviation", "Y"),
            ("neuvrščeno", "N", "Residual", "X"),
        ]

        # http://nl.ijs.si/ME/V4/msd/html/msd.values-sl.html
        # col:
        # (Value (sl), Code (sl), Attribute (sl), Category (sl),
        #   Value (en), Code (en), Attribute (en), Category (en))
        self.pos_val = [
            ("arabski", "a", "zapis", "števnik",
                "digit", "d", "Form", "Numeral"),
            ("besedni", "b", "zapis", "števnik",
                "letter", "l", "Form", "Numeral"),
            ("celostni", "c", "vrsta", "zaimek",
                "general", "g", "Type", "Pronoun"),
            ("da", "d", "določnost", "pridevnik",
                "yes", "y", "Definiteness", "Adjective"),
            ("da", "d", "določnost", "števnik",
                "yes", "y", "Definiteness", "Numeral"),
            ("da", "d", "živost", "samostalnik",
                "yes", "y", "Animate", "Noun"),
            ("dajalnik", "d", "sklon", "predlog",
                "dative", "d", "Case", "Adposition"),
            ("dajalnik", "d", "sklon", "pridevnik",
                "dative", "d", "Case", "Adjective"),
            ("dajalnik", "d", "sklon", "samostalnik",
                "dative", "d", "Case", "Noun"),
            ("dajalnik", "d", "sklon", "zaimek",
                "dative", "d", "Case", "Pronoun"),
            ("dajalnik", "d", "sklon", "števnik",
                "dative", "d", "Case", "Numeral"),
            ("deležje", "d", "vrsta", "prislov",
                "participle", "r", "Type", "Adverb"),
            ("deležnik", "d", "oblika", "glagol",
                "participle", "p", "VForm", "Verb"),
            ("deležniški", "d", "vrsta", "pridevnik",
                "participle", "p", "Type", "Adjective"),
            ("dovršni", "d", "vid", "glagol",
                "perfective", "e", "Aspect", "Verb"),
            ("druga", "d", "oseba", "glagol",
                "second", "2", "Person", "Verb"),
            ("druga", "d", "oseba", "zaimek",
                "second", "2", "Person", "Pronoun"),
            ("drugi", "d", "vrsta", "števnik",
                "special", "s", "Type", "Numeral"),
            ("dvojina", "d", "število", "glagol",
                "dual", "d", "Number", "Verb"),
            ("dvojina", "d", "število", "pridevnik",
                "dual", "d", "Number", "Adjective"),
            ("dvojina", "d", "število", "samostalnik",
                "dual", "d", "Number", "Noun"),
            ("dvojina", "d", "število", "zaimek",
                "dual", "d", "Number", "Pronoun"),
            ("dvojina", "d", "število", "števnik",
                "dual", "d", "Number", "Numeral"),
            ("dvojina", "d", "število_svojine", "zaimek",
                "dual", "d", "Owner_Number", "Pronoun"),
            ("dvovidski", "v", "vid", "glagol",
                "biaspectual", "b", "Aspect", "Verb"),
            ("ednina", "e", "število", "glagol",
                "singular", "s", "Number", "Verb"),
            ("ednina", "e", "število", "pridevnik",
                "singular", "s", "Number", "Adjective"),
            ("ednina", "e", "število", "samostalnik",
                "singular", "s", "Number", "Noun"),
            ("ednina", "e", "število", "zaimek",
                "singular", "s", "Number", "Pronoun"),
            ("ednina", "e", "število", "števnik",
                "singular", "s", "Number", "Numeral"),
            ("ednina", "e", "število_svojine", "zaimek",
                "singular", "s", "Owner_Number", "Pronoun"),
            ("glavni", "g", "vrsta", "glagol",
                "main", "m", "Type", "Verb"),
            ("glavni", "g", "vrsta", "števnik",
                "cardinal", "c", "Type", "Numeral"),
            ("imenovalnik", "i", "sklon", "predlog",
                "nominative", "n", "Case", "Adposition"),
            ("imenovalnik", "i", "sklon", "pridevnik",
                "nominative", "n", "Case", "Adjective"),
            ("imenovalnik", "i", "sklon", "samostalnik",
                "nominative", "n", "Case", "Noun"),
            ("imenovalnik", "i", "sklon", "zaimek",
                "nominative", "n", "Case", "Pronoun"),
            ("imenovalnik", "i", "sklon", "števnik",
                "nominative", "n", "Case", "Numeral"),
            ("kazalni", "k", "vrsta", "zaimek",
                "demonstrative", "d", "Type", "Pronoun"),
            ("klitična", "k", "naslonskost", "zaimek",
                "yes", "y", "Clitic", "Pronoun"),
            ("lastno_ime", "l", "vrsta", "samostalnik",
                "proper", "p", "Type", "Noun"),
            ("mestnik", "m", "sklon", "predlog",
                "locative", "l", "Case", "Adposition"),
            ("mestnik", "m", "sklon", "pridevnik",
                "locative", "l", "Case", "Adjective"),
            ("mestnik", "m", "sklon", "samostalnik",
                "locative", "l", "Case", "Noun"),
            ("mestnik", "m", "sklon", "zaimek",
                "locative", "l", "Case", "Pronoun"),
            ("mestnik", "m", "sklon", "števnik",
                "locative", "l", "Case", "Numeral"),
            ("množina", "m", "število", "glagol",
                "plural", "p", "Number", "Verb"),
            ("množina", "m", "število", "pridevnik",
                "plural", "p", "Number", "Adjective"),
            ("množina", "m", "število", "samostalnik",
                "plural", "p", "Number", "Noun"),
            ("množina", "m", "število", "zaimek",
                "plural", "p", "Number", "Pronoun"),
            ("množina", "m", "število", "števnik",
                "plural", "p", "Number", "Numeral"),
            ("množina", "m", "število_svojine", "zaimek",
                "plural", "p", "Owner_Number", "Pronoun"),
            ("moški", "m", "spol", "glagol",
                "masculine", "m", "Gender", "Verb"),
            ("moški", "m", "spol", "pridevnik",
                "masculine", "m", "Gender", "Adjective"),
            ("moški", "m", "spol", "samostalnik",
                "masculine", "m", "Gender", "Noun"),
            ("moški", "m", "spol", "zaimek",
                "masculine", "m", "Gender", "Pronoun"),
            ("moški", "m", "spol", "števnik",
                "masculine", "m", "Gender", "Numeral"),
            ("moški", "m", "spol_svojine", "zaimek",
                "masculine", "m", "Owner_Gender", "Pronoun"),
            ("namenilnik", "m", "oblika", "glagol",
                "supine", "u", "VForm", "Verb"),
            ("navezna", "z", "naslonskost", "zaimek",
                "bound", "b", "Clitic", "Pronoun"),
            ("ne", "n", "določnost", "pridevnik",
                "no", "n", "Definiteness", "Adjective"),
            ("ne", "n", "določnost", "števnik",
                "no", "n", "Definiteness", "Numeral"),
            ("ne", "n", "živost", "samostalnik",
                "no", "n", "Animate", "Noun"),
            ("nedoločeno", "n", "stopnja", "pridevnik",
                "positive", "p", "Degree", "Adjective"),
            ("nedoločeno", "n", "stopnja", "prislov",
                "positive", "p", "Degree", "Adverb"),
            ("nedoločni", "n", "vrsta", "zaimek",
                "indefinite", "i", "Type", "Pronoun"),
            ("nedoločnik", "n", "oblika", "glagol",
                "infinitive", "n", "VForm", "Verb"),
            ("nedovršni", "n", "vid", "glagol",
                "progressive", "p", "Aspect", "Verb"),
            ("nezanikani", "n", "nikalnost", "glagol",
                "no", "n", "Negative", "Verb"),
            ("nikalni", "l", "vrsta", "zaimek",
                "negative", "z", "Type", "Pronoun"),
            ("občno_ime", "o", "vrsta", "samostalnik",
                "common", "c", "Type", "Noun"),
            ("orodnik", "o", "sklon", "predlog",
                "instrumental", "i", "Case", "Adposition"),
            ("orodnik", "o", "sklon", "pridevnik",
                "instrumental", "i", "Case", "Adjective"),
            ("orodnik", "o", "sklon", "samostalnik",
                "instrumental", "i", "Case", "Noun"),
            ("orodnik", "o", "sklon", "zaimek",
                "instrumental", "i", "Case", "Pronoun"),
            ("orodnik", "o", "sklon", "števnik",
                "instrumental", "i", "Case", "Numeral"),
            ("osebni", "o", "vrsta", "zaimek",
                "personal", "p", "Type", "Pronoun"),
            ("oziralni", "z", "vrsta", "zaimek",
                "relative", "r", "Type", "Pronoun"),
            ("podredni", "d", "vrsta", "veznik",
                "subordinating", "s", "Type", "Conjunction"),
            ("pogojnik", "g", "oblika", "glagol",
                "conditional", "c", "VForm", "Verb"),
            ("pomožni", "p", "vrsta", "glagol",
                "auxiliary", "a", "Type", "Verb"),
            ("povratni", "p", "vrsta", "zaimek",
                "reflexive", "x", "Type", "Pronoun"),
            ("presežnik", "s", "stopnja", "pridevnik",
                "superlative", "s", "Degree", "Adjective"),
            ("presežnik", "s", "stopnja", "prislov",
                "superlative", "s", "Degree", "Adverb"),
            ("prihodnjik", "p", "oblika", "glagol",
                "future", "f", "VForm", "Verb"),
            ("primernik", "p", "stopnja", "pridevnik",
                "comparative", "c", "Degree", "Adjective"),
            ("primernik", "r", "stopnja", "prislov",
                "comparative", "c", "Degree", "Adverb"),
            ("priredni", "p", "vrsta", "veznik",
                "coordinating", "c", "Type", "Conjunction"),
            ("program", "p", "vrsta", "neuvrščeno",
                "program", "p", "Type", "Residual"),
            ("prva", "p", "oseba", "glagol",
                "first", "1", "Person", "Verb"),
            ("prva", "p", "oseba", "zaimek",
                "first", "1", "Person", "Pronoun"),
            ("rimski", "r", "zapis", "števnik",
                "roman", "r", "Form", "Numeral"),
            ("rodilnik", "r", "sklon", "predlog",
                "genitive", "g", "Case", "Adposition"),
            ("rodilnik", "r", "sklon", "pridevnik",
                "genitive", "g", "Case", "Adjective"),
            ("rodilnik", "r", "sklon", "samostalnik",
                "genitive", "g", "Case", "Noun"),
            ("rodilnik", "r", "sklon", "zaimek",
                "genitive", "g", "Case", "Pronoun"),
            ("rodilnik", "r", "sklon", "števnik",
                "genitive", "g", "Case", "Numeral"),
            ("sedanjik", "s", "oblika", "glagol",
                "present", "r", "VForm", "Verb"),
            ("splošni", "p", "vrsta", "pridevnik",
                "general", "g", "Type", "Adjective"),
            ("splošni", "s", "vrsta", "prislov",
                "general", "g", "Type", "Adverb"),
            ("srednji", "s", "spol", "glagol",
                "neuter", "n", "Gender", "Verb"),
            ("srednji", "s", "spol", "pridevnik",
                "neuter", "n", "Gender", "Adjective"),
            ("srednji", "s", "spol", "samostalnik",
                "neuter", "n", "Gender", "Noun"),
            ("srednji", "s", "spol", "zaimek",
                "neuter", "n", "Gender", "Pronoun"),
            ("srednji", "s", "spol", "števnik",
                "neuter", "n", "Gender", "Numeral"),
            ("srednji", "s", "spol_svojine", "zaimek",
                "neuter", "n", "Owner_Gender", "Pronoun"),
            ("svojilni", "s", "vrsta", "pridevnik",
                "possessive", "s", "Type", "Adjective"),
            ("svojilni", "s", "vrsta", "zaimek",
                "possessive", "s", "Type", "Pronoun"),
            ("tipkarska", "t", "vrsta", "neuvrščeno",
                "typo", "t", "Type", "Residual"),
            ("tožilnik", "t", "sklon", "predlog",
                "accusative", "a", "Case", "Adposition"),
            ("tožilnik", "t", "sklon", "pridevnik",
                "accusative", "a", "Case", "Adjective"),
            ("tožilnik", "t", "sklon", "samostalnik",
                "accusative", "a", "Case", "Noun"),
            ("tožilnik", "t", "sklon", "zaimek",
                "accusative", "a", "Case", "Pronoun"),
            ("tožilnik", "t", "sklon", "števnik",
                "accusative", "a", "Case", "Numeral"),
            ("tretja", "t", "oseba", "glagol",
                "third", "3", "Person", "Verb"),
            ("tretja", "t", "oseba", "zaimek",
                "third", "3", "Person", "Pronoun"),
            ("tujejezično", "j", "vrsta", "neuvrščeno",
                "foreign", "f", "Type", "Residual"),
            ("velelnik", "v", "oblika", "glagol",
                "imperative", "m", "VForm", "Verb"),
            ("vprašalni", "v", "vrsta", "zaimek",
                "interrogative", "q", "Type", "Pronoun"),
            ("vrstilni", "v", "vrsta", "števnik",
                "ordinal", "o", "Type", "Numeral"),
            ("zaimkovni", "z", "vrsta", "števnik",
                "pronominal", "p", "Type", "Numeral"),
            ("zanikani", "d", "nikalnost", "glagol",
                "yes", "y", "Negative", "Verb"),
            ("ženski", "z", "spol", "glagol",
                "feminine", "f", "Gender", "Verb"),
            ("ženski", "z", "spol", "pridevnik",
                "feminine", "f", "Gender", "Adjective"),
            ("ženski", "z", "spol", "samostalnik",
                "feminine", "f", "Gender", "Noun"),
            ("ženski", "z", "spol", "zaimek",
                "feminine", "f", "Gender", "Pronoun"),
            ("ženski", "z", "spol", "števnik",
                "feminine", "f", "Gender", "Numeral"),
            ("ženski", "z", "spol_svojine", "zaimek",
                "feminine", "f", "Owner_Gender", "Pronoun"),
        ]

    def pos_slo_ang_map(self, col, query):
        for pos in self.pos_slo_ang:
            if pos[col] == query:
                return pos
        raise ValueError("Wrong part of speech.")

    def pos_val_map(self, en_category, col, query):
        for pos in self.pos_val:
            if pos[7] == en_category and pos[col] == query:
                return pos
        print("---")
        print(en_category)
        print(col)
        print(query)
        raise ValueError("Wrong part of speech value.")

    def msd_from_slo(self, msd):
        pos = self.pos_slo_ang_map(1, msd[0])
        category = pos[2]
        attr = [self.pos_val_map(category, 1, m)
                for m in msd[1:] if m != "-"]
        return pos, attr


if __name__ == "__main__":
    test_msds = [
        "Soser",
        "Ppnzmm",
        "Gp-d-mz"
    ]

    for msd in test_msds:
        print(Msdmap().msd_from_slo(msd))
