import { useId } from 'react';
import PropTypes from 'prop-types';
import { styled } from '@mui/material/styles';
import Typography from '@mui/material/Typography';
import Link from '@mui/material/Link';
import classNames from 'classnames';
import { useTranslation } from 'react-i18next';
import CollapsibleSection from '../containers/CollapsibleSection';
import ns from '../config/css-ns';
import { PluginHook } from './PluginHook';

const StyledDl = styled('dl')(({ theme }) => ({
  '& dd': {
    marginBottom: '.5em',
    marginLeft: '0',
  },
}));

/**
 * ManifestRelatedLinks
 */
export function ManifestRelatedLinks({
  homepage = null,
  manifestUrl = null,
  related = null,
  renderings = null,
  seeAlso = null,
  ...rest
}) {
  const { t } = useTranslation();
  const id = useId();
  const titleId = useId();

  const pluginProps = {
    homepage, manifestUrl, related, renderings, seeAlso, t, ...rest,
  };

  return (
    <CollapsibleSection
      aria-labelledby={titleId}
      id={id}
      label={t('related')}
    >
      <Typography
        aria-labelledby={`${id} ${titleId}`}
        id={titleId}
        variant="h4"
        component="h5"
      >
        {t('links')}
      </Typography>
      <StyledDl className={classNames(ns('label-value-metadata'))}>
        { homepage && (
          <>
            <Typography variant="subtitle2" component="dt">{t('iiif_homepage')}</Typography>
            {
              homepage.map(page => (
                <Typography key={page.value} variant="body1" component="dd">
                  <Link target="_blank" rel="noopener noreferrer" href={page.value}>
                    {page.label || page.value}
                  </Link>
                </Typography>
              ))
            }
          </>
        )}
        { renderings && renderings.length > 0 && (
          <>
            <Typography variant="subtitle2" component="dt">{t('iiif_renderings')}</Typography>
            {
              renderings.map(rendering => (
                <Typography key={rendering.value} variant="body1" component="dd">
                  <Link target="_blank" rel="noopener noreferrer" href={rendering.value}>
                    {rendering.label || rendering.value}
                  </Link>
                </Typography>
              ))
            }
          </>
        )}
        { related && (
          <>
            <Typography variant="subtitle2" component="dt">{t('iiif_related')}</Typography>
            {
              related.map(relatedItem => (
                <Typography key={relatedItem.value} variant="body1" component="dd">
                  <Link target="_blank" rel="noopener noreferrer" href={relatedItem.value}>
                    {relatedItem.label || relatedItem.value}
                  </Link>
                  { relatedItem.format && (
                    <Typography component="span">{` (${relatedItem.format})`}</Typography>
                  )}
                </Typography>
              ))
            }
          </>
        )}
        { seeAlso && (
          <>
            <Typography variant="subtitle2" component="dt">{t('iiif_seeAlso')}</Typography>
            {
              seeAlso.map(seeAlsoItem => (
                <Typography key={seeAlsoItem.value} variant="body1" component="dd">
                  <Link target="_blank" rel="noopener noreferrer" href={seeAlsoItem.value}>
                    {seeAlsoItem.label || seeAlsoItem.value}
                  </Link>
                  { seeAlsoItem.format && (
                    <Typography component="span">{` (${seeAlsoItem.format})`}</Typography>
                  )}
                </Typography>
              ))
            }
          </>
        )}
        { manifestUrl && (
          <>
            <Typography variant="subtitle2" component="dt">{t('iiif_manifest')}</Typography>
            <Typography variant="body1" component="dd">
              <Link target="_blank" rel="noopener noreferrer" href={manifestUrl}>
                {manifestUrl}
              </Link>
            </Typography>
          </>
        )}
      </StyledDl>
      <PluginHook targetName="ManifestRelatedLinks" {...pluginProps} />
    </CollapsibleSection>
  );
}

ManifestRelatedLinks.propTypes = {
  homepage: PropTypes.arrayOf(PropTypes.shape({
    label: PropTypes.string,
    value: PropTypes.string,
  })),
  manifestUrl: PropTypes.string,
  related: PropTypes.arrayOf(PropTypes.shape({
    format: PropTypes.string,
    label: PropTypes.string,
    value: PropTypes.string,
  })),
  renderings: PropTypes.arrayOf(PropTypes.shape({
    label: PropTypes.string,
    value: PropTypes.string,
  })),
  seeAlso: PropTypes.arrayOf(PropTypes.shape({
    format: PropTypes.string,
    label: PropTypes.string,
    value: PropTypes.string,
  })),
};
