import React from 'react';
import PropTypes from 'prop-types';
import { storiesOf } from '@storybook/react';
import { checkA11y } from 'storybook-addon-a11y';
import {
  geyser,
} from '@bufferapp/components/style/color';
import GridItem from './index';
import ChartTooltip from './components/ChartTooltip';
import mockDaily7days from './mock/daily7days';
import mockDaily30days from './mock/daily30days';
import mockDaily90days from './mock/daily90days';
import dayjs from 'dayjs';
import utc from 'dayjs/plugin/utc';
import dayTimezone from 'dayjs/plugin/timezone';

dayjs.extend(utc);
dayjs.extend(dayTimezone);

const dayTimestamp = dayjs.utc(Number(mockDaily7days[0].day)).startOf('day').valueOf();

storiesOf('GridItem')
  .addDecorator(checkA11y)
  .add('should render a summary grid item with positive diff', () => (
    <ul
      style={{
        display: 'flex',
        flexWrap: 'wrap',
        padding: '0',
        margin: '0 auto',
        borderTop: `solid 1px ${geyser}`,
        borderLeft: `solid 1px ${geyser}`,
        borderRadius: '2px',
      }}
    >
      <GridItem
        metric={{
          label: 'Tweets',
          value: 150,
          diff: 50
        }}
      />
    </ul>
  ))
  .add('should render a standalone item', () => (
    <div
      style={{
        display: 'flex',
        flexWrap: 'wrap',
        padding: '0',
        margin: '0 auto',
        borderTop: `solid 1px ${geyser}`,
        borderLeft: `solid 1px ${geyser}`,
        borderRadius: '2px',
      }}
    >
      <GridItem
        metric={{
          label: 'Tweets',
          value: 150,
          diff: 50,
        }}
        standalone
      />
    </div>
  ))
  .add('should render a summary grid item with percent sign', () => (
    <ul
      style={{
        display: 'flex',
        flexWrap: 'wrap',
        padding: '0',
        margin: '0 auto',
        borderTop: `solid 1px ${geyser}`,
        borderLeft: `solid 1px ${geyser}`,
        borderRadius: '2px',
      }}
    >
      <GridItem
        metric={{
          label: 'Engagement Rate',
          value: 20,
          diff: 10,
        }}
        showPercentSign
      />
    </ul>
  ))
  .add('percentage sign show decimals if < 10', () => (
    <ul
      style={{
        display: 'flex',
        flexWrap: 'wrap',
        padding: '0',
        margin: '0 auto',
        borderTop: `solid 1px ${geyser}`,
        borderLeft: `solid 1px ${geyser}`,
        borderRadius: '2px',
      }}
    >
      <GridItem
        metric={{
          label: 'Engagement Rate',
          value: 9.65,
          diff: 10,
        }}
        showPercentSign
      />
    </ul>
  ))
  .add('should render 2 digits in the grid item', () => (
    <ul
      style={{
        display: 'flex',
        flexWrap: 'wrap',
        padding: '0',
        margin: '0 auto',
        borderTop: `solid 1px ${geyser}`,
        borderLeft: `solid 1px ${geyser}`,
        borderRadius: '2px',
      }}
    >
      <GridItem
        metric={{
          label: 'Engagement Rate',
          value: 0.04,
          diff: 10,
        }}
        showPercentSign
      />
    </ul>
  ))
  .add('should render 2 digits in the grid item when the percent sign is true', () => (
    <ul
      style={{
        display: 'flex',
        flexWrap: 'wrap',
        padding: '0',
        margin: '0 auto',
        borderTop: `solid 1px ${geyser}`,
        borderLeft: `solid 1px ${geyser}`,
        borderRadius: '2px',
      }}
    >
      <GridItem
        metric={{
          label: 'Engagement Rate',
          value: 0.69,
          diff: 10,
        }}
        showPercentSign
      />
    </ul>
  ))
  .add('should not render the diff when the metric has a neutral diff', () => (
    <ul
      style={{
        display: 'flex',
        flexWrap: 'wrap',
        padding: '0',
        margin: '0 auto',
        borderTop: `solid 1px ${geyser}`,
        borderLeft: `solid 1px ${geyser}`,
        borderRadius: '2px',
      }}
    >
      <GridItem
        metric={{
          label: 'Tweets',
          value: 0,
          diff: 0,
        }}
      />
    </ul>
  ))
  .add('should render a summary grid item with only arrow icon', () => (
    <ul
      style={{
        display: 'flex',
        flexWrap: 'wrap',
        padding: '0',
        margin: '0 auto',
        borderTop: `solid 1px ${geyser}`,
        borderLeft: `solid 1px ${geyser}`,
        borderRadius: '2px',
      }}
    >
      <GridItem
        metric={{
          label: 'Tweets',
          value: 10,
          diff: -60,
        }}
        hideDiff
        showArrowIcon
      />
    </ul>
  ))
  .add('should not render arrow icon when diff is also visible', () => (
    <ul
      style={{
        display: 'flex',
        flexWrap: 'wrap',
        padding: '0',
        margin: '0 auto',
        borderTop: `solid 1px ${geyser}`,
        borderLeft: `solid 1px ${geyser}`,
        borderRadius: '2px',
      }}
    >
      <GridItem
        metric={{
          label: 'Tweets',
          value: 10,
          diff: 60,
        }}
        showArrowIcon
      />
    </ul>
  ))
  .add('should render a summary grid item with negative diff', () => (
    <ul
      style={{
        display: 'flex',
        flexWrap: 'wrap',
        padding: '0',
        margin: '0 auto',
        borderTop: `solid 1px ${geyser}`,
        borderLeft: `solid 1px ${geyser}`,
        borderRadius: '2px',
      }}
    >
      <GridItem
        metric={{
          label: 'Tweets',
          value: 10,
          diff: -60,
        }}
      />
    </ul>
  ))
  .add('should render a summary grid item with no diff', () => (
    <ul
      style={{
        display: 'flex',
        flexWrap: 'wrap',
        padding: '0',
        margin: '0 auto',
        borderTop: `solid 1px ${geyser}`,
        borderLeft: `solid 1px ${geyser}`,
        borderRadius: '2px',
      }}
    >
      <GridItem
        metric={{
          label: 'Tweets',
          value: 10,
          diff: -60,
        }}
        hideDiff
      />
    </ul>
  ))
  .add('should render a grid item with a custom Label', () => {
    const CustomLabel = ({ labelCopy }) => (
      <span>{labelCopy}</span>
    );
    CustomLabel.propTypes = {
      labelCopy: PropTypes.string.isRequired,
    };
    return (<ul
      style={{
        display: 'flex',
        flexWrap: 'wrap',
        padding: '0',
        margin: '0 auto',
        borderTop: `solid 1px ${geyser}`,
        borderLeft: `solid 1px ${geyser}`,
        borderRadius: '2px',
      }}
    >
      <GridItem
        metric={{
          label: 'Tweets',
          value: 10,
          diff: -60,
          color: '#cccccc',
        }}
        customLabel={<CustomLabel labelCopy="This is a custom label" />}
      />
    </ul>);
  })
  .add('should render a grid item with a 7 day chart if 7 days worth of dailyData is provided', () => (
    <ul
      style={{
        display: 'flex',
        flexWrap: 'wrap',
        padding: '0',
        margin: '0 auto',
        borderTop: `solid 1px ${geyser}`,
        borderLeft: `solid 1px ${geyser}`,
        borderRadius: '2px',
      }}
    >
      <GridItem
        metric={{
          label: 'Engagement average',
          value: 42,
          diff: 60,
        }}
        timezone="America/Los_Angeles"
        dailyData={mockDaily7days}
      />
    </ul>
  ))
  .add('should render a grid item with a 30 day chart if 30 days worth of dailyData is provided', () => (
    <ul
      style={{
        display: 'flex',
        flexWrap: 'wrap',
        padding: '0',
        margin: '0 auto',
        borderTop: `solid 1px ${geyser}`,
        borderLeft: `solid 1px ${geyser}`,
        borderRadius: '2px',
      }}
    >
      <GridItem
        metric={{
          label: 'Engagement average',
          value: 502,
          diff: -40,
        }}
        timezone="America/Los_Angeles"
        dailyData={mockDaily30days}
      />
    </ul>
  ))
  .add('should render a grid item with a 90 day chart if 90 days worth of dailyData is provided', () => (
    <ul
      style={{
        display: 'flex',
        flexWrap: 'wrap',
        padding: '0',
        margin: '0 auto',
        borderTop: `solid 1px ${geyser}`,
        borderLeft: `solid 1px ${geyser}`,
        borderRadius: '2px',
      }}
    >
      <GridItem
        metric={{
          label: 'Engagement average',
          value: 948,
          diff: 12,
        }}
        timezone="America/Los_Angeles"
        dailyData={mockDaily90days}
      />
    </ul>
  ))
  .add('should not render the chart if we have only one day of data', () => (
    <ul
      style={{
        display: 'flex',
        flexWrap: 'wrap',
        padding: '0',
        margin: '0 auto',
        borderTop: `solid 1px ${geyser}`,
        borderLeft: `solid 1px ${geyser}`,
        borderRadius: '2px',
      }}
    >
      <GridItem
        metric={{
          label: 'Engagement average',
          value: 42,
          diff: 60,
        }}
        dailyData={[mockDaily7days[0]]}
      />
    </ul>
  ))
  .add('Should render the chart tolltip', () => (
    <div style={{background: 'black'}}>
    <ChartTooltip
      point={{
        label: 'Engagement average',
        x: dayTimestamp,
        y: 42,
      }}
      dailyData={mockDaily7days}
    />
    </div>
  ))
  .add('should render a no data tolltip', () => (
    <ChartTooltip
      point={{
        label: '',
        x: dayTimestamp,
        y: 0,
      }}
      dailyData={mockDaily7days}
    />
  ))
  .add('should render a grid item with a 7 day chart of type column', () => (
    <ul
      style={{
        display: 'flex',
        flexWrap: 'wrap',
        padding: '0',
        margin: '0 auto',
        borderTop: `solid 1px ${geyser}`,
        borderLeft: `solid 1px ${geyser}`,
        borderRadius: '2px',
      }}
    >
      <GridItem
        metric={{
          label: 'Engagement average',
          value: 42,
          diff: 60,
        }}
        timezone="America/Los_Angeles"
        dailyData={mockDaily7days}
        chartType={'column'}
      />
    </ul>
  ))
  .add('should render a grid item with a 7 day chart of type areaspline', () => (
    <ul
      style={{
        display: 'flex',
        flexWrap: 'wrap',
        padding: '0',
        margin: '0 auto',
        borderTop: `solid 1px ${geyser}`,
        borderLeft: `solid 1px ${geyser}`,
        borderRadius: '2px',
      }}
    >
      <GridItem
        metric={{
          label: 'Engagement average',
          value: 42,
          diff: 60,
        }}
        timezone="America/Los_Angeles"
        dailyData={mockDaily7days}
        chartType={'areaspline'}
      />
    </ul>
  ))
  .add('should render a grid item with a 7 day chart of type areaspline, controlling minmax', () => (
    <ul
      style={{
        display: 'flex',
        flexWrap: 'wrap',
        padding: '0',
        margin: '0 auto',
        borderTop: `solid 1px ${geyser}`,
        borderLeft: `solid 1px ${geyser}`,
        borderRadius: '2px',
      }}
    >
      <GridItem
        metric={{
          label: 'Engagement average',
          value: 42,
          diff: 60,
        }}
        timezone="America/Los_Angeles"
        dailyData={mockDaily7days}
        chartType={'areaspline'}
        controlMinMax
      />
    </ul>
  ))
  .add('should render a value with currency', () => (
    <ul
      style={{
        display: 'flex',
        flexWrap: 'wrap',
        padding: '0',
        margin: '0 auto',
        borderTop: `solid 1px ${geyser}`,
        borderLeft: `solid 1px ${geyser}`,
        borderRadius: '2px',
      }}
    >
      <GridItem
        metric={{
          label: 'Engagement average',
          value: 42,
          currency: 'usd',
        }}
      />
    </ul>
  ))
  .add('should render a summary grid item with percentage bar when paid metric is above 0', () => (
    <ul
      style={{
        display: 'flex',
        flexWrap: 'wrap',
        padding: '0',
        margin: '0 auto',
        borderTop: `solid 1px ${geyser}`,
        borderLeft: `solid 1px ${geyser}`,
        borderRadius: '2px',
        width: '300px',
      }}
    >
      <GridItem
        metric={{
          label: 'Tweets',
          value: 100,
          diff: 50,
          paid: 50
        }}
      />
    </ul>
  ))
  .add('should render a summary grid item without the percentage bar when paid metric is 0', () => (
    <ul
      style={{
        display: 'flex',
        flexWrap: 'wrap',
        padding: '0',
        margin: '0 auto',
        borderTop: `solid 1px ${geyser}`,
        borderLeft: `solid 1px ${geyser}`,
        borderRadius: '2px',
        width: '300px',
      }}
    >
      <GridItem
        metric={{
          label: 'Tweets',
          value: 150,
          diff: 50,
          paid: 0
        }}
      />
    </ul>
  ));
