import {HTMLAttributes} from 'react';
import styled from '@emotion/styled';
import {AnimationControls, motion} from 'framer-motion';

import testableTransition from 'sentry/utils/testableTransition';

type Props = {
  animateVariant: AnimationControls;
} & HTMLAttributes<HTMLDivElement>;

const PageCorners = ({animateVariant, ...rest}: Props) => (
  <Container {...rest}>
    <TopRight
      key="tr"
      width="874"
      height="203"
      viewBox="0 0 874 203"
      fill="none"
      xmlns="http://www.w3.org/2000/svg"
      animate={animateVariant}
    >
      <path
        d="M36.5 0H874v203l-288.7-10-7-114-180.2-4.8-3.6-35.2-351.1 2.5L36.5 0z"
        fill="currentColor"
      />
      <path
        d="M535.5 111.5v-22l31.8 1 .7 21.5-32.5-.5zM4 43.5L0 21.6 28.5 18l4.2 24.7-28.7.8z"
        fill="currentColor"
      />
    </TopRight>
    <BottomLeft
      key="bl"
      width="494"
      height="141"
      viewBox="0 0 494 141"
      fill="none"
      xmlns="http://www.w3.org/2000/svg"
      animate={animateVariant}
    >
      <path d="M494 141H-1V7l140-7v19h33l5 82 308 4 9 36z" fill="currentColor" />
      <path d="M219 88h-30l-1-19 31 3v16z" fill="currentColor" />
    </BottomLeft>
    <TopLeft
      key="tl"
      width="414"
      height="118"
      fill="none"
      xmlns="http://www.w3.org/2000/svg"
      animate={animateVariant}
    >
      <path
        fillRule="evenodd"
        clipRule="evenodd"
        d="M414 0H0v102h144l5-69 257-3 8-30zM0 112v-10h117v16L0 112z"
        fill="currentColor"
      />
      <path d="M184 44h-25l-1 16 26-2V44z" fill="currentColor" />
    </TopLeft>
    <BottomRight
      key="br"
      width="650"
      height="151"
      fill="none"
      xmlns="http://www.w3.org/2000/svg"
      animate={animateVariant}
    >
      <path
        fillRule="evenodd"
        clipRule="evenodd"
        d="M27 151h623V0L435 7l-5 85-134 4-3 26-261-2-5 31z"
        fill="currentColor"
      />
      <path d="M398 68v16h24l1-16h-25zM3 119l-3 16 21 3 3-19H3z" fill="currentColor" />
    </BottomRight>
  </Container>
);

export default PageCorners;

const transition = testableTransition({
  type: 'spring',
  duration: 0.8,
});

const TopLeft = styled(motion.svg)`
  position: absolute;
  top: 0;
  left: 0;
`;

TopLeft.defaultProps = {
  initial: {x: '-40px', opacity: 0, originX: 0, originY: 0, scale: 'var(--corner-scale)'},
  variants: {
    none: {x: '-40px', opacity: 0},
    'top-right': {x: '-40px', opacity: 0},
    'top-left': {x: 0, opacity: 1},
  },
  transition,
};

const TopRight = styled(motion.svg)`
  position: absolute;
  top: 0;
  right: 0;
`;

TopRight.defaultProps = {
  initial: {
    x: '40px',
    opacity: 0,
    originX: '100%',
    originY: 0,
    scale: 'var(--corner-scale)',
  },
  variants: {
    none: {x: '40px', opacity: 0},
    'top-left': {x: '40px', opacity: 0},
    'top-right': {x: 0, opacity: 1},
  },
  transition,
};

const BottomLeft = styled(motion.svg)`
  position: absolute;
  bottom: 0;
  left: 0;
`;

BottomLeft.defaultProps = {
  initial: {
    x: '-40px',
    opacity: 0,
    originX: 0,
    originY: '100%',
    scale: 'var(--corner-scale)',
  },
  variants: {
    none: {x: '-40px', opacity: 0},
    'top-left': {x: '-40px', opacity: 0},
    'top-right': {x: 0, opacity: 1},
  },
  transition,
};

const BottomRight = styled(motion.svg)`
  position: absolute;
  bottom: 0;
  right: 0;
`;

BottomRight.defaultProps = {
  initial: {
    x: '40px',
    opacity: 0,
    originX: '100%',
    originY: '100%',
    scale: 'var(--corner-scale)',
  },
  variants: {
    none: {x: '40px', opacity: 0},
    'top-right': {x: '40px', opacity: 0},
    'top-left': {x: 0, opacity: 1},
  },
  transition,
};

const Container = styled('div')`
  pointer-events: none;
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  color: ${p => p.theme.purple200};
  opacity: 0.4;
`;