import React from "react";
import {
  Box,
  Button,
  HStack,
  IconButton,
  Menu,
  MenuButton,
  MenuItem,
  MenuList,
  useBreakpointValue,
  useColorMode,
} from "@chakra-ui/core";
import { Link, useLocation } from "react-router-dom";
import { useAuth0 } from "@auth0/auth0-react";
import {
  ChevronLeftIcon,
  HamburgerIcon,
  MoonIcon,
  SunIcon,
} from "@chakra-ui/icons";

import useCurrentUser from "./components/useCurrentUser";

import HomeLinkIcon from "../images/home-link-icon.png";
import HomeLinkIcon2x from "../images/home-link-icon@2x.png";

function GlobalNavBar() {
  const navStyle = useBreakpointValue({ base: "menu", md: "buttons" });

  return (
    <Box display="flex" alignItems="center" flexWrap="wrap">
      <HStack alignItems="center" spacing="2" marginRight="4">
        <HomeLink />
        {navStyle === "menu" && <NavMenu />}
        {navStyle === "buttons" && <NavButtons />}
      </HStack>
      <Box marginLeft="auto">
        <UserNavBarSection />
      </Box>
    </Box>
  );
}

function HomeLink() {
  const { pathname } = useLocation();
  const isHomePage = pathname === "/";

  return (
    <Box
      as={Link}
      to="/"
      display="flex"
      alignItems="center"
      position="relative"
      role="group"
      transition="all 0.2s"
      opacity="0.8"
      _hover={{ transform: "scale(1.1)", opacity: "1" }}
      _focus={{ transform: "scale(1.1)", opacity: "1" }}
    >
      <Box
        position="absolute"
        right="100%"
        opacity={isHomePage ? "0" : "1"}
        transform={isHomePage ? "translateX(3px)" : "none"}
        transition="all 0.2s"
      >
        <ChevronLeftIcon />
      </Box>
      <Box
        as="img"
        src={HomeLinkIcon}
        srcSet={`${HomeLinkIcon} 1x, ${HomeLinkIcon2x} 2x`}
        alt=""
        height="2em"
        width="2em"
        borderRadius="lg"
        boxShadow="md"
      />
      <Box
        height="2em"
        width="2em"
        position="absolute"
        top="0"
        left="0"
        right="0"
        bottom="0"
        borderRadius="lg"
        transition="border 0.2s"
      />
    </Box>
  );
}

function UserNavBarSection() {
  const { isLoading, isAuthenticated, loginWithRedirect, logout } = useAuth0();
  const { id, username } = useCurrentUser();

  if (isLoading) {
    return null;
  }

  if (isAuthenticated) {
    return (
      <HStack align="center" spacing="2">
        {username && (
          <Box fontSize="sm" textAlign="right">
            Hi, {username}!
          </Box>
        )}
        {id && (
          <NavButton
            as={Link}
            to={`/user/${id}/items`}
            size="sm"
            variant="outline"
          >
            Items
          </NavButton>
        )}
        <NavButton onClick={() => logout({ returnTo: window.location.origin })}>
          Log out
        </NavButton>
      </HStack>
    );
  } else {
    return <NavButton onClick={() => loginWithRedirect()}>Log in</NavButton>;
  }
}

function NavMenu() {
  const { colorMode, toggleColorMode } = useColorMode();

  return (
    <Menu>
      <MenuButton as={NavButton} icon={<HamburgerIcon />} />
      <MenuList fontSize="sm">
        <MenuItem as={Link} to="/modeling">
          Modeling
        </MenuItem>
        <MenuItem onClick={toggleColorMode}>
          {colorMode === "light" ? (
            <Box display="flex" alignItems="center">
              <Box>Dark mode</Box>
              <MoonIcon marginLeft="2" />
            </Box>
          ) : (
            <Box display="flex" alignItems="center">
              <Box>Light mode</Box>
              <SunIcon marginLeft="2" />
            </Box>
          )}
        </MenuItem>
      </MenuList>
    </Menu>
  );
}

function NavButtons() {
  const { colorMode, toggleColorMode } = useColorMode();

  return (
    <>
      <NavButton as={Link} to="/modeling">
        Modeling
      </NavButton>
      <NavButton
        size="sm"
        variant="outline"
        aria-label={
          colorMode === "light" ? "Switch to dark mode" : "Switch to light mode"
        }
        icon={colorMode === "light" ? <MoonIcon /> : <SunIcon />}
        onClick={toggleColorMode}
      />
    </>
  );
}

const NavButton = React.forwardRef(({ icon, ...props }, ref) => {
  const Component = icon ? IconButton : Button;

  // Opacity is in a separate Box, to avoid overriding the built-in Button
  // hover/focus states.
  return (
    <Box opacity="0.8" _hover={{ opacity: "1" }} _focus={{ opacity: "1" }}>
      <Component size="sm" variant="outline" icon={icon} ref={ref} {...props} />
    </Box>
  );
});

export default GlobalNavBar;