package org.jabref.logic.util.strings;

import java.util.HashMap;

public class RtfCharMap {

    private final HashMap<String, String> rtfMap = new HashMap<>();

    public RtfCharMap() {
        put("`a", "\\'e0");
        put("`e", "\\'e8");
        put("`i", "\\'ec");
        put("`o", "\\'f2");
        put("`u", "\\'f9");
        put("'a", "\\'e1");
        put("'e", "\\'e9");
        put("'i", "\\'ed");
        put("'o", "\\'f3");
        put("'u", "\\'fa");
        put("^a", "\\'e2");
        put("^e", "\\'ea");
        put("^i", "\\'ee");
        put("^o", "\\'f4");
        put("^u", "\\'fa");
        put("\"a", "\\'e4");
        put("\"e", "\\'eb");
        put("\"i", "\\'ef");
        put("\"o", "\\'f6");
        put("\"u", "\\u252u");
        put("~n", "\\'f1");
        put("`A", "\\'c0");
        put("`E", "\\'c8");
        put("`I", "\\'cc");
        put("`O", "\\'d2");
        put("`U", "\\'d9");
        put("'A", "\\'c1");
        put("'E", "\\'c9");
        put("'I", "\\'cd");
        put("'O", "\\'d3");
        put("'U", "\\'da");
        put("^A", "\\'c2");
        put("^E", "\\'ca");
        put("^I", "\\'ce");
        put("^O", "\\'d4");
        put("^U", "\\'db");
        put("\"A", "\\'c4");
        put("\"E", "\\'cb");
        put("\"I", "\\'cf");
        put("\"O", "\\'d6");
        put("\"U", "\\'dc");

        // Use UNICODE characters for RTF-Chars which cannot be found in the
        // standard codepage

        put("S", "\\u167S"); // Section sign
        put("`!", "\\u161!"); // Inverted exclamation point
        put("pounds", "\\u163?"); // Pound sign
        put("copyright", "\\u169?"); // Copyright sign
        put("P", "\\u182P"); // Paragraph sign
        put("`?", "\\u191?"); // Inverted question mark
        put("~A", "\\u195A"); // "Atilde"
        put("AA", "\\u197A"); // "Aring"
        // RTFCHARS.put("AE", "{\\uc2\\u198AE}"); // "AElig"
        put("AE", "{\\u198AE}"); // "AElig"

        put("cC", "\\u199C"); // "Ccedil"

        put("DH", "\\u208D"); // "ETH"

        put("~N", "\\u209N"); // "Ntilde"

        put("~O", "\\u213O"); // "Otilde"
        // According to ISO 8859-1 the "\times" symbol should be placed here
        // (#215).
        // Omitting this, because it is a mathematical symbol.
        put("O", "\\u216O"); // "Oslash"
        //  RTFCHARS.put("O", "\\'d8");
        put("o", "\\'f8");

        put("'Y", "\\u221Y"); // "Yacute"

        put("TH", "\\u222TH"); // "THORN"

        put("ss", "\\u223ss"); // "szlig"
        // RTFCHARS.put("ss", "AFFEN"); // "szlig"

        put("~a", "\\u227a"); // "atilde"
        put("aa", "\\u229a"); // "aring"
        //  RTFCHARS.put("ae", "{\\uc2\\u230ae}"); // "aelig" \\u230e6
        put("ae", "{\\u230ae}"); // "aelig" \\u230e6

        put("cc", "\\u231c"); // "ccedil"

        put("dh", "\\u240d"); // "eth"

        put("~o", "\\u245o"); // "otilde"
        // According to ISO 8859-1 the "\div" symbol should be placed here
        // (#247).
        // Omitting this, because it is a mathematical symbol.
        put("o", "\\u248o"); // "oslash"

        // RTFCHARS.put("\"u", "\\u252"); // "uuml" exists in standard
        // codepage

        put("'y", "\\u253y"); // "yacute"
        put("th", "\\u254th"); // "thorn"
        put("\"y", "\\u255y"); // "yuml"

        put("=A", "\\u256A"); // "Amacr"
        put("=a", "\\u257a"); // "amacr"
        put("uA", "\\u258A"); // "Abreve"
        put("ua", "\\u259a"); // "abreve"
        put("kA", "\\u260A"); // "Aogon"
        put("ka", "\\u261a"); // "aogon"

        put("'C", "\\u262C"); // "Cacute"
        put("'c", "\\u263c"); // "cacute"
        put("^C", "\\u264C"); // "Ccirc"
        put("^c", "\\u265c"); // "ccirc"
        put(".C", "\\u266C"); // "Cdot"
        put(".c", "\\u267c"); // "cdot"
        put("vC", "\\u268C"); // "Ccaron"
        put("vc", "\\u269c"); // "ccaron"

        put("vD", "\\u270D"); // "Dcaron"
        // Symbol #271 (d) has no special Latex command
        put("DJ", "\\u272D"); // "Dstrok"
        put("dj", "\\u273d"); // "dstrok"

        put("=E", "\\u274E"); // "Emacr"
        put("=e", "\\u275e"); // "emacr"
        put("uE", "\\u276E"); // "Ebreve"
        put("ue", "\\u277e"); // "ebreve"
        put(".E", "\\u278E"); // "Edot"
        put(".e", "\\u279e"); // "edot"
        put("kE", "\\u280E"); // "Eogon"
        put("ke", "\\u281e"); // "eogon"
        put("vE", "\\u282E"); // "Ecaron"
        put("ve", "\\u283e"); // "ecaron"

        put("^G", "\\u284G"); // "Gcirc"
        put("^g", "\\u285g"); // "gcirc"
        put("uG", "\\u286G"); // "Gbreve"
        put("ug", "\\u287g"); // "gbreve"
        put(".G", "\\u288G"); // "Gdot"
        put(".g", "\\u289g"); // "gdot"
        put("cG", "\\u290G"); // "Gcedil"
        put("'g", "\\u291g"); // "gacute"

        put("^H", "\\u292H"); // "Hcirc"
        put("^h", "\\u293h"); // "hcirc"
        put("Hstrok", "\\u294H"); // "Hstrok"
        put("hstrok", "\\u295h"); // "hstrok"

        put("~I", "\\u296I"); // "Itilde"
        put("~i", "\\u297i"); // "itilde"
        put("=I", "\\u298I"); // "Imacr"
        put("=i", "\\u299i"); // "imacr"
        put("uI", "\\u300I"); // "Ibreve"
        put("ui", "\\u301i"); // "ibreve"
        put("kI", "\\u302I"); // "Iogon"
        put("ki", "\\u303i"); // "iogon"
        put(".I", "\\u304I"); // "Idot"

        // Symbol #306 (IJ) has no special Latex command
        // Symbol #307 (ij) has no special Latex command
        put("^J", "\\u308J"); // "Jcirc"
        put("^j", "\\u309j"); // "jcirc"

        put("cK", "\\u310K"); // "Kcedil"
        put("ck", "\\u311k"); // "kcedil"

        // Symbol #312 (k) has no special Latex command
        put("'L", "\\u313L"); // "Lacute"
        put("'l", "\\u314l"); // "lacute"
        put("cL", "\\u315L"); // "Lcedil"
        put("cl", "\\u316l"); // "lcedil"
        // Symbol #317 (L) has no special Latex command
        // Symbol #318 (l) has no special Latex command
        put("Lmidot", "\\u319L"); // "Lmidot"
        put("lmidot", "\\u320l"); // "lmidot"
        put("L", "\\u321L"); // "Lstrok"
        put("l", "\\u322l"); // "lstrok"

        put("'N", "\\u323N"); // "Nacute"
        put("'n", "\\u324n"); // "nacute"
        put("cN", "\\u325N"); // "Ncedil"
        put("cn", "\\u326n"); // "ncedil"
        put("vN", "\\u327N"); // "Ncaron"
        put("vn", "\\u328n"); // "ncaron"

        // Symbol #329 (n) has no special Latex command
        put("NG", "\\u330G"); // "ENG"
        put("ng", "\\u331g"); // "eng"

        put("=O", "\\u332O"); // "Omacr"
        put("=o", "\\u333o"); // "omacr"
        put("uO", "\\u334O"); // "Obreve"
        put("uo", "\\u335o"); // "obreve"

        put("HO", "\\u336?"); // "Odblac"
        put("Ho", "\\u337?"); // "odblac"

        put("OE", "{\\u338OE}"); // "OElig"
        put("oe", "{\\u339oe}"); // "oelig"

        put("'R", "\\u340R"); // "Racute"
        put("'r", "\\u341r"); // "racute"
        put("cR", "\\u342R"); // "Rcedil"
        put("cr", "\\u343r"); // "rcedil"
        put("vR", "\\u344R"); // "Rcaron"
        put("vr", "\\u345r"); // "rcaron"

        put("'S", "\\u346S"); // "Sacute"
        put("'s", "\\u347s"); // "sacute"
        put("^S", "\\u348S"); // "Scirc"
        put("^s", "\\u349s"); // "scirc"
        put("cS", "\\u350S"); // "Scedil"
        put("cs", "\\u351s"); // "scedil"
        put("vS", "\\u352S"); // "Scaron"
        put("vs", "\\u353s"); // "scaron"

        put("cT", "\\u354T"); // "Tcedil"
        put("ct", "\\u355t"); // "tcedil"
        put("vT", "\\u356T"); // "Tcaron"
        // Symbol #357 (t) has no special Latex command
        put("Tstrok", "\\u358T"); // "Tstrok"
        put("tstrok", "\\u359t"); // "tstrok"

        put("~U", "\\u360U"); // "Utilde"
        put("~u", "\\u361u"); // "utilde"
        put("=U", "\\u362U"); // "Umacr"
        put("=u", "\\u363u"); // "umacr"
        put("uU", "\\u364U"); // "Ubreve"
        put("uu", "\\u365u"); // "ubreve"
        put("rU", "\\u366U"); // "Uring"
        put("ru", "\\u367u"); // "uring"

        put("HU", "\\u368?"); // "Odblac"
        put("Hu", "\\u369?"); // "odblac"

        put("kU", "\\u370U"); // "Uogon"
        put("ku", "\\u371u"); // "uogon"

        put("^W", "\\u372W"); // "Wcirc"
        put("^w", "\\u373w"); // "wcirc"

        put("^Y", "\\u374Y"); // "Ycirc"
        put("^y", "\\u375y"); // "ycirc"
        put("\"Y", "\\u376Y"); // "Yuml"

        put("'Z", "\\u377Z"); // "Zacute"
        put("'z", "\\u378z"); // "zacute"
        put(".Z", "\\u379Z"); // "Zdot"
        put(".z", "\\u380z"); // "zdot"
        put("vZ", "\\u381Z"); // "Zcaron"
        put("vz", "\\u382z"); // "zcaron"
        // Symbol #383 (f) has no special Latex command
    }

    private void put(String key, String value) {
        rtfMap.put(key, value);
    }

    public String get(String key) {
        return rtfMap.get(key);
    }
}
