import React from "react";
import {
  DefaultTheme,
  DarkTheme,
  TeamsTheme,
  WordTheme,
} from "@fluentui/theme-samples";
import { ThemeProvider, CommandBarButton } from "@fluentui/react";
import { useLocalStorage } from "react-use";

export const themes = {
  default: DefaultTheme,
  dark: DarkTheme,
  teams: TeamsTheme,
  word: WordTheme,
};

export const ThemeContext = React.createContext({
  theme: "dark",
  changeTheme: (name) => {},
});

export const useTheme = () => React.useContext(ThemeContext);

function ThemeConsumer({ children }) {
  const { theme } = useTheme();
  return <ThemeProvider theme={themes[theme]}>{children}</ThemeProvider>;
}

export function DynamicThemeProvider({ children }) {
  const [theme, setTheme] = useLocalStorage("theme", "default");

  const changeTheme = (name) => themes[name] && setTheme(name);
  const themeContextValue = { theme, changeTheme };

  return (
    <ThemeContext.Provider value={themeContextValue}>
      <ThemeConsumer>{children}</ThemeConsumer>
    </ThemeContext.Provider>
  );
}

export function ThemeToggle({ as: ButtonComponent }) {
  const { theme, changeTheme } = useTheme();
  const menuItems = Object.keys(themes).map((key) => ({
    key,
    text: key,
    canCheck: true,
    checked: theme === key,
    onClick: () => changeTheme(key),
  }));

  return (
    <ButtonComponent
      menuProps={{ shouldFocusOnMount: true, items: menuItems }}
      iconProps={{ iconName: "Color" }}
    >
      {theme}
    </ButtonComponent>
  );
}

ThemeToggle.defaultProps = {
  as: CommandBarButton,
};