from typing import Dict, List

from ...symbols import NORM, ORTH
from ...util import update_exc
from ..tokenizer_exceptions import BASE_EXCEPTIONS

_exc: Dict[str, List[Dict]] = {}

_other_exc = {
    "t.i.": [{ORTH: "t.", NORM: "tako"}, {ORTH: "i.", NORM: "imenovano"}],
    "t.j.": [{ORTH: "t.", NORM: "to"}, {ORTH: "j.", NORM: "je"}],
    "T.j.": [{ORTH: "T.", NORM: "to"}, {ORTH: "j.", NORM: "je"}],
    "d.o.o.": [
        {ORTH: "d.", NORM: "družba"},
        {ORTH: "o.", NORM: "omejeno"},
        {ORTH: "o.", NORM: "odgovornostjo"},
    ],
    "D.O.O.": [
        {ORTH: "D.", NORM: "družba"},
        {ORTH: "O.", NORM: "omejeno"},
        {ORTH: "O.", NORM: "odgovornostjo"},
    ],
    "d.n.o.": [
        {ORTH: "d.", NORM: "družba"},
        {ORTH: "n.", NORM: "neomejeno"},
        {ORTH: "o.", NORM: "odgovornostjo"},
    ],
    "D.N.O.": [
        {ORTH: "D.", NORM: "družba"},
        {ORTH: "N.", NORM: "neomejeno"},
        {ORTH: "O.", NORM: "odgovornostjo"},
    ],
    "d.d.": [{ORTH: "d.", NORM: "delniška"}, {ORTH: "d.", NORM: "družba"}],
    "D.D.": [{ORTH: "D.", NORM: "delniška"}, {ORTH: "D.", NORM: "družba"}],
    "s.p.": [{ORTH: "s.", NORM: "samostojni"}, {ORTH: "p.", NORM: "podjetnik"}],
    "S.P.": [{ORTH: "S.", NORM: "samostojni"}, {ORTH: "P.", NORM: "podjetnik"}],
    "l.r.": [{ORTH: "l.", NORM: "lastno"}, {ORTH: "r.", NORM: "ročno"}],
    "le-te": [{ORTH: "le"}, {ORTH: "-"}, {ORTH: "te"}],
    "Le-te": [{ORTH: "Le"}, {ORTH: "-"}, {ORTH: "te"}],
    "le-ti": [{ORTH: "le"}, {ORTH: "-"}, {ORTH: "ti"}],
    "Le-ti": [{ORTH: "Le"}, {ORTH: "-"}, {ORTH: "ti"}],
    "le-to": [{ORTH: "le"}, {ORTH: "-"}, {ORTH: "to"}],
    "Le-to": [{ORTH: "Le"}, {ORTH: "-"}, {ORTH: "to"}],
    "le-ta": [{ORTH: "le"}, {ORTH: "-"}, {ORTH: "ta"}],
    "Le-ta": [{ORTH: "Le"}, {ORTH: "-"}, {ORTH: "ta"}],
    "le-tega": [{ORTH: "le"}, {ORTH: "-"}, {ORTH: "tega"}],
    "Le-tega": [{ORTH: "Le"}, {ORTH: "-"}, {ORTH: "tega"}],
}

_exc.update(_other_exc)


for exc_data in [
    {ORTH: "adm.", NORM: "administracija"},
    {ORTH: "aer.", NORM: "aeronavtika"},
    {ORTH: "agr.", NORM: "agronomija"},
    {ORTH: "amer.", NORM: "ameriško"},
    {ORTH: "anat.", NORM: "anatomija"},
    {ORTH: "angl.", NORM: "angleški"},
    {ORTH: "ant.", NORM: "antonim"},
    {ORTH: "antr.", NORM: "antropologija"},
    {ORTH: "apr.", NORM: "april"},
    {ORTH: "arab.", NORM: "arabsko"},
    {ORTH: "arheol.", NORM: "arheologija"},
    {ORTH: "arhit.", NORM: "arhitektura"},
    {ORTH: "avg.", NORM: "avgust"},
    {ORTH: "avstr.", NORM: "avstrijsko"},
    {ORTH: "avt.", NORM: "avtomobilizem"},
    {ORTH: "bibl.", NORM: "biblijsko"},
    {ORTH: "biokem.", NORM: "biokemija"},
    {ORTH: "biol.", NORM: "biologija"},
    {ORTH: "bolg.", NORM: "bolgarski"},
    {ORTH: "bot.", NORM: "botanika"},
    {ORTH: "cit.", NORM: "citat"},
    {ORTH: "daj.", NORM: "dajalnik"},
    {ORTH: "del.", NORM: "deležnik"},
    {ORTH: "ed.", NORM: "ednina"},
    {ORTH: "etn.", NORM: "etnografija"},
    {ORTH: "farm.", NORM: "farmacija"},
    {ORTH: "filat.", NORM: "filatelija"},
    {ORTH: "filoz.", NORM: "filozofija"},
    {ORTH: "fin.", NORM: "finančništvo"},
    {ORTH: "fiz.", NORM: "fizika"},
    {ORTH: "fot.", NORM: "fotografija"},
    {ORTH: "fr.", NORM: "francoski"},
    {ORTH: "friz.", NORM: "frizerstvo"},
    {ORTH: "gastr.", NORM: "gastronomija"},
    {ORTH: "geogr.", NORM: "geografija"},
    {ORTH: "geol.", NORM: "geologija"},
    {ORTH: "geom.", NORM: "geometrija"},
    {ORTH: "germ.", NORM: "germanski"},
    {ORTH: "gl.", NORM: "glej"},
    {ORTH: "glag.", NORM: "glagolski"},
    {ORTH: "glasb.", NORM: "glasba"},
    {ORTH: "gled.", NORM: "gledališče"},
    {ORTH: "gost.", NORM: "gostinstvo"},
    {ORTH: "gozd.", NORM: "gozdarstvo"},
    {ORTH: "gr.", NORM: "grški"},
    {ORTH: "grad.", NORM: "gradbeništvo"},
    {ORTH: "hebr.", NORM: "hebrejsko"},
    {ORTH: "hrv.", NORM: "hrvaško"},
    {ORTH: "ide.", NORM: "indoevropsko"},
    {ORTH: "igr.", NORM: "igre"},
    {ORTH: "im.", NORM: "imenovalnik"},
    {ORTH: "iron.", NORM: "ironično"},
    {ORTH: "it.", NORM: "italijanski"},
    {ORTH: "itd.", NORM: "in tako dalje"},
    {ORTH: "itn.", NORM: "in tako naprej"},
    {ORTH: "ipd.", NORM: "in podobno"},
    {ORTH: "jap.", NORM: "japonsko"},
    {ORTH: "jul.", NORM: "julij"},
    {ORTH: "jun.", NORM: "junij"},
    {ORTH: "kit.", NORM: "kitajsko"},
    {ORTH: "knj.", NORM: "knjižno"},
    {ORTH: "knjiž.", NORM: "knjižno"},
    {ORTH: "kor.", NORM: "koreografija"},
    {ORTH: "lat.", NORM: "latinski"},
    {ORTH: "les.", NORM: "lesna stroka"},
    {ORTH: "lingv.", NORM: "lingvistika"},
    {ORTH: "lit.", NORM: "literarni"},
    {ORTH: "ljubk.", NORM: "ljubkovalno"},
    {ORTH: "lov.", NORM: "lovstvo"},
    {ORTH: "m.", NORM: "moški"},
    {ORTH: "mak.", NORM: "makedonski"},
    {ORTH: "mar.", NORM: "marec"},
    {ORTH: "mat.", NORM: "matematika"},
    {ORTH: "med.", NORM: "medicina"},
    {ORTH: "meh.", NORM: "mehiško"},
    {ORTH: "mest.", NORM: "mestnik"},
    {ORTH: "mdr.", NORM: "med drugim"},
    {ORTH: "min.", NORM: "mineralogija"},
    {ORTH: "mitol.", NORM: "mitologija"},
    {ORTH: "mn.", NORM: "množina"},
    {ORTH: "mont.", NORM: "montanistika"},
    {ORTH: "muz.", NORM: "muzikologija"},
    {ORTH: "nam.", NORM: "namenilnik"},
    {ORTH: "nar.", NORM: "narečno"},
    {ORTH: "nav.", NORM: "navadno"},
    {ORTH: "nedol.", NORM: "nedoločnik"},
    {ORTH: "nedov.", NORM: "nedovršni"},
    {ORTH: "neprav.", NORM: "nepravilno"},
    {ORTH: "nepreh.", NORM: "neprehodno"},
    {ORTH: "neskl.", NORM: "nesklonljiv(o)"},
    {ORTH: "nestrok.", NORM: "nestrokovno"},
    {ORTH: "num.", NORM: "numizmatika"},
    {ORTH: "npr.", NORM: "na primer"},
    {ORTH: "obrt.", NORM: "obrtništvo"},
    {ORTH: "okt.", NORM: "oktober"},
    {ORTH: "or.", NORM: "orodnik"},
    {ORTH: "os.", NORM: "oseba"},
    {ORTH: "otr.", NORM: "otroško"},
    {ORTH: "oz.", NORM: "oziroma"},
    {ORTH: "pal.", NORM: "paleontologija"},
    {ORTH: "papir.", NORM: "papirništvo"},
    {ORTH: "ped.", NORM: "pedagogika"},
    {ORTH: "pisar.", NORM: "pisarniško"},
    {ORTH: "pog.", NORM: "pogovorno"},
    {ORTH: "polit.", NORM: "politika"},
    {ORTH: "polj.", NORM: "poljsko"},
    {ORTH: "poljud.", NORM: "poljudno"},
    {ORTH: "preg.", NORM: "pregovor"},
    {ORTH: "preh.", NORM: "prehodno"},
    {ORTH: "pren.", NORM: "preneseno"},
    {ORTH: "prid.", NORM: "pridevnik"},
    {ORTH: "prim.", NORM: "primerjaj"},
    {ORTH: "prisl.", NORM: "prislov"},
    {ORTH: "psih.", NORM: "psihologija"},
    {ORTH: "psiht.", NORM: "psihiatrija"},
    {ORTH: "rad.", NORM: "radiotehnika"},
    {ORTH: "rač.", NORM: "računalništvo"},
    {ORTH: "rib.", NORM: "ribištvo"},
    {ORTH: "rod.", NORM: "rodilnik"},
    {ORTH: "rus.", NORM: "rusko"},
    {ORTH: "s.", NORM: "srednji"},
    {ORTH: "sam.", NORM: "samostalniški"},
    {ORTH: "sed.", NORM: "sedanjik"},
    {ORTH: "sep.", NORM: "september"},
    {ORTH: "slabš.", NORM: "slabšalno"},
    {ORTH: "slovan.", NORM: "slovansko"},
    {ORTH: "slovaš.", NORM: "slovaško"},
    {ORTH: "srb.", NORM: "srbsko"},
    {ORTH: "star.", NORM: "starinsko"},
    {ORTH: "stil.", NORM: "stilno"},
    {ORTH: "sv.", NORM: "svet(i)"},
    {ORTH: "teh.", NORM: "tehnika"},
    {ORTH: "tisk.", NORM: "tiskarstvo"},
    {ORTH: "tj.", NORM: "to je"},
    {ORTH: "tož.", NORM: "tožilnik"},
    {ORTH: "trg.", NORM: "trgovina"},
    {ORTH: "ukr.", NORM: "ukrajinski"},
    {ORTH: "um.", NORM: "umetnost"},
    {ORTH: "vel.", NORM: "velelnik"},
    {ORTH: "vet.", NORM: "veterina"},
    {ORTH: "vez.", NORM: "veznik"},
    {ORTH: "vn.", NORM: "visokonemško"},
    {ORTH: "voj.", NORM: "vojska"},
    {ORTH: "vrtn.", NORM: "vrtnarstvo"},
    {ORTH: "vulg.", NORM: "vulgarno"},
    {ORTH: "vznes.", NORM: "vzneseno"},
    {ORTH: "zal.", NORM: "založništvo"},
    {ORTH: "zastar.", NORM: "zastarelo"},
    {ORTH: "zgod.", NORM: "zgodovina"},
    {ORTH: "zool.", NORM: "zoologija"},
    {ORTH: "čeb.", NORM: "čebelarstvo"},
    {ORTH: "češ.", NORM: "češki"},
    {ORTH: "člov.", NORM: "človeškost"},
    {ORTH: "šah.", NORM: "šahovski"},
    {ORTH: "šalj.", NORM: "šaljivo"},
    {ORTH: "šp.", NORM: "španski"},
    {ORTH: "špan.", NORM: "špansko"},
    {ORTH: "šport.", NORM: "športni"},
    {ORTH: "štev.", NORM: "števnik"},
    {ORTH: "šved.", NORM: "švedsko"},
    {ORTH: "švic.", NORM: "švicarsko"},
    {ORTH: "ž.", NORM: "ženski"},
    {ORTH: "žarg.", NORM: "žargonsko"},
    {ORTH: "žel.", NORM: "železnica"},
    {ORTH: "živ.", NORM: "živost"},
]:
    _exc[exc_data[ORTH]] = [exc_data]


abbrv = """
Co. Ch. DIPL. DR. Dr. Ev. Inc. Jr. Kr. Mag. M. MR. Mr. Mt. Murr. Npr. OZ. 
Opr. Osn. Prim. Roj. ST. Sim. Sp. Sred. St. Sv. Škofl. Tel. UR. Zb. 
a. aa. ab. abc. abit. abl. abs. abt. acc. accel. add. adj. adv. aet. afr. akad. al. alban. all. alleg. 
alp. alt. alter. alžir. am. an. andr. ang. anh. anon. ans. antrop. apoc. app. approx. apt. ar. arc. arch. 
arh. arr. as. asist. assist. assoc. asst. astr. attn. aug. avstral. az. b. bab. bal. bbl. bd. belg. bioinf. 
biomed. bk. bl. bn. borg. bp. br. braz. brit. bros. broš. bt. bu. c. ca. cal. can. cand. cantab. cap. capt.
cat. cath. cc. cca. cd. cdr. cdre. cent. cerkv. cert. cf. cfr. ch. chap. chem. chr. chs. cic. circ. civ. cl.
cm. cmd. cnr. co. cod. col. coll. colo. com. comp. con. conc. cond. conn. cons. cont. coop. corr. cost. cp.
cpl. cr. crd. cres. cresc. ct. cu. d. dan. dat. davč. ddr. dec. ded. def. dem. dent. dept. dia. dip. dipl. 
dir. disp. diss. div. do. doc. dok. dol. doo. dop. dott. dr. dram. druž. družb. drž. dt. duh. dur. dvr. dwt. e.
ea. ecc. eccl. eccles. econ. edn. egipt. egr. ekon. eksp. el. em. enc. eng. eo. ep. err. esp. esq. est.
et. etc. etnogr. etnol. ev. evfem. evr. ex. exc. excl. exp. expl. ext. exx. f. fa. facs. fak. faks. fas.
fasc. fco. fcp. feb. febr. fec. fed. fem. ff. fff. fid. fig. fil. film. fiziol. fiziot. flam. fm. fo. fol. folk.
frag. fran. franc. fsc. g. ga. gal. gdč. ge. gen. geod. geog. geotehnol. gg. gimn. glas. glav. gnr. go. gor.
gosp. gp. graf. gram. gren. grš. gs. h. hab. hf. hist. ho. hort. i. ia. ib. ibid. id. idr. idridr. ill. imen.
imp. impf. impr. in. inc. incl. ind. indus. inf. inform. ing. init. ins. int. inv. inšp. inštr. inž. is. islam.
ist. ital. iur. iz. izbr. izd. izg. izgr. izr. izv. j. jak. jam. jan. jav. je. jez. jr. jsl. jud. jug.
jugoslovan. jur. juž. jv. jz. k. kal. kan. kand. kat. kdo. kem. kip. kmet. kol. kom. komp. konf. kont. kost. kov. 
kp. kpfw. kr. kraj. krat. kub. kult. kv. kval. l. la. lab. lb. ld. let. lib. lik. litt. lj. ljud. ll. loc. log. 
loč. lt. ma. madž. mag. manag. manjš. masc. mass. mater. max. maxmax. mb. md. mech. medic. medij. medn. 
mehč. mem. menedž. mes. mess. metal. meteor. meteorol. mex. mi. mikr. mil. minn. mio. misc. miss. mit. mk. 
mkt. ml. mlad. mlle. mlr. mm. mme. množ. mo. moj. moš. možn. mr. mrd. mrs. ms. msc. msgr. mt. murr. mus. mut. 
n. na. nad. nadalj. nadom. nagl. nakl. namer. nan. naniz. nasl. nat. navt. nač. ned. nem. nik. nizoz. nm. nn. 
no. nom. norv. notr. nov. novogr. ns. o. ob. obd. obj. oblač. obl. oblik. obr. obraz. obs. obst. obt. obč. oc. 
oct. od. odd. odg. odn. odst. odv. oec. off. ok. okla. okr. ont. oo. op. opis. opp. opr. orch. ord. ore. oreg. 
org. orient. orig. ork. ort. oseb. osn. ot. ozir. ošk. p. pag. par. para. parc. parl. part. past. pat. pdk. 
pen. perf. pert. perz. pesn. pet. pev. pf. pfc. ph. pharm. phil. pis. pl. po. pod. podr. podaljš. pogl. pogoj. pojm. 
pok. pokr. pol. poljed. poljub. polu. pom. pomen. pon. ponov. pop. por. port. pos. posl. posn. pov. pp. ppl. pr. 
praet. prav. pravopis. pravosl. preb. pred. predl. predm. predp. preds. pref. pregib. prel. prem. premen. prep. 
pres. pret. prev. pribl. prih. pril. primerj. primor. prip. pripor. prir. prist. priv. proc. prof. prog. proiz. 
prom. pron. prop. prot. protest. prov. ps. pss. pt. publ. pz. q. qld. qu. quad. que. r. racc. rastl. razgl. 
razl. razv. rd. red. ref. reg. rel. relig. rep. repr. rer. resp. rest. ret. rev. revol. rež. rim. rist. rkp. rm. 
roj. rom. romun. rp. rr. rt. rud. ruš. ry. sal. samogl. san. sc. scen. sci. scr. sdv. seg. sek. sen. sept. ser. 
sev. sg. sgt. sh. sig. sigg. sign. sim. sin. sing. sinh. skand. skl. sklad. sklanj. sklep. skr. sl. slik. slov. 
slovak. slovn. sn. so. sob. soc. sociol. sod. sopomen. sopr. sor. sov. sovj. sp. spec. spl. spr. spreg. sq. sr. 
sre. sred. sredoz. srh. ss. ssp. st. sta. stan. stanstar. stcsl. ste. stim. stol. stom. str. stroj. strok. stsl. 
stud. sup. supl. suppl. svet. sz. t. tab. tech. ted. tehn. tehnol. tek. teks. tekst. tel. temp. ten. teol. ter. 
term. test. th. theol. tim. tip. tisočl. tit. tl. tol. tolmač. tom. tor. tov. tr. trad. traj. trans. tren. 
trib. tril. trop. trp. trž. ts. tt. tu. tur. turiz. tvor. tvorb. tč. u. ul. umet. un. univ. up. upr. ur. urad. 
us. ust. utr. v. va. val. var. varn. ven. ver. verb. vest. vezal. vic. vis. viv. viz. viš. vod. vok. vol. vpr. 
vrst. vrstil. vs. vv. vzd. vzg. vzh. vzor. w. wed. wg. wk. x. y. z. zah. zaim. zak. zap. zasl. zavar. zač. zb. 
združ. zg. zn. znan. znanstv. zoot. zun. zv. zvd. á. é. ć. č. čas. čet. čl. člen. čustv. đ. ľ. ł. ş. ŠT. š. šir. 
škofl. škot. šol. št. števil. štud. ů. ű. žen. žival. 
""".split()

for orth in abbrv:
    _exc[orth] = [{ORTH: orth}]


TOKENIZER_EXCEPTIONS = update_exc(BASE_EXCEPTIONS, _exc)
