/*
 * Copyright (C) 2022 Savoir-faire Linux Inc.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation; either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public
 * License along with this program.  If not, see
 * <https://www.gnu.org/licenses/>.
 */
import { Box, Grid, Paper, useMediaQuery } from '@mui/material';
import { Theme, useTheme } from '@mui/material/styles';
import React from 'react';
import { Navigate } from 'react-router-dom';

import { getAccessToken } from '../utils/auth';
import JamiWelcomeLogo from './JamiWelcomeLogo';

export default function withAuthUI(WrappedComponent: React.FunctionComponent): React.FunctionComponent {
  return function WithAuthUI() {
    const borderRadius = 30;

    const theme: Theme = useTheme();

    const isDesktopOrLaptop: boolean = useMediaQuery(theme.breakpoints.up('md'));
    const isMobile: boolean = useMediaQuery(theme.breakpoints.only('xs'));

    const accessToken = getAccessToken();

    if (accessToken) {
      return <Navigate to="/conversation" replace />;
    }
    return (
      <Box
        sx={{
          width: '100%',
          height: '100%',
          display: 'flex',
          backgroundColor: `${isDesktopOrLaptop ? theme.palette.primary.dark : 'white'}`,
        }}
      >
        <Paper
          elevation={10}
          sx={{
            width: '100%',
            backgroundColor: 'white',
            margin: `${isDesktopOrLaptop ? theme.typography.pxToRem(100) : 0}`,
            borderRadius: `${isDesktopOrLaptop ? theme.typography.pxToRem(borderRadius) : 0}`,
          }}
        >
          <Grid container spacing={0} sx={{ height: '100%' }}>
            {!isMobile && (
              <Grid
                item
                xs={6}
                id="logo"
                sx={{
                  height: '100%',
                  backgroundColor: theme.palette.secondary.main,
                  borderRadius: `${
                    isDesktopOrLaptop
                      ? `${theme.typography.pxToRem(borderRadius)} 0 0 ${theme.typography.pxToRem(borderRadius)}`
                      : 0
                  }`, // To follow paper border-radius
                }}
              >
                <JamiWelcomeLogo logoWidth="90%" sx={{ height: '100%' }} />
              </Grid>
            )}
            <Grid item xs={isMobile ? 12 : 6} sx={{ height: '100%' }}>
              {isMobile && (
                <JamiWelcomeLogo
                  logoWidth={theme.typography.pxToRem(100)}
                  logoHeight={theme.typography.pxToRem(100)}
                  sx={{ mt: theme.typography.pxToRem(30), mb: theme.typography.pxToRem(20) }}
                />
              )}
              <Box sx={{ height: `${isMobile ? 'auto' : '100%'}` }}>
                <WrappedComponent />
              </Box>
            </Grid>
          </Grid>
        </Paper>
      </Box>
    );
  };
}
