import { IStyle, ITheme } from './ITheme';

import { A11YDark } from './A11YDark';
import { A11YLight } from './A11YLight';
import { Agate } from './Agate';
import { Androidstudio } from './Androidstudio';
import { ArduinoLight } from './ArduinoLight';
import { Arta } from './Arta';
import { Ascetic } from './Ascetic';
import { AtomOneDark } from './AtomOneDark';
import { AtomOneDarkReasonable } from './AtomOneDarkReasonable';
import { AtomOneLight } from './AtomOneLight';
import { Base163024 } from './Base163024';
import { Base16Apathy } from './Base16Apathy';
import { Base16Apprentice } from './Base16Apprentice';
import { Base16Ashes } from './Base16Ashes';
import { Base16AtelierCave } from './Base16AtelierCave';
import { Base16AtelierCaveLight } from './Base16AtelierCaveLight';
import { Base16AtelierDune } from './Base16AtelierDune';
import { Base16AtelierDuneLight } from './Base16AtelierDuneLight';
import { Base16AtelierEstuary } from './Base16AtelierEstuary';
import { Base16AtelierEstuaryLight } from './Base16AtelierEstuaryLight';
import { Base16AtelierForest } from './Base16AtelierForest';
import { Base16AtelierForestLight } from './Base16AtelierForestLight';
import { Base16AtelierHeath } from './Base16AtelierHeath';
import { Base16AtelierHeathLight } from './Base16AtelierHeathLight';
import { Base16AtelierLakeside } from './Base16AtelierLakeside';
import { Base16AtelierLakesideLight } from './Base16AtelierLakesideLight';
import { Base16AtelierPlateau } from './Base16AtelierPlateau';
import { Base16AtelierPlateauLight } from './Base16AtelierPlateauLight';
import { Base16AtelierSavanna } from './Base16AtelierSavanna';
import { Base16AtelierSavannaLight } from './Base16AtelierSavannaLight';
import { Base16AtelierSeaside } from './Base16AtelierSeaside';
import { Base16AtelierSeasideLight } from './Base16AtelierSeasideLight';
import { Base16AtelierSulphurpool } from './Base16AtelierSulphurpool';
import { Base16AtelierSulphurpoolLight } from './Base16AtelierSulphurpoolLight';
import { Base16Atlas } from './Base16Atlas';
import { Base16Bespin } from './Base16Bespin';
import { Base16BlackMetal } from './Base16BlackMetal';
import { Base16BlackMetalBathory } from './Base16BlackMetalBathory';
import { Base16BlackMetalBurzum } from './Base16BlackMetalBurzum';
import { Base16BlackMetalDarkFuneral } from './Base16BlackMetalDarkFuneral';
import { Base16BlackMetalGorgoroth } from './Base16BlackMetalGorgoroth';
import { Base16BlackMetalImmortal } from './Base16BlackMetalImmortal';
import { Base16BlackMetalKhold } from './Base16BlackMetalKhold';
import { Base16BlackMetalMarduk } from './Base16BlackMetalMarduk';
import { Base16BlackMetalMayhem } from './Base16BlackMetalMayhem';
import { Base16BlackMetalNile } from './Base16BlackMetalNile';
import { Base16BlackMetalVenom } from './Base16BlackMetalVenom';
import { Base16Brewer } from './Base16Brewer';
import { Base16Bright } from './Base16Bright';
import { Base16Brogrammer } from './Base16Brogrammer';
import { Base16BrushTrees } from './Base16BrushTrees';
import { Base16BrushTreesDark } from './Base16BrushTreesDark';
import { Base16Chalk } from './Base16Chalk';
import { Base16Circus } from './Base16Circus';
import { Base16ClassicDark } from './Base16ClassicDark';
import { Base16ClassicLight } from './Base16ClassicLight';
import { Base16Codeschool } from './Base16Codeschool';
import { Base16Colors } from './Base16Colors';
import { Base16Cupcake } from './Base16Cupcake';
import { Base16Cupertino } from './Base16Cupertino';
import { Base16DanQing } from './Base16DanQing';
import { Base16Darcula } from './Base16Darcula';
import { Base16DarkViolet } from './Base16DarkViolet';
import { Base16Darkmoss } from './Base16Darkmoss';
import { Base16Darktooth } from './Base16Darktooth';
import { Base16Decaf } from './Base16Decaf';
import { Base16DefaultDark } from './Base16DefaultDark';
import { Base16DefaultLight } from './Base16DefaultLight';
import { Base16Dirtysea } from './Base16Dirtysea';
import { Base16Dracula } from './Base16Dracula';
import { Base16EdgeDark } from './Base16EdgeDark';
import { Base16EdgeLight } from './Base16EdgeLight';
import { Base16Eighties } from './Base16Eighties';
import { Base16Embers } from './Base16Embers';
import { Base16EquilibriumDark } from './Base16EquilibriumDark';
import { Base16EquilibriumGrayDark } from './Base16EquilibriumGrayDark';
import { Base16EquilibriumGrayLight } from './Base16EquilibriumGrayLight';
import { Base16EquilibriumLight } from './Base16EquilibriumLight';
import { Base16Espresso } from './Base16Espresso';
import { Base16Eva } from './Base16Eva';
import { Base16EvaDim } from './Base16EvaDim';
import { Base16Flat } from './Base16Flat';
import { Base16Framer } from './Base16Framer';
import { Base16FruitSoda } from './Base16FruitSoda';
import { Base16Gigavolt } from './Base16Gigavolt';
import { Base16Github } from './Base16Github';
import { Base16GoogleDark } from './Base16GoogleDark';
import { Base16GoogleLight } from './Base16GoogleLight';
import { Base16GrayscaleDark } from './Base16GrayscaleDark';
import { Base16GrayscaleLight } from './Base16GrayscaleLight';
import { Base16GreenScreen } from './Base16GreenScreen';
import { Base16GruvboxDarkHard } from './Base16GruvboxDarkHard';
import { Base16GruvboxDarkMedium } from './Base16GruvboxDarkMedium';
import { Base16GruvboxDarkPale } from './Base16GruvboxDarkPale';
import { Base16GruvboxDarkSoft } from './Base16GruvboxDarkSoft';
import { Base16GruvboxLightHard } from './Base16GruvboxLightHard';
import { Base16GruvboxLightMedium } from './Base16GruvboxLightMedium';
import { Base16GruvboxLightSoft } from './Base16GruvboxLightSoft';
import { Base16Hardcore } from './Base16Hardcore';
import { Base16Harmonic16Dark } from './Base16Harmonic16Dark';
import { Base16Harmonic16Light } from './Base16Harmonic16Light';
import { Base16HeetchDark } from './Base16HeetchDark';
import { Base16HeetchLight } from './Base16HeetchLight';
import { Base16Helios } from './Base16Helios';
import { Base16Hopscotch } from './Base16Hopscotch';
import { Base16HorizonDark } from './Base16HorizonDark';
import { Base16HorizonLight } from './Base16HorizonLight';
import { Base16HumanoidDark } from './Base16HumanoidDark';
import { Base16HumanoidLight } from './Base16HumanoidLight';
import { Base16IADark } from './Base16IADark';
import { Base16IALight } from './Base16IALight';
import { Base16IRBlack } from './Base16IRBlack';
import { Base16IcyDark } from './Base16IcyDark';
import { Base16Isotope } from './Base16Isotope';
import { Base16Kimber } from './Base16Kimber';
import { Base16LondonTube } from './Base16LondonTube';
import { Base16Macintosh } from './Base16Macintosh';
import { Base16Marrakesh } from './Base16Marrakesh';
import { Base16Materia } from './Base16Materia';
import { Base16Material } from './Base16Material';
import { Base16MaterialDarker } from './Base16MaterialDarker';
import { Base16MaterialLighter } from './Base16MaterialLighter';
import { Base16MaterialPalenight } from './Base16MaterialPalenight';
import { Base16MaterialVivid } from './Base16MaterialVivid';
import { Base16MellowPurple } from './Base16MellowPurple';
import { Base16MexicoLight } from './Base16MexicoLight';
import { Base16Mocha } from './Base16Mocha';
import { Base16Monokai } from './Base16Monokai';
import { Base16Nebula } from './Base16Nebula';
import { Base16Nord } from './Base16Nord';
import { Base16Nova } from './Base16Nova';
import { Base16Ocean } from './Base16Ocean';
import { Base16OceanicNext } from './Base16OceanicNext';
import { Base16OneDark } from './Base16OneDark';
import { Base16OneLight } from './Base16OneLight';
import { Base16OutrunDark } from './Base16OutrunDark';
import { Base16PaperColorDark } from './Base16PaperColorDark';
import { Base16PaperColorLight } from './Base16PaperColorLight';
import { Base16Paraiso } from './Base16Paraiso';
import { Base16Pasque } from './Base16Pasque';
import { Base16PhD } from './Base16PhD';
import { Base16Pico } from './Base16Pico';
import { Base16Pop } from './Base16Pop';
import { Base16Porple } from './Base16Porple';
import { Base16Qualia } from './Base16Qualia';
import { Base16Railscasts } from './Base16Railscasts';
import { Base16Rebecca } from './Base16Rebecca';
import { Base16RosPine } from './Base16RosPine';
import { Base16RosPineDawn } from './Base16RosPineDawn';
import { Base16RosPineMoon } from './Base16RosPineMoon';
import { Base16Sagelight } from './Base16Sagelight';
import { Base16Sandcastle } from './Base16Sandcastle';
import { Base16SetiUI } from './Base16SetiUI';
import { Base16Shapeshifter } from './Base16Shapeshifter';
import { Base16SilkDark } from './Base16SilkDark';
import { Base16SilkLight } from './Base16SilkLight';
import { Base16Snazzy } from './Base16Snazzy';
import { Base16SolarFlare } from './Base16SolarFlare';
import { Base16SolarFlareLight } from './Base16SolarFlareLight';
import { Base16SolarizedDark } from './Base16SolarizedDark';
import { Base16SolarizedLight } from './Base16SolarizedLight';
import { Base16Spacemacs } from './Base16Spacemacs';
import { Base16Summercamp } from './Base16Summercamp';
import { Base16SummerfruitDark } from './Base16SummerfruitDark';
import { Base16SummerfruitLight } from './Base16SummerfruitLight';
import { Base16SynthMidnightTerminalDark } from './Base16SynthMidnightTerminalDark';
import { Base16SynthMidnightTerminalLight } from './Base16SynthMidnightTerminalLight';
import { Base16Tango } from './Base16Tango';
import { Base16Tender } from './Base16Tender';
import { Base16Tomorrow } from './Base16Tomorrow';
import { Base16TomorrowNight } from './Base16TomorrowNight';
import { Base16Twilight } from './Base16Twilight';
import { Base16UnikittyDark } from './Base16UnikittyDark';
import { Base16UnikittyLight } from './Base16UnikittyLight';
import { Base16Vulcan } from './Base16Vulcan';
import { Base16Windows10 } from './Base16Windows10';
import { Base16Windows10Light } from './Base16Windows10Light';
import { Base16Windows95 } from './Base16Windows95';
import { Base16Windows95Light } from './Base16Windows95Light';
import { Base16WindowsHighContrast } from './Base16WindowsHighContrast';
import { Base16WindowsHighContrastLight } from './Base16WindowsHighContrastLight';
import { Base16WindowsNT } from './Base16WindowsNT';
import { Base16WindowsNTLight } from './Base16WindowsNTLight';
import { Base16Woodland } from './Base16Woodland';
import { Base16XCodeDusk } from './Base16XCodeDusk';
import { Base16Zenburn } from './Base16Zenburn';
import { BlueHintGray } from './BlueHintGray';
import { BrownPaper } from './BrownPaper';
import { CodepenEmbed } from './CodepenEmbed';
import { ColorBrewer } from './ColorBrewer';
import { Dark } from './Dark';
import { Default } from './Default';
import { Desert } from './Desert';
import { DevibeansDark } from './DevibeansDark';
import { Docco } from './Docco';
import { Far } from './Far';
import { Foundation } from './Foundation';
import { GitHub } from './GitHub';
import { GitHubDark } from './GitHubDark';
import { GitHubDarkDimmed } from './GitHubDarkDimmed';
import { Gml } from './Gml';
import { Googlecode } from './Googlecode';
import { GradientDark } from './GradientDark';
import { GradientLight } from './GradientLight';
import { Grayscale } from './Grayscale';
import { Hybrid } from './Hybrid';
import { Idea } from './Idea';
import { IntellijLight } from './IntellijLight';
import { IrBlack } from './IrBlack';
import { IsblEditorDark } from './IsblEditorDark';
import { IsblEditorLight } from './IsblEditorLight';
import { KimbieDark } from './KimbieDark';
import { KimbieLight } from './KimbieLight';
import { Lightfair } from './Lightfair';
import { Lioshi } from './Lioshi';
import { Magula } from './Magula';
import { MonoBlue } from './MonoBlue';
import { Monokai } from './Monokai';
import { MonokaiSublime } from './MonokaiSublime';
import { NightOwl } from './NightOwl';
import { NnfxDark } from './NnfxDark';
import { NnfxLight } from './NnfxLight';
import { Nord } from './Nord';
import { Obsidian } from './Obsidian';
import { PandaSyntaxDark } from './PandaSyntaxDark';
import { PandaSyntaxLight } from './PandaSyntaxLight';
import { ParaisoDark } from './ParaisoDark';
import { ParaisoLight } from './ParaisoLight';
import { Pojoaque } from './Pojoaque';
import { Purebasic } from './Purebasic';
import { QtcreatorDark } from './QtcreatorDark';
import { QtcreatorLight } from './QtcreatorLight';
import { Rainbow } from './Rainbow';
import { Routeros } from './Routeros';
import { SchoolBook } from './SchoolBook';
import { ShadesOfPurple } from './ShadesOfPurple';
import { Srcery } from './Srcery';
import { StackOverflowDark } from './StackOverflowDark';
import { StackOverflowLight } from './StackOverflowLight';
import { SunburstHighlight } from './SunburstHighlight';
import { Theme1cLight } from './Theme1cLight';
import { TokyoNightDark } from './TokyoNightDark';
import { TokyoNightLight } from './TokyoNightLight';
import { TomorrowNightBlue } from './TomorrowNightBlue';
import { TomorrowNightBright } from './TomorrowNightBright';
import { UeAuroraPopLight } from './UeAuroraPopLight';
import { UeNeonCandyLight } from './UeNeonCandyLight';
import { Vs } from './Vs';
import { Vs2015 } from './Vs2015';
import { XCode } from './XCode';
import { Xt256 } from './Xt256';
import { DefaultGray } from './DefaultGray';
import { AtelierCaveDark } from './AtelierCaveDark';
import { AtelierCaveLight } from './AtelierCaveLight';
import { Sunburst } from './Sunburst';

type ThemeDictionary = { [key: string]: ITheme };

export const Themes: ThemeDictionary = {
  A11YDark,
  A11YLight,
  Agate,
  Androidstudio,
  ArduinoLight,
  Arta,
  Ascetic,
  AtelierCaveDark,
  AtelierCaveLight,
  AtomOneDark,
  AtomOneDarkReasonable,
  AtomOneLight,
  Base163024,
  Base16Apathy,
  Base16Apprentice,
  Base16Ashes,
  Base16AtelierCave,
  Base16AtelierCaveLight,
  Base16AtelierDune,
  Base16AtelierDuneLight,
  Base16AtelierEstuary,
  Base16AtelierEstuaryLight,
  Base16AtelierForest,
  Base16AtelierForestLight,
  Base16AtelierHeath,
  Base16AtelierHeathLight,
  Base16AtelierLakeside,
  Base16AtelierLakesideLight,
  Base16AtelierPlateau,
  Base16AtelierPlateauLight,
  Base16AtelierSavanna,
  Base16AtelierSavannaLight,
  Base16AtelierSeaside,
  Base16AtelierSeasideLight,
  Base16AtelierSulphurpool,
  Base16AtelierSulphurpoolLight,
  Base16Atlas,
  Base16Bespin,
  Base16BlackMetal,
  Base16BlackMetalBathory,
  Base16BlackMetalBurzum,
  Base16BlackMetalDarkFuneral,
  Base16BlackMetalGorgoroth,
  Base16BlackMetalImmortal,
  Base16BlackMetalKhold,
  Base16BlackMetalMarduk,
  Base16BlackMetalMayhem,
  Base16BlackMetalNile,
  Base16BlackMetalVenom,
  Base16Brewer,
  Base16Bright,
  Base16Brogrammer,
  Base16BrushTrees,
  Base16BrushTreesDark,
  Base16Chalk,
  Base16Circus,
  Base16ClassicDark,
  Base16ClassicLight,
  Base16Codeschool,
  Base16Colors,
  Base16Cupcake,
  Base16Cupertino,
  Base16DanQing,
  Base16Darcula,
  Base16DarkViolet,
  Base16Darkmoss,
  Base16Darktooth,
  Base16Decaf,
  Base16DefaultDark,
  Base16DefaultLight,
  Base16Dirtysea,
  Base16Dracula,
  Base16EdgeDark,
  Base16EdgeLight,
  Base16Eighties,
  Base16Embers,
  Base16EquilibriumDark,
  Base16EquilibriumGrayDark,
  Base16EquilibriumGrayLight,
  Base16EquilibriumLight,
  Base16Espresso,
  Base16Eva,
  Base16EvaDim,
  Base16Flat,
  Base16Framer,
  Base16FruitSoda,
  Base16Gigavolt,
  Base16Github,
  Base16GoogleDark,
  Base16GoogleLight,
  Base16GrayscaleDark,
  Base16GrayscaleLight,
  Base16GreenScreen,
  Base16GruvboxDarkHard,
  Base16GruvboxDarkMedium,
  Base16GruvboxDarkPale,
  Base16GruvboxDarkSoft,
  Base16GruvboxLightHard,
  Base16GruvboxLightMedium,
  Base16GruvboxLightSoft,
  Base16Hardcore,
  Base16Harmonic16Dark,
  Base16Harmonic16Light,
  Base16HeetchDark,
  Base16HeetchLight,
  Base16Helios,
  Base16Hopscotch,
  Base16HorizonDark,
  Base16HorizonLight,
  Base16HumanoidDark,
  Base16HumanoidLight,
  Base16IADark,
  Base16IALight,
  Base16IRBlack,
  Base16IcyDark,
  Base16Isotope,
  Base16Kimber,
  Base16LondonTube,
  Base16Macintosh,
  Base16Marrakesh,
  Base16Materia,
  Base16Material,
  Base16MaterialDarker,
  Base16MaterialLighter,
  Base16MaterialPalenight,
  Base16MaterialVivid,
  Base16MellowPurple,
  Base16MexicoLight,
  Base16Mocha,
  Base16Monokai,
  Base16Nebula,
  Base16Nord,
  Base16Nova,
  Base16Ocean,
  Base16OceanicNext,
  Base16OneDark,
  Base16OneLight,
  Base16OutrunDark,
  Base16PaperColorDark,
  Base16PaperColorLight,
  Base16Paraiso,
  Base16Pasque,
  Base16PhD,
  Base16Pico,
  Base16Pop,
  Base16Porple,
  Base16Qualia,
  Base16Railscasts,
  Base16Rebecca,
  Base16RosPine,
  Base16RosPineDawn,
  Base16RosPineMoon,
  Base16Sagelight,
  Base16Sandcastle,
  Base16SetiUI,
  Base16Shapeshifter,
  Base16SilkDark,
  Base16SilkLight,
  Base16Snazzy,
  Base16SolarFlare,
  Base16SolarFlareLight,
  Base16SolarizedDark,
  Base16SolarizedLight,
  Base16Spacemacs,
  Base16Summercamp,
  Base16SummerfruitDark,
  Base16SummerfruitLight,
  Base16SynthMidnightTerminalDark,
  Base16SynthMidnightTerminalLight,
  Base16Tango,
  Base16Tender,
  Base16Tomorrow,
  Base16TomorrowNight,
  Base16Twilight,
  Base16UnikittyDark,
  Base16UnikittyLight,
  Base16Vulcan,
  Base16Windows10,
  Base16Windows10Light,
  Base16Windows95,
  Base16Windows95Light,
  Base16WindowsHighContrast,
  Base16WindowsHighContrastLight,
  Base16WindowsNT,
  Base16WindowsNTLight,
  Base16Woodland,
  Base16XCodeDusk,
  Base16Zenburn,
  BlueHintGray,
  BrownPaper,
  CodepenEmbed,
  ColorBrewer,
  Dark,
  Default,
  DefaultGray,
  Desert,
  DevibeansDark,
  Docco,
  Far,
  Foundation,
  GitHub,
  GitHubDark,
  GitHubDarkDimmed,
  Gml,
  Googlecode,
  GradientDark,
  GradientLight,
  Grayscale,
  Hybrid,
  Idea,
  IntellijLight,
  IrBlack,
  IsblEditorDark,
  IsblEditorLight,
  KimbieDark,
  KimbieLight,
  Lightfair,
  Lioshi,
  Magula,
  MonoBlue,
  Monokai,
  MonokaiSublime,
  NightOwl,
  NnfxDark,
  NnfxLight,
  Nord,
  Obsidian,
  PandaSyntaxDark,
  PandaSyntaxLight,
  ParaisoDark,
  ParaisoLight,
  Pojoaque,
  Purebasic,
  QtcreatorDark,
  QtcreatorLight,
  Rainbow,
  Routeros,
  SchoolBook,
  ShadesOfPurple,
  Srcery,
  StackOverflowDark,
  StackOverflowLight,
  Sunburst,
  SunburstHighlight,
  Theme1cLight,
  TokyoNightDark,
  TokyoNightLight,
  TomorrowNightBlue,
  TomorrowNightBright,
  UeAuroraPopLight,
  UeNeonCandyLight,
  Vs,
  Vs2015,
  XCode,
  Xt256,
};

function MergeStyleProperties(object: IStyle) {
  if (!object || !Object.keys(object)) {
    return '';
  }

  const styleNameMap: { [key: string]: string } = {
    Color: 'color:#',
    Background: 'background:',
    BackgroundColor: 'background-color:',
    FontWeight: 'font-weight:',
    FontStyle: 'font-style:',
  };

  return Object.keys(object).reduce((p, c) => {
    if (
      (c === 'BackgroundColor' || c === 'Background') &&
      object[c] !== 'none'
    ) {
      return `${p}${styleNameMap[c]}#${object[c]};`;
    }
    return `${p}${styleNameMap[c]}${object[c]};`;
  }, '');
}

export function GetLineNumberStyle(theme: string) {
  if (!Themes[theme]) {
    return '';
  }
  return MergeStyleProperties(Themes[theme].LineNumberStyle);
}

export function GetBackgroundStyle(theme: string) {
  if (!Themes[theme]) {
    return '';
  }
  return MergeStyleProperties(Themes[theme].BackgroundStyle);
}

/**
 * Returns a CSS style string for code references
 * @param theme Defined theme we're getting the style for
 * @param styleName Style name of the code snippet (ex: Keyword vs Punctuation)
 * @returns string
 */
export function GetGenericStyle(theme: string, styleName: string): string {
  if (!Themes[theme]) {
    return '';
  }
  return MergeStyleProperties(Themes[theme].CodeStyles[styleName]);
}
