"""
Tokenizer Exceptions.
Source: https://forkortelse.dk/ and various others.
"""
from ...symbols import ORTH, LEMMA, NORM, TAG, PUNCT


_exc = {}

# Abbreviations for weekdays "søn." (for "søndag") as well as "Tor." and "Tors."
# (for "torsdag") are left out because they are ambiguous. The same is the case
# for abbreviations "jul." and "Jul." ("juli").
for exc_data in [
    {ORTH: "Kbh.", LEMMA: "København", NORM: "København"},
    {ORTH: "jan.", LEMMA: "januar"},
    {ORTH: "febr.", LEMMA: "februar"},
    {ORTH: "feb.", LEMMA: "februar"},
    {ORTH: "mar.", LEMMA: "marts"},
    {ORTH: "apr.", LEMMA: "april"},
    {ORTH: "jun.", LEMMA: "juni"},
    {ORTH: "aug.", LEMMA: "august"},
    {ORTH: "sept.", LEMMA: "september"},
    {ORTH: "sep.", LEMMA: "september"},
    {ORTH: "okt.", LEMMA: "oktober"},
    {ORTH: "nov.", LEMMA: "november"},
    {ORTH: "dec.", LEMMA: "december"},
    {ORTH: "man.", LEMMA: "mandag"},
    {ORTH: "tirs.", LEMMA: "tirsdag"},
    {ORTH: "ons.", LEMMA: "onsdag"},
    {ORTH: "tor.", LEMMA: "torsdag"},
    {ORTH: "tors.", LEMMA: "torsdag"},
    {ORTH: "fre.", LEMMA: "fredag"},
    {ORTH: "lør.", LEMMA: "lørdag"},
    {ORTH: "Jan.", LEMMA: "januar"},
    {ORTH: "Febr.", LEMMA: "februar"},
    {ORTH: "Feb.", LEMMA: "februar"},
    {ORTH: "Mar.", LEMMA: "marts"},
    {ORTH: "Apr.", LEMMA: "april"},
    {ORTH: "Jun.", LEMMA: "juni"},
    {ORTH: "Aug.", LEMMA: "august"},
    {ORTH: "Sept.", LEMMA: "september"},
    {ORTH: "Sep.", LEMMA: "september"},
    {ORTH: "Okt.", LEMMA: "oktober"},
    {ORTH: "Nov.", LEMMA: "november"},
    {ORTH: "Dec.", LEMMA: "december"},
    {ORTH: "Man.", LEMMA: "mandag"},
    {ORTH: "Tirs.", LEMMA: "tirsdag"},
    {ORTH: "Ons.", LEMMA: "onsdag"},
    {ORTH: "Fre.", LEMMA: "fredag"},
    {ORTH: "Lør.", LEMMA: "lørdag"},
    {ORTH: "og/eller", LEMMA: "og/eller", NORM: "og/eller", TAG: "CC"},
]:
    _exc[exc_data[ORTH]] = [exc_data]


# Specified case only
for orth in [
    "diam.",
    "ib.",
    "mia.",
    "mik.",
    "pers.",
    "A.D.",
    "A/B",
    "a/s",
    "A/S",
    "B.C.",
    "BK.",
    "B.T.",
    "Dr.",
    "Boul.",
    "Chr.",
    "Dronn.",
    "H.K.H.",
    "H.M.",
    "Hf.",
    "i/s",
    "I/S",
    "Inc.",
    "Kprs.",
    "L.A.",
    "Ll.",
    "m/k",
    "m/s",
    "m/sek.",
    "M/S",
    "Mag.",
    "Mr.",
    "Ndr.",
    "Ph.d.",
    "Prs.",
    "Rcp.",
    "Sdr.",
    "Skt.",
    "Spl.",
    "TCP/IP",
    "Vg.",
]:
    _exc[orth] = [{ORTH: orth}]


for orth in [
    "aarh.",
    "ac.",
    "adj.",
    "adr.",
    "adsk.",
    "adv.",
    "afb.",
    "afd.",
    "afg.",
    "afk.",
    "afs.",
    "aht.",
    "alg.",
    "alk.",
    "alm.",
    "amer.",
    "ang.",
    "ank.",
    "anl.",
    "anv.",
    "arb.",
    "arr.",
    "att.",
    "bd.",
    "bdt.",
    "beg.",
    "begr.",
    "beh.",
    "bet.",
    "bev.",
    "bhk.",
    "bib.",
    "bibl.",
    "bidr.",
    "bildl.",
    "bill.",
    "biol.",
    "bk.",
    "bl.",
    "bl.a.",
    "borgm.",
    "br.",
    "brolægn.",
    "bto.",
    "bygn.",
    "c/o",
    "ca.",
    "cm.",
    "cand.",
    "d.d.",
    "d.m.",
    "d.s.",
    "d.s.s.",
    "d.y.",
    "d.å.",
    "d.æ.",
    "dagl.",
    "dat.",
    "dav.",
    "def.",
    "dek.",
    "dep.",
    "desl.",
    "dir.",
    "disp.",
    "distr.",
    "div.",
    "dkr.",
    "dl.",
    "do.",
    "dobb.",
    "dr.",
    "dr.h.c",
    "dr.phil.",
    "ds.",
    "dvs.",
    "d.v.s.",
    "e.b.",
    "e.l.",
    "e.o.",
    "e.v.t.",
    "eftf.",
    "eftm.",
    "egl.",
    "eks.",
    "eksam.",
    "ekskl.",
    "eksp.",
    "ekspl.",
    "el.lign.",
    "emer.",
    "endv.",
    "eng.",
    "enk.",
    "etc.",
    "etym.",
    "eur.",
    "evt.",
    "exam.",
    "f.eks.",
    "f.m.",
    "f.n.",
    "f.o.",
    "f.o.m.",
    "f.s.v.",
    "f.t.",
    "f.v.t.",
    "f.å.",
    "fa.",
    "fakt.",
    "fam.",
    "ff.",
    "fg.",
    "fhv.",
    "fig.",
    "filol.",
    "filos.",
    "fl.",
    "flg.",
    "fm.",
    "fmd.",
    "fol.",
    "forb.",
    "foreg.",
    "foren.",
    "forf.",
    "fork.",
    "forr.",
    "fors.",
    "forsk.",
    "forts.",
    "fr.",
    "fr.u.",
    "frk.",
    "fsva.",
    "fuldm.",
    "fung.",
    "fx.",
    "fys.",
    "fær.",
    "g.d.",
    "g.m.",
    "gd.",
    "gdr.",
    "genuds.",
    "gl.",
    "gn.",
    "gns.",
    "gr.",
    "grdl.",
    "gross.",
    "h.a.",
    "h.c.",
    "hdl.",
    "henv.",
    "hhv.",
    "hj.hj.",
    "hj.spl.",
    "hort.",
    "hosp.",
    "hpl.",
    "hr.",
    "hrs.",
    "hum.",
    "hvp.",
    "i.e.",
    "id.",
    "if.",
    "iflg.",
    "ifm.",
    "ift.",
    "iht.",
    "ill.",
    "indb.",
    "indreg.",
    "inf.",
    "ing.",
    "inh.",
    "inj.",
    "inkl.",
    "insp.",
    "instr.",
    "isl.",
    "istf.",
    "it.",
    "ital.",
    "iv.",
    "jap.",
    "jf.",
    "jfr.",
    "jnr.",
    "j.nr.",
    "jr.",
    "jur.",
    "jvf.",
    "kap.",
    "kbh.",
    "kem.",
    "kg.",
    "kgs.",
    "kgl.",
    "kl.",
    "kld.",
    "km.",
    "km/t",
    "km/t.",
    "knsp.",
    "komm.",
    "kons.",
    "korr.",
    "kp.",
    "kr.",
    "kst.",
    "kt.",
    "ktr.",
    "kv.",
    "kvm.",
    "kvt.",
    "l.c.",
    "lab.",
    "lat.",
    "lb.m.",
    "lb.nr.",
    "lejl.",
    "lgd.",
    "lic.",
    "lign.",
    "lin.",
    "ling.merc.",
    "litt.",
    "loc.cit.",
    "lok.",
    "lrs.",
    "ltr.",
    "m.a.o.",
    "m.fl.",
    "m.m.",
    "m.v.",
    "m.v.h.",
    "maks.",
    "md.",
    "mdr.",
    "mdtl.",
    "mezz.",
    "mfl.",
    "m.h.p.",
    "m.h.t.",
    "mht.",
    "mill.",
    "mio.",
    "modt.",
    "mrk.",
    "mul.",
    "mv.",
    "n.br.",
    "n.f.",
    "nb.",
    "nedenst.",
    "nl.",
    "nr.",
    "nto.",
    "nuv.",
    "o/m",
    "o/m.",
    "o.a.",
    "o.fl.",
    "o.h.",
    "o.l.",
    "o.lign.",
    "o.m.a.",
    "o.s.fr.",
    "obl.",
    "obs.",
    "odont.",
    "oecon.",
    "off.",
    "ofl.",
    "omg.",
    "omkr.",
    "omr.",
    "omtr.",
    "opg.",
    "opl.",
    "opr.",
    "org.",
    "orig.",
    "osv.",
    "ovenst.",
    "overs.",
    "ovf.",
    "p.a.",
    "p.b.a",
    "p.b.v",
    "p.c.",
    "p.m.",
    "p.m.v.",
    "p.n.",
    "p.p.",
    "p.p.s.",
    "p.s.",
    "p.t.",
    "p.v.a.",
    "p.v.c.",
    "pag.",
    "pass.",
    "pcs.",
    "pct.",
    "pd.",
    "pens.",
    "pft.",
    "pg.",
    "pga.",
    "pgl.",
    "pinx.",
    "pk.",
    "pkt.",
    "polit.",
    "polyt.",
    "pos.",
    "pp.",
    "ppm.",
    "pr.",
    "prc.",
    "priv.",
    "prod.",
    "prof.",
    "pron.",
    "præd.",
    "præf.",
    "præt.",
    "psych.",
    "pt.",
    "pæd.",
    "q.e.d.",
    "rad.",
    "red.",
    "ref.",
    "reg.",
    "regn.",
    "rel.",
    "rep.",
    "repr.",
    "resp.",
    "rest.",
    "rm.",
    "rtg.",
    "russ.",
    "s.br.",
    "s.d.",
    "s.f.",
    "s.m.b.a.",
    "s.u.",
    "s.å.",
    "sa.",
    "sb.",
    "sc.",
    "scient.",
    "scil.",
    "sek.",
    "sekr.",
    "self.",
    "sem.",
    "shj.",
    "sign.",
    "sing.",
    "sj.",
    "skr.",
    "slutn.",
    "sml.",
    "smp.",
    "snr.",
    "soc.",
    "soc.dem.",
    "sp.",
    "spec.",
    "spm.",
    "spr.",
    "spsk.",
    "statsaut.",
    "st.",
    "stk.",
    "str.",
    "stud.",
    "subj.",
    "subst.",
    "suff.",
    "sup.",
    "suppl.",
    "sv.",
    "såk.",
    "sædv.",
    "t/r",
    "t.h.",
    "t.o.",
    "t.o.m.",
    "t.v.",
    "tbl.",
    "tcp/ip",
    "td.",
    "tdl.",
    "tdr.",
    "techn.",
    "tekn.",
    "temp.",
    "th.",
    "theol.",
    "tidl.",
    "tilf.",
    "tilh.",
    "till.",
    "tilsv.",
    "tjg.",
    "tkr.",
    "tlf.",
    "tlgr.",
    "tr.",
    "trp.",
    "tsk.",
    "tv.",
    "ty.",
    "u/b",
    "udb.",
    "udbet.",
    "ugtl.",
    "undt.",
    "v.f.",
    "vb.",
    "vedk.",
    "vedl.",
    "vedr.",
    "vejl.",
    "vh.",
    "vha.",
    "vind.",
    "vs.",
    "vsa.",
    "vær.",
    "zool.",
    "ø.lgd.",
    "øvr.",
    "årg.",
    "årh.",
]:
    _exc[orth] = [{ORTH: orth}]
    capitalized = orth.capitalize()
    _exc[capitalized] = [{ORTH: capitalized}]

for exc_data in [
    {ORTH: "s'gu", LEMMA: "s'gu", NORM: "s'gu"},
    {ORTH: "S'gu", LEMMA: "s'gu", NORM: "s'gu"},
    {ORTH: "sgu'", LEMMA: "s'gu", NORM: "s'gu"},
    {ORTH: "Sgu'", LEMMA: "s'gu", NORM: "s'gu"},
    {ORTH: "sku'", LEMMA: "skal", NORM: "skulle"},
    {ORTH: "ku'", LEMMA: "kan", NORM: "kunne"},
    {ORTH: "Ku'", LEMMA: "kan", NORM: "kunne"},
    {ORTH: "ka'", LEMMA: "kan", NORM: "kan"},
    {ORTH: "Ka'", LEMMA: "kan", NORM: "kan"},
    {ORTH: "gi'", LEMMA: "give", NORM: "giv"},
    {ORTH: "Gi'", LEMMA: "give", NORM: "giv"},
    {ORTH: "li'", LEMMA: "lide", NORM: "lide"},
    {ORTH: "ha'", LEMMA: "have", NORM: "have"},
    {ORTH: "Ha'", LEMMA: "have", NORM: "have"},
    {ORTH: "ik'", LEMMA: "ikke", NORM: "ikke"},
    {ORTH: "Ik'", LEMMA: "ikke", NORM: "ikke"},
]:
    _exc[exc_data[ORTH]] = [exc_data]


# Dates
for h in range(1, 31 + 1):
    for period in ["."]:
        _exc[f"{h}{period}"] = [{ORTH: f"{h}."}]

_custom_base_exc = {"i.": [{ORTH: "i", LEMMA: "i", NORM: "i"}, {ORTH: ".", TAG: PUNCT}]}
_exc.update(_custom_base_exc)

TOKENIZER_EXCEPTIONS = _exc