import React, { useState } from 'react';

import type { Grid, GridCell } from '@/types/grid';
import { Cell } from '@/components/grid/Cell';

interface GridProps {
    grid: Grid;
    onCellInteract?: (cell: GridCell) => void;
    onDragStart?: () => void;
    onDragEnd?: () => void;
}

export const GridComponent: React.FC<GridProps> = ({
    grid,
    onCellInteract,
    onDragStart,
    onDragEnd,
}) => {
    const [isDragging, setIsDragging] = useState(false);

    const handleMouseDown = (e: React.MouseEvent) => {
        e.preventDefault(); // Prevent text selection
        setIsDragging(true);
        onDragStart?.();
    };

    const handleMouseUp = () => {
        setIsDragging(false);
        onDragEnd?.();
    };

    const handleMouseLeave = () => {
        if (isDragging) {
            setIsDragging(false);
            onDragEnd?.();
        }
    };

    return (
        <div
            className='grid'
            onMouseDown={handleMouseDown}
            onMouseUp={handleMouseUp}
            onMouseLeave={handleMouseLeave}
            style={{ userSelect: 'none' }}
        >
            {grid.map((row, i) => (
                <div className='grid-row' key={i}>
                    {row.map((cell, j) => (
                        <Cell
                            key={j}
                            cell={cell}
                            onClick={onCellInteract ? () => onCellInteract(cell) : undefined}
                            onMouseEnter={isDragging && onCellInteract ? () => onCellInteract(cell) : undefined}
                        />
                    ))}
                </div>
            ))}
        </div>
    );
};
