/**
 * Copyright IBM Corp. 2020, 2026
 *
 * This source code is licensed under the Apache-2.0 license found in the
 * LICENSE file in the root directory of this source tree.
 */

const require_uuidv4 = require("../../../global/js/utils/uuidv4.js");
const require_deepCloneObject = require("../../../global/js/utils/deepCloneObject.js");
const require_selectAllCells = require("./selectAllCells.js");
//#region src/components/DataSpreadsheet/utils/handleMultipleKeys.js
/**
* Copyright IBM Corp. 2022, 2022
*
* This source code is licensed under the Apache-2.0 license found in the
* LICENSE file in the root directory of this source tree.
*/
const includesResourceKey = (arr, usingMac) => {
	if (usingMac) return includesMeta(arr);
	if (!usingMac) return includesControl(arr);
};
const includesShift = (arr) => {
	if (arr.includes("ShiftLeft") || arr.includes("ShiftRight")) return true;
	return false;
};
const includesMeta = (arr) => {
	if (arr.includes("MetaLeft") || arr.includes("MetaRight")) return true;
	return false;
};
const includesControl = (arr) => {
	if (arr.includes("ControlLeft") || arr.includes("ControlRight")) return true;
	return false;
};
const handleMultipleKeys = ({ activeCellCoordinates, event, keysPressedList, selectionAreas, currentMatcher, rows, setSelectionAreas, columns, updateActiveCellCoordinates, spreadsheetRef, removeCellSelections, blockClass, setCurrentMatcher, usingMac }) => {
	const selectionAreasClone = require_deepCloneObject.deepCloneObject(selectionAreas);
	const indexOfCurrentArea = selectionAreasClone.findIndex((item) => item.matcher === currentMatcher);
	const pointToUpdate = selectionAreasClone[indexOfCurrentArea]?.point2 ? selectionAreasClone[indexOfCurrentArea]?.point2 : selectionAreasClone[indexOfCurrentArea]?.point1;
	if (includesShift(keysPressedList) && keysPressedList.includes("ArrowDown") && keysPressedList.length === 2) {
		if (rows.length - 1 === pointToUpdate?.row || activeCellCoordinates?.row === "header" || activeCellCoordinates?.column === "header") return;
		const newPoint = {
			row: pointToUpdate.row + 1,
			column: pointToUpdate.column
		};
		selectionAreasClone[indexOfCurrentArea].point2 = newPoint;
		selectionAreasClone[indexOfCurrentArea].areaCreated = false;
		setSelectionAreas(selectionAreasClone);
	}
	if (includesShift(keysPressedList) && keysPressedList.includes("ArrowRight") && keysPressedList.length === 2) {
		if (columns.length - 1 === pointToUpdate?.column || activeCellCoordinates?.row === "header" || activeCellCoordinates?.column === "header") return;
		const newPoint = {
			row: pointToUpdate.row,
			column: pointToUpdate.column + 1
		};
		selectionAreasClone[indexOfCurrentArea].point2 = newPoint;
		selectionAreasClone[indexOfCurrentArea].areaCreated = false;
		setSelectionAreas(selectionAreasClone);
	}
	if (includesShift(keysPressedList) && keysPressedList.includes("ArrowUp") && keysPressedList.length === 2) {
		if (pointToUpdate?.row === 0 || activeCellCoordinates?.row === "header" || activeCellCoordinates?.column === "header") return;
		const newPoint = {
			row: pointToUpdate.row - 1,
			column: pointToUpdate.column
		};
		selectionAreasClone[indexOfCurrentArea].point2 = newPoint;
		selectionAreasClone[indexOfCurrentArea].areaCreated = false;
		setSelectionAreas(selectionAreasClone);
	}
	if (includesShift(keysPressedList) && keysPressedList.includes("ArrowLeft") && keysPressedList.length === 2) {
		if (pointToUpdate?.column === 0 || activeCellCoordinates?.row === "header" || activeCellCoordinates?.column === "header") return;
		const newPoint = {
			row: pointToUpdate.row,
			column: pointToUpdate.column - 1
		};
		selectionAreasClone[indexOfCurrentArea].point2 = newPoint;
		selectionAreasClone[indexOfCurrentArea].areaCreated = false;
		setSelectionAreas(selectionAreasClone);
	}
	if (includesResourceKey(keysPressedList, usingMac) && keysPressedList.includes("KeyA")) {
		event.preventDefault();
		const selectionPoint1 = {
			row: 0,
			column: 0
		};
		const selectionPoint2 = {
			row: rows.length - 1,
			column: columns.length - 1
		};
		if (indexOfCurrentArea === -1) require_selectAllCells.selectAllCells({
			ref: spreadsheetRef,
			setCurrentMatcher,
			setSelectionAreas,
			rows,
			columns,
			activeCellCoordinates,
			updateActiveCellCoordinates
		});
		selectionAreasClone[indexOfCurrentArea].point1 = selectionPoint1;
		selectionAreasClone[indexOfCurrentArea].point2 = selectionPoint2;
		selectionAreasClone[indexOfCurrentArea].areaCreated = false;
		setSelectionAreas(selectionAreasClone);
	}
	if (includesControl(keysPressedList) && keysPressedList.includes("Space")) {
		const selectionPoint1 = {
			row: 0,
			column: activeCellCoordinates?.column === "header" ? 0 : activeCellCoordinates?.column
		};
		const selectionPoint2 = {
			row: rows.length - 1,
			column: activeCellCoordinates?.column === "header" ? 0 : activeCellCoordinates?.column
		};
		if (indexOfCurrentArea === -1) {
			const tempMatcher = require_uuidv4.default();
			const newSelectionArea = {
				point1: selectionPoint1,
				point2: selectionPoint2,
				areaCreated: false,
				matcher: tempMatcher
			};
			updateActiveCellCoordinates({
				coords: { ...activeCellCoordinates },
				updatedValue: {
					column: activeCellCoordinates?.column === "header" ? 0 : activeCellCoordinates?.column,
					row: activeCellCoordinates?.row === "header" ? 0 : activeCellCoordinates?.row
				}
			});
			setCurrentMatcher(tempMatcher);
			return setSelectionAreas([newSelectionArea]);
		}
		selectionAreasClone[indexOfCurrentArea].point1 = selectionPoint1;
		selectionAreasClone[indexOfCurrentArea].point2 = selectionPoint2;
		selectionAreasClone[indexOfCurrentArea].areaCreated = false;
		setSelectionAreas(selectionAreasClone);
	}
	if (includesShift(keysPressedList) && keysPressedList.includes("Space")) {
		const selectionPoint1 = {
			row: activeCellCoordinates?.row === "header" ? 0 : activeCellCoordinates?.row,
			column: 0
		};
		const selectionPoint2 = {
			row: activeCellCoordinates?.row === "header" ? 0 : activeCellCoordinates?.row,
			column: columns.length - 1
		};
		if (indexOfCurrentArea === -1) {
			const tempMatcher = require_uuidv4.default();
			const newSelectionArea = {
				point1: selectionPoint1,
				point2: selectionPoint2,
				areaCreated: false,
				matcher: tempMatcher
			};
			updateActiveCellCoordinates({
				coords: { ...activeCellCoordinates },
				updatedValue: {
					column: activeCellCoordinates?.column === "header" ? 0 : activeCellCoordinates?.column,
					row: activeCellCoordinates?.row === "header" ? 0 : activeCellCoordinates?.row
				}
			});
			setCurrentMatcher(tempMatcher);
			return setSelectionAreas([newSelectionArea]);
		}
		selectionAreasClone[indexOfCurrentArea].point1 = selectionPoint1;
		selectionAreasClone[indexOfCurrentArea].point2 = selectionPoint2;
		selectionAreasClone[indexOfCurrentArea].areaCreated = false;
		setSelectionAreas(selectionAreasClone);
	}
	if (includesResourceKey(keysPressedList, usingMac) && keysPressedList.includes("Home")) {
		const scrollElement = spreadsheetRef.current.querySelector(`.${blockClass}__list--container`);
		scrollElement.scrollTop = 0;
		const coordinatesClone = { ...activeCellCoordinates };
		removeCellSelections({ spreadsheetRef });
		updateActiveCellCoordinates({
			coords: coordinatesClone,
			updatedValue: {
				column: 0,
				row: 0
			}
		});
	}
	if (includesResourceKey(keysPressedList, usingMac) && keysPressedList.includes("End")) {
		const scrollElement = spreadsheetRef.current.querySelector(`.${blockClass}__list--container`);
		scrollElement.scrollTop = scrollElement.scrollHeight;
		const coordinatesClone = { ...activeCellCoordinates };
		removeCellSelections({ spreadsheetRef });
		const lastCellExists = !!rows[rows?.length - 1].cells[columns?.length - 1];
		const updateToLastCell = () => {
			updateActiveCellCoordinates({
				coords: coordinatesClone,
				updatedValue: {
					column: columns.length - 1,
					row: rows.length - 1
				}
			});
		};
		if (lastCellExists) updateToLastCell();
		else setTimeout(() => {
			updateToLastCell();
		}, 1e3);
	}
};
//#endregion
exports.handleMultipleKeys = handleMultipleKeys;
exports.includesResourceKey = includesResourceKey;
exports.includesShift = includesShift;
