import React, { useState, useRef } from 'react';
import ReactDOM from 'react-dom';

import { makeStyles, TextField, Button } from '@material-ui/core';

import {
  Benzin,
  Header,
  Window,
  Markdown,
  ContentSection,
} from './lib';

import icon from './assets/icon.svg';

interface RenderPropTypes {
  index: number;
  style: React.CSSProperties;
}


const useStyles = makeStyles(theme => ({
  window: {
    padding: theme.spacing(4),
  },
  promoButton: {
    display: 'flex',
    justifyContent: 'center',
    marginTop: theme.spacing(4),
  },
}));


const Icon = <img src={icon} width="32px" height="37px" alt="logo" />;

const headerContents = {
  home: null,
  spacevim: null,
  'material-ui': null,
  custom: null,
  'live preview': null,
};

const pageMap: Record<string, string> = {
  home: 'https://raw.githubusercontent.com/eug-vs/react-benzin/develop/README.md',
  spacevim: 'https://raw.githubusercontent.com/spacevim/spacevim/master/README.md',
  'material-ui': 'https://raw.githubusercontent.com/mui-org/material-ui/master/README.md',
};


const CustomPage: React.FC = () => {
  const [url, setUrl] = useState<string>('');
  const inputEl = useRef<HTMLInputElement>(null);

  const handleParseUrl = (): void => {
    setUrl(inputEl.current?.value || '');
  };

  return (
    <>
      <ContentSection sectionName="Render custom markdown document" level={2}>
        <p>
          This should be a link to a valid markdown file. Response should give the file contents.
          If you copy README file from GitHub, make sure you provide link to raw view.
        </p>
        <p>
          <TextField
            fullWidth
            inputRef={inputEl}
            variant="outlined"
            color="secondary"
            label="Markdown url"
          />
        </p>
        <Button variant="contained" color="secondary" onClick={handleParseUrl}>
          Render!
        </Button>
      </ContentSection>
      <Markdown url={url} />
    </>
  );
};

interface LivePropTypes {
  setLivePreviewData: (livePreviewData: string) => void;
}

const LivePreviewPage: React.FC<LivePropTypes> = ({ setLivePreviewData }) => {
  const inputEl = useRef<HTMLInputElement>(null);

  const handleRender = (): void => {
    setLivePreviewData(inputEl.current?.value || '');
  };

  return (
    <>
      <ContentSection sectionName="Markdown live preview" level={2}>
        <p>
          Start typing and see your text rendered on the left window!
          We recommend starting with # Header.
        </p>
        <p>
          <TextField
            fullWidth
            multiline
            inputRef={inputEl}
            variant="outlined"
            color="primary"
            label="Markdown"
            onChange={handleRender}
          />
        </p>
      </ContentSection>
    </>
  );
};


const App: React.FC = () => {
  const classes = useStyles();
  const [page, setPage] = useState<string>('home');
  const [livePreviewData, setLivePreviewData] = useState<string>('');

  const handleGoLivePreview = (): void => {
    setPage('live preview');
  };

  const url = pageMap[page];
  const fileName = url?.slice(url.lastIndexOf('/') + 1);
  const info = [
    /* eslint-disable max-len */
    `## Markdown\n [Markdown file](${url}) *(...${fileName})* that you can see on the left was parsed and rendered by **BENZIN**! :rocket:`,
    'Switch between tabs on the header to explore other markdown templates. :recycle: ',
    'Currently **only core features** of markdown function.',
    'Templates on the left are being loaded from the [GitHub](https://github.com), though this pane is generated from plaintext. :pen:',
    '## How do I use this feature?',
    '```',
    'import Markdown from \'react-benzin\';',
    'const data = \'# Header\\nHello, *world!*\';',
    'ReactDOM.render(<Markdown data={data}/>, document.getElementById(\'root\'));',
    '```',
    /* eslint-enable max-len */
  ].join('\n');

  let primaryWindowContent = <Markdown url={url} />;
  if (page === 'custom') primaryWindowContent = <CustomPage />;
  else if (page === 'live preview') {
    primaryWindowContent = <Markdown data={livePreviewData || '# Start typing in the right window!'} />;
  }

  return (
    <Benzin>
      <Header
        logo={{
          icon: Icon,
          title: 'BENZIN',
        }}
        contents={headerContents}
        page={page}
        setPage={setPage}
      />
      <Window type="primary">
        <div className={classes.window}>{primaryWindowContent}</div>
      </Window>
      <Window type="secondary" name="Feature preview">
        <div className={classes.window}>
          {
            (page === 'live preview')
              ? <LivePreviewPage setLivePreviewData={setLivePreviewData} />
              : (
                <>
                  <Markdown data={info} />
                  <p className={classes.promoButton}>
                    <Button
                      variant="contained"
                      color="primary"
                      size="large"
                      onClick={handleGoLivePreview}
                    >
                      Try it yourself!
                    </Button>
                  </p>
                </>
              )
          }
        </div>
      </Window>
    </Benzin>
  );
};


ReactDOM.render(<App />, document.getElementById('root'));