import * as prettyBytes from 'pretty-bytes';
import { Box, Divider } from '@mui/material';
import { styled } from '@mui/material/styles';
import InsertLinkIcon from '@mui/icons-material/InsertLink';
import { InnerPanel, PanelHeader } from '../Panels';
import { BodyText } from '../Text';
import Decorator, { Colours } from '../Decorator';
import { DIVIDER } from '../../lib/consts/DEFAULT_THEME';

const PREFIX = 'ResourceVolumes';

const classes = {
  connection: `${PREFIX}-connection`,
  bar: `${PREFIX}-bar`,
  header: `${PREFIX}-header`,
  label: `${PREFIX}-label`,
  decoratorBox: `${PREFIX}-decoratorBox`,
  divider: `${PREFIX}-divider`,
};

const StyledBox = styled(Box)(({ theme }) => ({
  overflow: 'auto',
  height: '100%',
  paddingLeft: '.3em',
  [theme.breakpoints.down('md')]: {
    overflow: 'hidden',
  },

  [`& .${classes.connection}`]: {
    paddingLeft: '.7em',
    paddingRight: '.7em',
    paddingTop: '1em',
    paddingBottom: '.7em',
  },

  [`& .${classes.bar}`]: {
    paddingLeft: '.7em',
    paddingRight: '.7em',
  },

  [`& .${classes.header}`]: {
    paddingTop: '.3em',
    paddingRight: '.7em',
  },

  [`& .${classes.label}`]: {
    paddingTop: '.3em',
  },

  [`& .${classes.decoratorBox}`]: {
    paddingRight: '.3em',
  },

  [`& .${classes.divider}`]: {
    backgroundColor: DIVIDER,
  },
}));

const selectDecorator = (state: string): Colours => {
  switch (state) {
    case 'connected':
      return 'ok';
    case 'connecting':
      return 'warning';
    default:
      return 'error';
  }
};

const ResourceVolumes = ({
  resource,
}: {
  resource: AnvilReplicatedStorage;
}): JSX.Element => {
  return (
    <StyledBox>
      {resource &&
        resource.volumes.map((volume) => {
          return (
            <InnerPanel key={volume.drbd_device_minor}>
              <PanelHeader>
                <Box display="flex" width="100%" className={classes.header}>
                  <Box flexGrow={1}>
                    <BodyText text={`Volume: ${volume.number}`} />
                  </Box>
                  <Box>
                    <BodyText
                      text={`Size: ${prettyBytes.default(volume.size, {
                        binary: true,
                      })}`}
                    />
                  </Box>
                </Box>
              </PanelHeader>
              {volume.connections.map(
                (connection, index): JSX.Element => {
                  return (
                    <>
                      <Box
                        key={connection.fencing}
                        display="flex"
                        width="100%"
                        className={classes.connection}
                      >
                        <Box className={classes.decoratorBox}>
                          <Decorator
                            colour={selectDecorator(
                              connection.connection_state,
                            )}
                          />
                        </Box>
                        <Box>
                          <Box display="flex" width="100%">
                            <BodyText
                              text={connection.targets[0].target_name}
                            />
                            <InsertLinkIcon style={{ color: DIVIDER }} />
                            <BodyText
                              text={connection.targets[1].target_name}
                            />
                          </Box>
                          <Box
                            display="flex"
                            justifyContent="center"
                            width="100%"
                          >
                            <BodyText text={connection.connection_state} />
                          </Box>
                        </Box>
                      </Box>
                      {volume.connections.length - 1 !== index ? (
                        <Divider className={classes.divider} />
                      ) : null}
                    </>
                  );
                },
              )}
            </InnerPanel>
          );
        })}
    </StyledBox>
  );
};

export default ResourceVolumes;
