import React from 'react';
import { Card } from '../ui/card';
import { ArrowUp, ArrowDown } from 'lucide-react';

interface StatCardProps {
  label: string;
  value: string | number;
  icon: React.ReactNode;
  trend?: string | number; // String like "+12%" or raw number
  color?: 'cyan' | 'magenta' | 'lime' | 'gold' | 'red';
  sparklineData?: number[];
}

export const StatCard: React.FC<StatCardProps> = ({
  label,
  value,
  icon,
  trend,
  color = 'cyan',
  sparklineData,
}) => {
  const colorMap = {
    cyan: 'text-kodo-cyan',
    magenta: 'text-kodo-magenta',
    lime: 'text-kodo-lime',
    gold: 'text-kodo-gold',
    red: 'text-kodo-red',
  };

  const bgMap = {
    cyan: 'bg-kodo-steel/10',
    magenta: 'bg-kodo-magenta/10',
    lime: 'bg-kodo-lime/10',
    gold: 'bg-kodo-gold/10',
    red: 'bg-kodo-red/10',
  };

  const renderSparkline = (data: number[]) => {
    if (!data || data.length < 2) return null;
    const min = Math.min(...data);
    const max = Math.max(...data);
    const range = max - min || 1;
    const width = 100;
    const height = 40;

    const getPathData = (d: number[]) => {
      const points = d.map((val, i) => ({
        x: (i / (d.length - 1)) * width,
        y: height - ((val - min) / range) * height,
      }));

      let pathStr = `M ${points[0].x},${points[0].y}`;
      for (let i = 0; i < points.length - 1; i++) {
        const curr = points[i];
        const next = points[i + 1];
        const mx = (curr.x + next.x) / 2;
        pathStr += ` C ${mx},${curr.y} ${mx},${next.y} ${next.x},${next.y}`;
      }
      return pathStr;
    };

    return (
      <svg
        width="100%"
        height={height}
        viewBox={`0 0 ${width} ${height}`}
        className="opacity-60 overflow-visible"
      >
        <path
          d={getPathData(data)}
          fill="none"
          stroke="currentColor"
          strokeWidth="2.5"
          strokeLinecap="round"
          strokeLinejoin="round"
          vectorEffect="non-scaling-stroke"
          className="drop-shadow-[0_0_8px_currentColor]"
        />
      </svg>
    );
  };

  const isPositive =
    typeof trend === 'string' ? !trend.startsWith('-') : (trend || 0) >= 0;
  const trendValue = typeof trend === 'number' ? `${Math.abs(trend)}%` : trend;

  return (
    <Card
      variant="default"
      className="flex flex-col justify-between h-full p-6 hover:border-opacity-100 transition-all relative overflow-hidden"
    >
      <div className="flex justify-between items-start mb-2 relative z-10">
        <div>
          <p className="text-xs font-mono text-kodo-content-dim uppercase tracking-widest mb-1">
            {label}
          </p>
          <h3 className="text-2xl font-display font-bold text-white">
            {value}
          </h3>
        </div>
        <div className={`p-2 rounded-lg ${bgMap[color]} ${colorMap[color]}`}>
          {icon}
        </div>
      </div>

      <div className="relative z-10 flex items-end justify-between mt-2">
        {trend && (
          <div
            className={`flex items-center gap-1 text-xs font-bold ${isPositive ? 'text-kodo-lime' : 'text-kodo-red'}`}
          >
            {isPositive ? (
              <ArrowUp className="w-3 h-3" />
            ) : (
              <ArrowDown className="w-3 h-3" />
            )}
            {trendValue}{' '}
            <span className="text-kodo-content-dim font-normal">vs last period</span>
          </div>
        )}
      </div>

      {sparklineData && (
        <div
          className={`absolute bottom-0 left-0 right-0 h-12 ${colorMap[color]} opacity-20 pointer-events-none`}
        >
          {renderSparkline(sparklineData)}
        </div>
      )}
    </Card>
  );
};
