import {
  Chart as ChartJS,
  CategoryScale,
  LinearScale,
  PointElement,
  LineElement,
  BarElement,
  ArcElement,
  Title,
  Tooltip,
  Legend,
  Filler
} from 'chart.js';
import ChartDataLabels from 'chartjs-plugin-datalabels';

// Register ChartJS components once
ChartJS.register(
  CategoryScale,
  LinearScale,
  PointElement,
  LineElement,
  BarElement,
  ArcElement,
  Title,
  Tooltip,
  Legend,
  Filler,
  ChartDataLabels
);

export const chartColors = {
  primary: '#2563eb',
  secondary: '#7c3aed',
  tertiary: '#0891b2',
  success: '#059669',
  danger: '#dc2626',
  muted: '#94a3b8',
  grid: '#f1f5f9'
};

export const createDataLabelConfig = (showDataLabels: boolean): any => ({
  display: showDataLabels,
  color: '#1e293b',
  font: { size: 10, weight: 600 },
  anchor: 'end',
  align: 'end',
  offset: 4,
  padding: 4,
  backgroundColor: 'rgba(255, 255, 255, 0.85)',
  borderRadius: 3,
  textDirection: 'ltr', // Force LTR for numbers - fixes RTL misalignment
  formatter: (value) => {
    if (value == null) return '';
    if (value >= 1000000) return (value / 1000000).toFixed(2) + 'M';
    if (value >= 1000) return (value / 1000).toFixed(2) + 'K';
    if (value < 100 && value > 0) return value.toFixed(2);
    return Math.round(value).toLocaleString();
  }
});

export const createBaseOptions = (showDataLabels: boolean): any => ({
  responsive: true,
  maintainAspectRatio: false,
  locale: 'en-US', // Force LTR number formatting
  layout: {
    padding: {
      top: showDataLabels ? 25 : 5,
      right: 5,
      bottom: 5,
      left: 5
    }
  },
  plugins: {
    legend: { display: false },
    tooltip: { 
      backgroundColor: '#1e293b', 
      padding: 12, 
      cornerRadius: 8, 
      titleFont: { size: 12 }, 
      bodyFont: { size: 11 },
      rtl: false,
      textDirection: 'ltr'
    },
    datalabels: createDataLabelConfig(showDataLabels)
  },
  scales: {
    x: { 
      grid: { display: false }, 
      ticks: { font: { size: 10 }, color: '#94a3b8' } 
    },
    y: { 
      grid: { color: chartColors.grid }, 
      ticks: { font: { size: 10 }, color: '#94a3b8' }, 
      border: { display: false } 
    }
  }
});

export const lineDatasetDefaults = {
  borderWidth: 2,
  tension: 0.4,
  fill: true,
  pointRadius: 0,
  pointHoverRadius: 4
};

export const barDatasetDefaults = {
  borderRadius: 4
};
