import * as React from 'react';

import { VariantProps, cva } from 'class-variance-authority';

import { cn } from '.';

const cardVariants = cva('text-card-foreground rounded-xl border', {
  variants: {
    variant: {
      default: 'bg-card',
      'gradient-warning':
        'from-warning/30 via-warning/10 to-background bg-gradient-to-t',
      'gradient-destructive':
        'from-destructive/30 via-destructive/10 to-background bg-gradient-to-t',
      'gradient-success':
        'from-success/30 via-success/10 to-background bg-gradient-to-t',
    },
  },
  defaultVariants: {
    variant: 'default',
  },
});

export interface CardProps
  extends React.HTMLAttributes<HTMLDivElement>,
    VariantProps<typeof cardVariants> {}

const Card: React.FC<CardProps> = ({ className, variant, ...props }) => (
  <div className={cn(cardVariants({ variant, className }))} {...props} />
);
Card.displayName = 'Card';

const CardHeader: React.FC<React.HTMLAttributes<HTMLDivElement>> = ({
  className,
  ...props
}) => (
  <div className={cn('flex flex-col space-y-1.5 p-4 sm:p-6', className)} {...props} />
);
CardHeader.displayName = 'CardHeader';

const CardTitle: React.FC<React.HTMLAttributes<HTMLHeadingElement>> = ({
  className,
  ...props
}) => (
  <h3
    className={cn('leading-none font-semibold tracking-tight', className)}
    {...props}
  />
);
CardTitle.displayName = 'CardTitle';

const CardDescription: React.FC<React.HTMLAttributes<HTMLParagraphElement>> = ({
  className,
  ...props
}) => (
  <p className={cn('text-muted-foreground text-sm', className)} {...props} />
);
CardDescription.displayName = 'CardDescription';

const CardContent: React.FC<React.HTMLAttributes<HTMLDivElement>> = ({
  className,
  ...props
}) => <div className={cn('p-4 sm:p-6 pt-0', className)} {...props} />;
CardContent.displayName = 'CardContent';

const CardFooter: React.FC<React.HTMLAttributes<HTMLDivElement>> = ({
  className,
  ...props
}) => (
  <div className={cn('flex items-center p-4 sm:p-6 pt-0', className)} {...props} />
);
CardFooter.displayName = 'CardFooter';

export {
  Card,
  CardHeader,
  CardFooter,
  CardTitle,
  CardDescription,
  CardContent,
};
