import * as React from 'react';
import { cva, type VariantProps } from 'class-variance-authority';
import { cn } from '@/lib/utils';

const badgeVariants = cva(
  'inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-[11px] font-medium leading-none',
  {
    variants: {
      variant: {
        neutral:  'bg-neutral-100 text-neutral-700',
        primary:  'bg-primary-50 text-primary-700',
        success:  'bg-success/15 text-success',
        warning:  'bg-warning/15 text-warning',
        danger:   'bg-danger/15 text-danger',
        info:     'bg-info/15 text-info',
        secondary:'bg-secondary-50 text-secondary-700',
        accent:   'bg-accent-50 text-accent-700',
      },
    },
    defaultVariants: { variant: 'neutral' },
  },
);

export interface BadgeProps
  extends React.HTMLAttributes<HTMLSpanElement>,
    VariantProps<typeof badgeVariants> {}

export function Badge({ className, variant, ...props }: BadgeProps) {
  return <span className={cn(badgeVariants({ variant }), className)} {...props} />;
}

export type ProductType = 'rental' | 'sale' | 'digital';

const PRODUCT_TYPE_VARIANT: Record<ProductType, NonNullable<VariantProps<typeof badgeVariants>['variant']>> = {
  rental:  'warning',
  sale:    'success',
  digital: 'info',
};

const PRODUCT_TYPE_LABEL: Record<ProductType, Record<string, string>> = {
  rental:  { en: 'Rental', ar: 'إيجار' },
  sale:    { en: 'For sale', ar: 'للبيع' },
  digital: { en: 'Digital', ar: 'رقمي' },
};

export function ProductTypeBadge({
  type,
  locale = 'en',
  className,
}: {
  type: ProductType;
  locale?: string;
  className?: string;
}) {
  const label = PRODUCT_TYPE_LABEL[type]?.[locale] ?? PRODUCT_TYPE_LABEL[type]?.en ?? type;
  return (
    <Badge variant={PRODUCT_TYPE_VARIANT[type]} className={className}>
      {label}
    </Badge>
  );
}

export type BookingLifecycle =
  | 'draft'
  | 'submitted'
  | 'customer_review'
  | 'awaiting_payment'
  | 'confirmed'
  | 'in_progress'
  | 'completed'
  | 'cancelled'
  | 'rejected';

const LIFECYCLE_VARIANT: Record<BookingLifecycle, NonNullable<VariantProps<typeof badgeVariants>['variant']>> = {
  draft:             'neutral',
  submitted:         'secondary',
  customer_review:   'warning',
  awaiting_payment:  'warning',
  confirmed:         'success',
  in_progress:       'info',
  completed:         'success',
  cancelled:         'neutral',
  rejected:          'danger',
};

export function BookingStatusBadge({ status, label, className }: { status: BookingLifecycle; label: string; className?: string }) {
  return (
    <Badge variant={LIFECYCLE_VARIANT[status] ?? 'neutral'} className={className}>
      {label}
    </Badge>
  );
}
