import Papa from 'papaparse';
import { DataTable } from 'simple-datatables';

const languageMap = {
  'Arabic': 'ar',
  'Turkish': 'tr',
  'Swahili': 'sw',
  'Russian': 'ru',
  'Telugu': 'te',
  'Thai': 'th',
  'Chinese': 'zh',
  'French': 'fr',
  'Hindi': 'hi',
};

const metricTypes = [
  { value: 'max_score', label: 'Max Score' },
  { value: 'avg_snr', label: 'Low Noise' },
  { value: 'avg_spearman', label: 'Monotonicity' },
  { value: 'max_n_std', label: 'Non-Randomness' },
  { value: 'avg_kendall_tau_a', label: 'Ordering Consistency' }
];

const tableTypes = [
  { value: 'gen', label: 'Generative' },
  { value: 'mc', label: 'Multichoice' }
];

const taskFolders = [
  { value: 'selected', label: 'FineTasks' },
  { value: 'non_selected', label: 'Non-Selected' }
];

function createDropdown(options, onChange) {
  const select = document.createElement('select');
  options.forEach(option => {
    const optionElement = document.createElement('option');
    if (typeof option === 'object' && option.value && option.label) {
      optionElement.value = option.value;
      optionElement.textContent = option.label;
    } else {
      optionElement.value = option;
      optionElement.textContent = option;
    }
    select.appendChild(optionElement);
  });
  select.addEventListener('change', onChange);
  return select;
}

function createPerTaskResultsTable(data, tableType, metric) {
  const tableWrapper = document.createElement('div');
  tableWrapper.className = 'table-wrapper fine-tasks-table-wrapper';

  const table = document.createElement('table');
  table.className = 'results-table fine-tasks-results-table';

  const columns = ['Task', 'Type', ...(tableType === 'gen' ? ['f1', 'prefix_match'] : ['acc', 'acc_norm', 'acc_norm_token', 'acc_norm_pmi'])];
  
  const columnNameMap = {
    // 'Task': 'Task',
    // 'Type': 'Type',
    // 'f1': 'f1',
    // 'prefix_match': 'prefix_match',
    // 'acc': 'acc',
    'acc_norm': 'acc_char',
    'acc_norm_token': 'acc_token',
    'acc_norm_pmi': 'acc_pmi',
    'prefix_match': 'prefix'
  };

  const taskMetricMap = {
    'max_score': 'score',
    'avg_snr': 'snr',
    'avg_spearman': 'monotonicity',
    'max_n_std': 'non-randomness',
    'avg_kendall_tau_a': 'ordering'
    // 'avg_spearman': 'monotonicity',
  }

  const header = table.createTHead();
  const headerRow = header.insertRow();
  columns.forEach(column => {
    const th = document.createElement('th');
    th.textContent = columnNameMap[column] || column;

    if (th.textContent !== "Task" && th.textContent !== "Type") {
        th.textContent += " " + (taskMetricMap[metric] || metric);
    }
    th.title = th.textContent;
    if (column === 'Type')
      th.style.width = '40px';
    headerRow.appendChild(th);
  });

  const body = table.createTBody();
  data.forEach(row => {
    if (Object.values(row).every(value => value === '' || value === undefined || value === null)) {
      return;
    }
    
    const tr = body.insertRow();
    columns.forEach(column => {
      const td = tr.insertCell();
      let value = row[column];
      if (column === 'Task') {
        const fullTaskName = value; // Store the full task name
        const parts = value.split('|');
        value = parts.length > 1 ? parts[1] : value;
        value = value.split('_mcf')[0].split('_cf')[0];
        td.title = fullTaskName; // Set the title attribute to show the full name on hover
      } else if (column === 'Type') {
        // Keep the task type as is
      } else if (typeof value === 'number') {
        value = value.toFixed(2);
      } else if (value && !isNaN(parseFloat(value))) {
        value = parseFloat(value).toFixed(2);
      } else {
        value = '';
      }
      td.textContent = value;
    });
  });

  tableWrapper.appendChild(table);
  return tableWrapper;
}

export function initFineTasks(containerId) {
  const container = document.getElementById(containerId);
  if (!container) return;

  const perTaskTitleElement = document.createElement('h3');
  perTaskTitleElement.textContent = 'Task Results';
  perTaskTitleElement.className = 'fine-tasks-title';

  const perTaskTableContainer = document.createElement('div');
  perTaskTableContainer.className = 'table-container';

  let perTaskDataTable;

  function updatePerTaskResults() {
    const language = languageDropdownPerTask.value;
    const metric = metricDropdownPerTask.value;
    const tableType = tableTypeDropdownPerTask.value;
    const taskFolder = taskFolderDropdownPerTask.value;

    const languageCode = languageMap[language];

    if (!languageCode) {
      console.error(`Language code not found for ${language}`);
      perTaskTableContainer.innerHTML = `<p>Error: Language code not found for ${language}</p>`;
      return;
    }

    let url = `data/tasks/${taskFolder}/${languageCode}/${metric}/${tableType}_stats.csv`;

    fetch(url)
      .then(response => {
        if (!response.ok) {
          throw new Error(`HTTP error! status: ${response.status}`);
        }
        return response.text();
      })
      .then(csvText => {
        const results = Papa.parse(csvText, { header: true }).data;
        perTaskTableContainer.innerHTML = '';
        const tableWrapper = createPerTaskResultsTable(results, tableType, metric);
        perTaskTableContainer.appendChild(tableWrapper);

        if (perTaskDataTable) {
          perTaskDataTable.destroy();
        }

        perTaskDataTable = new DataTable('.fine-tasks-results-table', {
          perPage: 10,
          perPageSelect: false,
          searchable: false,
          sortable: true,
          fixedHeight: true,
          labels: {
            info: ''  // This removes the "Showing 1 to X of Y entries" text
          }
        });

      })
      .catch(error => {
        console.error('Error fetching CSV:', error);
        perTaskTableContainer.innerHTML = `<p>Error loading data: ${error.message}</p>`;
      });
  }

  const perTaskControls = document.createElement('div');
  perTaskControls.className = 'controls fine-tasks-controls';

  // Task folder control group
  const taskFolderControlGroup = document.createElement('div');
  taskFolderControlGroup.className = 'control-group';
  const taskFolderLabelPerTask = document.createElement('label');
  taskFolderLabelPerTask.textContent = 'Task Set: ';
  const taskFolderDropdownPerTask = createDropdown(taskFolders, updatePerTaskResults);
  taskFolderDropdownPerTask.value = 'selected'; // Set default to FineTasks
  taskFolderControlGroup.appendChild(taskFolderLabelPerTask);
  taskFolderControlGroup.appendChild(taskFolderDropdownPerTask);

  // Language control group
  const languageControlGroup = document.createElement('div');
  languageControlGroup.className = 'control-group';
  const languageLabelPerTask = document.createElement('label');
  languageLabelPerTask.textContent = 'Language: ';
  const languageDropdownPerTask = createDropdown(Object.keys(languageMap), updatePerTaskResults);
  languageControlGroup.appendChild(languageLabelPerTask);
  languageControlGroup.appendChild(languageDropdownPerTask);

  // Table type control group
  const tableTypeControlGroup = document.createElement('div');
  tableTypeControlGroup.className = 'control-group';
  const tableTypeLabelPerTask = document.createElement('label');
  tableTypeLabelPerTask.textContent = 'Type: ';
  const tableTypeDropdownPerTask = createDropdown(tableTypes, updatePerTaskResults);
  tableTypeControlGroup.appendChild(tableTypeLabelPerTask);
  tableTypeControlGroup.appendChild(tableTypeDropdownPerTask);

  // Metric control group
  const metricControlGroup = document.createElement('div');
  metricControlGroup.className = 'control-group';
  const metricLabelPerTask = document.createElement('label');
  metricLabelPerTask.textContent = 'Criteria: ';
  const metricDropdownPerTask = createDropdown(metricTypes, updatePerTaskResults);
  metricDropdownPerTask.value = 'max_score'; // Set default to Max Score
  metricControlGroup.appendChild(metricLabelPerTask);
  metricControlGroup.appendChild(metricDropdownPerTask);

  perTaskControls.appendChild(taskFolderControlGroup);
  perTaskControls.appendChild(languageControlGroup);
  perTaskControls.appendChild(tableTypeControlGroup);
  perTaskControls.appendChild(metricControlGroup);

  container.appendChild(perTaskControls);
  // container.appendChild(perTaskTitleElement);
  container.appendChild(perTaskTableContainer);

  // Initialize with default values
  updatePerTaskResults();
}