import { useState } from 'react';
import { Button, Icon, Icons, Text, Flexbox } from 'react-basics';
import Link from 'next/link';
import Page from 'components/layout/Page';
import PageHeader from 'components/layout/PageHeader';
import WebsiteChartList from 'components/pages/websites/WebsiteChartList';
import DashboardSettingsButton from 'components/pages/dashboard/DashboardSettingsButton';
import DashboardEdit from 'components/pages/dashboard/DashboardEdit';
import EmptyPlaceholder from 'components/common/EmptyPlaceholder';
import useApi from 'hooks/useApi';
import useDashboard from 'store/dashboard';
import useMessages from 'hooks/useMessages';
import useLocale from 'hooks/useLocale';

export function Dashboard() {
  const { formatMessage, labels, messages } = useMessages();
  const dashboard = useDashboard();
  const { showCharts, limit, editing } = dashboard;
  const [max, setMax] = useState(limit);
  const { get, useQuery } = useApi();
  const { data, isLoading, error } = useQuery(['websites'], () =>
    get('/websites', { includeTeams: 1 }),
  );
  const hasData = data && data?.data.length !== 0;

  const { dir } = useLocale();

  function handleMore() {
    setMax(max + limit);
  }

  return (
    <Page loading={isLoading} error={error}>
      <PageHeader title={formatMessage(labels.dashboard)}>
        {!editing && hasData && <DashboardSettingsButton />}
      </PageHeader>
      {!hasData && (
        <EmptyPlaceholder message={formatMessage(messages.noWebsitesConfigured)}>
          <Link href="/settings/websites">
            <Button>
              <Icon rotate={dir === 'rtl' ? 180 : 0}>
                <Icons.ArrowRight />
              </Icon>
              <Text>{formatMessage(messages.goToSettings)}</Text>
            </Button>
          </Link>
        </EmptyPlaceholder>
      )}
      {hasData && (
        <>
          {editing && <DashboardEdit websites={data?.data} />}
          {!editing && (
            <WebsiteChartList websites={data?.data} showCharts={showCharts} limit={max} />
          )}
          {max < data.length && (
            <Flexbox justifyContent="center">
              <Button onClick={handleMore}>
                <Icon rotate={dir === 'rtl' ? 180 : 0}>
                  <Icons.More />
                </Icon>
                <Text>{formatMessage(labels.more)}</Text>
              </Button>
            </Flexbox>
          )}
        </>
      )}
    </Page>
  );
}

export default Dashboard;