import React from 'react';
import App, { Container } from 'next/app';
import Head from 'next/head';
import { Global } from '@emotion/core';
import { Provider as UiProvider } from 'rkta-ui';
import { createClient, Provider as ClientProvider } from '../src/client';
import protectLanguage from '../src/util/protectLanguage';
import theme from '../src/theme';

require('es6-promise').polyfill();

const apiRoot = process.env.API_ROOT;

class NextApp extends App {
  constructor(props) {
    super(props);
    const {
      language,
      pageProps: { cacheData },
    } = props;
    this.restClient = createClient({ apiRoot, initialState: cacheData, language });
  }

  static async getInitialProps({ Component, ctx, router }) {
    const pageProps = {};
    const [, rawLanguage] = router.asPath
      .split('?')
      .shift()
      .split('/');
    const language = protectLanguage(rawLanguage);
    const client = createClient({ apiRoot, language });
    const fetch = client.makeFetch();

    if (Component.getInitialProps) await Component.getInitialProps({ ...ctx, fetch });

    await fetch({ type: 'essentials', endpoint: '/api/portal/essentials/' });
    pageProps.cacheData = client.extractCacheData();
    pageProps.client = client;

    return { pageProps, language };
  }

  render() {
    const { Component, pageProps } = this.props;
    return (
      <Container>
        <UiProvider theme={theme}>
          <Global
            styles={({ colors }) => ({
              body: {
                backgroundColor: colors.paper,
                margin: 0,
                overscrollBehavior: 'none',
              },
            })}
          />
          <Head>
            <meta name="viewport" content="initial-scale=1.0, width=device-width" />
          </Head>
          <ClientProvider client={this.restClient}>
            <Component {...pageProps} />
          </ClientProvider>
        </UiProvider>
      </Container>
    );
  }
}

export default NextApp;
