export function setNewValueToData(data, colId, rowId, value) {
  let targetObject = data;
  if (rowId && rowId.length) {
    const indices = rowId.split(".").map(Number);
    for (let i = 0; i < indices.length; i++) {
      const index = indices[i];
      if (targetObject && targetObject[index] !== undefined) {
        targetObject = targetObject[index];
      } else {
        console.error(`Индекс ${index} не найден на уровне ${i}`);
        return false;
      }

      // Если это не последний индекс, переходим в subRows
      if (i < indices.length - 1) {
        if (targetObject.subRows && Array.isArray(targetObject.subRows)) {
          targetObject = targetObject.subRows;
        } else {
          console.error(`Нет subRows для перехода на уровне ${i}`);
          return false;
        }
      }
    }
  }

  const keys = colId.split(".");
  const lastKey = keys.pop();

  // Идем по вложенности path
  let current = targetObject;
  for (let i = 0; i < keys.length; i++) {
    const key = keys[i];
    if (!current[key]) {
      current[key] = {};
    }
    current = current[key];
  }

  current[lastKey] = value;

  return true;
}

export function updateCells(data, newRows) {
  const updatedRows = JSON.parse(JSON.stringify(data));

  newRows.forEach((update) => {
    const [rowType, depth, sortOrder, newData] = update;

    // Рекурсивная функция для поиска и обновления строки
    function findAndUpdate(rows) {
      for (let i = 0; i < rows.length; i++) {
        const row = rows[i];

        if (
          row.row_type === rowType &&
          row.depth === depth &&
          row.sort_order === sortOrder
        ) {
          if (newData && typeof newData === "object") {
            Object.keys(newData).forEach((key) => {
              if (row.data && row.data[key]) {
                if (typeof row.data[key] === "object") {
                  row.data[key] = { ...row.data[key], ...newData[key] };
                } else {
                  row.data[key] = newData[key];
                }
              } else if (row[key]) {
                row[key] = newData[key];
              }
            });
          }
          return true;
        }

        if (
          row.subRows &&
          Array.isArray(row.subRows) &&
          row.subRows.length > 0
        ) {
          const found = findAndUpdate(row.subRows);
          if (found) return true;
        }
      }
      return false;
    }

    findAndUpdate(updatedRows);
  });

  return updatedRows;
}
export function insertCell(data, newRow, expense_item_id) {
  const updatedRows = JSON.parse(JSON.stringify(data));
  const [row_type, depth, sort_order, dataRow] = newRow;
  const newRowObject = {
    row_type: row_type,
    depth: depth,
    sort_order: sort_order,
    subRows: [],
    data: dataRow,
  };

  // Если expense_item_id === null, добавляем в конец
  if (expense_item_id === null) {
    updatedRows.push(newRowObject);
    return updatedRows;
  }

  function findAndUpdate(rows) {
    for (let i = 0; i < rows.length; i++) {
      const row = rows[i];

      if (row.data.header.expense_item_id === expense_item_id) {
        if (!("subRows" in row)) {
          row.subRows = [];
        }
        row.subRows.push(newRowObject);
        return true;
      }

      if (row.subRows && Array.isArray(row.subRows) && row.subRows.length > 0) {
        const found = findAndUpdate(row.subRows);
        if (found) return true;
      }
    }
    return false;
  }
  findAndUpdate(updatedRows);
  return updatedRows;
}

export function deleteRow(data, lineId) {
  const updatedRows = JSON.parse(JSON.stringify(data));

  function findAndDelete(rows) {
    for (let i = 0; i < rows.length; i++) {
      const row = rows[i];

      if (row.data.line_id == lineId) {
        rows.splice(i, 1);
        return true;
      }

      if (row.subRows && Array.isArray(row.subRows) && row.subRows.length > 0) {
        const found = findAndDelete(row.subRows);
        if (found) return true;
      }
    }
    return false;
  }
  findAndDelete(updatedRows);
  return updatedRows;
}
