import PropTypes from 'prop-types';
import React from 'react';
import Text from '@bufferapp/components/Text';
import moment from 'moment-timezone';

import {
  MetricIcon,
  TruncatedNumber,
} from '@bufferapp/analyze-shared-components';

import { white } from '@bufferapp/components/style/color';
import styled from 'styled-components';

const Wrapper = styled.div`
  cursor: default;
  width: 240px;
  padding: 10px;
  color: ${white};
  font-size: 1rem;
  pointer-events: none;
  white-space: normal;
  box-sizing: border-box;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
`;

function transformLabelForTooltip(label) {
  return `${label.toLowerCase()}`;
}

function postsWording(profileService) {
  let wording = '';
  switch (profileService) {
    case 'twitter':
      wording = 'tweet';
      break;
    default:
      wording = 'post';
      break;
  }
  return wording;
}

const MetricEntry = ({
  metric,
}) => (
  <span
    style={{
      whiteSpace: 'nowrap',
      overflow: 'hidden',
      textOverflow: 'ellipsis',
      display: 'inline-box',
    }}
  >
    <br />
    <Text color="white" size="small" weight="bold" >
      <MetricIcon metric={{ color: metric.color }} /> <TruncatedNumber>
        {metric.value}
      </TruncatedNumber>
    </Text>
    <Text color="white" size="small" > {transformLabelForTooltip(metric.label)}</Text>
    <Text color="white" size="small" > for </Text>
    <Text color="white" size="small" weight="bold" > {metric.username} </Text>
  </span>
);

MetricEntry.propTypes = {
  metric: PropTypes.shape({
    color: PropTypes.string,
    label: PropTypes.string,
    username: PropTypes.string,
    value: PropTypes.number,
  }).isRequired,
};

const NoDataEntry = ({
  metric,
}) => (
  <span
    style={{
      whiteSpace: 'nowrap',
      overflow: 'hidden',
      textOverflow: 'ellipsis',
      display: 'inline-box',
    }}
  >
    <br />
    <Text color="white" size="small" weight="bold" >
      <MetricIcon metric={{ color: metric.color }} />
    </Text>
    <Text color="white" size="small" > No {postsWording(metric.profileService)} were published for</Text>
    <Text color="white" size="small" weight="bold" > {metric.username} </Text>
  </span>
);

NoDataEntry.propTypes = {
  metric: PropTypes.shape({
    color: PropTypes.string,
    label: PropTypes.string,
    profileService: PropTypes.string,
    username: PropTypes.string,
    value: PropTypes.number,
  }).isRequired,
};

const Header = ({
  day,
}) => (
  <span>
    <Text color="mystic" size="small" >{moment.utc(day).format('D MMMM')}</Text>
    <br />
    <br />
  </span>
);

Header.propTypes = {
  day: PropTypes.number.isRequired,
};

const ComparisonChartTooltip = ({
  day,
  metrics,
}) => (
  <Wrapper>
    <Header day={day} />
    <span>
      {metrics.map(m => (m.value === null ?
        (<NoDataEntry key={m.username} metric={m} />) :
        (<MetricEntry key={m.username} metric={m} />)
      ))}
    </span>
  </Wrapper>
);

ComparisonChartTooltip.propTypes = {
  day: PropTypes.number.isRequired,
  metrics: PropTypes.arrayOf(PropTypes.shape({
    color: PropTypes.string,
    label: PropTypes.string,
    profileService: PropTypes.string,
    username: PropTypes.string,
    value: PropTypes.number,
  })).isRequired,
};

export default ComparisonChartTooltip;
