// @flow
import React, { useState } from 'react';
import styled from 'styled-components';
import { useCookies } from 'react-cookie';

import languages from './languages';
import { imagesAssetsBaseUrl } from '../../../Theme/Vars';
import type {
  Translations,
} from '../../../types';
import languageSwitcherTranslationText
  from './helpers/languageSwitcherTranslationText';
import getHrefPrefix from './helpers/getHrefPrefix';
import RotatingChevron from '../RotatingChevron/RotatingChevron';
import ApoliticalBrand from '../../../Theme/ApoliticalBrand';

type Props = {|
  postHasParent: boolean,
  humanTranslation: ?string,
  language: string,
  translations: Translations,
  slugPrefix: string,
  languagePrefix: string,
|}

const MobileLanguageSwitcherWrapper = styled.div`
  display: block;
  margin-top: 40px;

  @media ${ApoliticalBrand.breakpoint.onlyScreen.tablet} {
    display: none;
  }
`;

const LanguageSwitcherWrapper = styled.div`
  position: relative;
  width: 100%;
`;

const LanguageSwitcherSubWrapper = styled.div`
  position: relative;
  display: flex;
  flex-direction: column;
`;

const LanguageSwitcherTrigger = styled.div`
  position: relative;
  display: flex;
  align-items: center;
  justify-content: space-between;
  line-height: 60px;
  padding: 0 22px;
  height: 40px;
  cursor: pointer;
  background: url("${imagesAssetsBaseUrl}/signup/languages/translate-teal.png")
    10px no-repeat;
  background-size: 20px;
  background-color: ${ApoliticalBrand.color.gray};
`;

const LanguageSwitcherOptions = styled.div`
  position: absolute;
  display: block;
  top: 100%;
  left: 0;
  right: 0;
  border-top: 0;
  background: ${ApoliticalBrand.color.white};
  transition: all 0.5s;
  border-radius: 3px;
  box-shadow: 0 2px 10px 0 rgba(0, 0, 0, 0.1);
  margin-top: 5px;
  z-index: 1;
`;

const LanguageSelected = styled.span`
  padding-left: 20px;
  text-transform: uppercase;
  color: ${ApoliticalBrand.color.charcoal};
  letter-spacing: 1.57px;
  font-size: 1.3rem;
  font-weight: 500;
`;

const LanguageOption = styled.a`
  position: relative;
  display: block;
  padding: 16px 0px 16px 42px;
  cursor: pointer;
  transition: all 0.5s;
  letter-spacing: 1.57px;
  font-size: 1.3rem;
  font-weight: 500;
  text-transform: uppercase;
  text-decoration: none;
  color: ${ApoliticalBrand.color.charcoal};

  svg {
    padding-right: 15px;
  }
`;

const LanguageOptionExtra = styled.span`
  width: 110px;
  height: 15px;
  font-size: 12px;
  font-weight: normal;
  font-stretch: normal;
  font-style: italic;
  margin-left: 5px;
  text-transform: lowercase;
  letter-spacing: normal;
  color: ${ApoliticalBrand.color.gunmetal}
`;

const LanguageTranslatedByDisclaimer = styled.p`
  margin-top: 0.8rem;
  font-size: 1.2rem;
  line-height: normal;
`;

const LanguageTranslatedByDisclaimerMailto = styled.a`
  text-decoration: none;
  color: ${ApoliticalBrand.color.purple};

  &:hover {
    text-decoration: underline;
  }
`;

const MobileLanguageSwitcher = ({
  postHasParent, humanTranslation, language, translations, slugPrefix, languagePrefix,
}: Props) => {
  const [openOptions, setOpenOptions] = useState(false);

  // The reason for the eslint-disable-line below is because useCookies has to have all 3 functions
  // imported together however only removeCookie is needed here
  const [cookies, setCookie, removeCookie] = useCookies(['article-viewed']); // eslint-disable-line

  const langTranslatedBy = languageSwitcherTranslationText(
    postHasParent,
    language,
    humanTranslation,
  );

  const isMachineTranslation = !postHasParent && !humanTranslation;
  const conciergeEmail = 'concierge@apolitical.co';

  const handleLanguageSwitch = (e) => {
    e.stopPropagation();
    removeCookie('article-viewed', { path: '/' });
    e.cancelBubble = true;
    setOpenOptions(false);
  };

  return (
    <MobileLanguageSwitcherWrapper>
      <LanguageSwitcherWrapper onClick={() => setOpenOptions(!openOptions)}>
        <LanguageSwitcherSubWrapper>
          <LanguageSwitcherTrigger>
            <LanguageSelected>
              {languages[language].name}
              <LanguageOptionExtra>{langTranslatedBy}</LanguageOptionExtra>
            </LanguageSelected>
            <RotatingChevron openOptions={openOptions} />
          </LanguageSwitcherTrigger>
          {openOptions && (
            <LanguageSwitcherOptions>
              {Object.keys(translations).map((translation) => {
                if (translations[translation] !== null
                  && translations[translation] !== language
                  && translations[translation].post_name
                ) {
                  const hrefPrefix = getHrefPrefix(translation, languagePrefix, slugPrefix);
                  return (
                    <LanguageOption
                      key={languages[translation].name}
                      onClick={(e) => handleLanguageSwitch(e)}
                      href={`${hrefPrefix}/${String(translations[translation].post_name)}`}
                    >
                      <span>{languages[translation].name}</span>
                    </LanguageOption>
                  );
                }
                return <></>;
              })}
            </LanguageSwitcherOptions>
          )}
        </LanguageSwitcherSubWrapper>
      </LanguageSwitcherWrapper>
      {isMachineTranslation && (
        <LanguageTranslatedByDisclaimer>
          {languages[language].disclaimer}
          <LanguageTranslatedByDisclaimerMailto href={`mailto:${conciergeEmail}`}>
            {conciergeEmail}
          </LanguageTranslatedByDisclaimerMailto>
          .
        </LanguageTranslatedByDisclaimer>
      )}
    </MobileLanguageSwitcherWrapper>
  );
};

export default MobileLanguageSwitcher;
