import { type CSSProperties, type ReactNode } from 'react';
import { type SxProps, type Theme } from '@mui/material';
export interface GoogleMapProps {
    center?: {
        lat: number;
        lng: number;
    };
    zoom?: number;
    options?: google.maps.MapOptions;
    className?: string;
    containerStyle?: CSSProperties;
    children?: ReactNode;
    onLoad?: (map: google.maps.Map) => void;
    onError?: (error: Error) => void;
    apiKey?: string;
    mapId?: string;
    themeMode?: 'light' | 'dark';
}
export interface CameraTypeInfo {
    count: number;
    icon?: ReactNode;
}
export interface RawCameraData {
    id: string;
    algorithm?: string;
    type?: string;
    name?: string;
    /** Orientação da câmera em graus (0-360), onde 0 é para cima/norte */
    orientation?: number;
    [key: string]: unknown;
}
export interface MapSpotData {
    lat: number;
    lng: number;
    count: number;
    id: string | number;
    name?: string;
    addressText?: string;
    cameras?: Array<RawCameraData> | null;
}
export interface ClusteredSpot extends MapSpotData {
    isCluster?: boolean;
    pointCount?: number;
    clusterId?: number;
    /** IDs of the individual spots that make up this cluster (only set when isCluster=true) */
    leafSpotIds?: Set<string | number>;
}
export interface SuperclusterFeature {
    type: 'Feature';
    properties: MapSpotData & {
        cluster?: boolean;
        cluster_id?: number;
        point_count?: number;
    };
    geometry: {
        type: 'Point';
        coordinates: [number, number];
    };
}
export interface MapMarkersProps {
    spots: MapSpotData[];
    onSpotClick?: (spot: MapSpotData) => void;
    onCameraClick?: (camera: RawCameraData, spot: MapSpotData) => void;
    /** Chamado no auxclick (middle-click) de um ícone de câmera */
    onCameraAuxClick?: (camera: RawCameraData, spot: MapSpotData) => void;
    /** Chamado quando o mouse entra/sai de um ícone de câmera na ponta da linha de rotação */
    onCameraHover?: (camera: RawCameraData | null, spot: MapSpotData | null) => void;
    zoomLevel?: number;
    /** Zoom ao aproximar ao selecionar um spot (ex.: 18). Se não informado, usa zoomLevel. */
    selectedZoomLevel?: number;
    /** Id do spot selecionado (legado). Preferir selectedSpot quando disponível. */
    selectedSpotId?: string | number;
    /** Id do spot marcado permanentemente com a cor terciária (sem expandir) */
    markedSpotId?: string | number;
    /** Spot selecionado (novo formato). Se definido, prevalece sobre selectedSpotId para isSelected. */
    selectedSpot?: MapSpotData | null;
    /** Id da câmera selecionada para destacar visualmente no MapSpot */
    selectedCameraId?: string;
    /** Id do spot com hover vindo da lista (destaca o background do spot/cluster) */
    hoveredSpotId?: string | number;
    /** Id da câmera com hover vindo da lista (destaca a câmera especifica quando o spot está selecionado) */
    hoveredCameraId?: string;
    animateOnClick?: boolean;
    disableClick?: boolean;
    expandAll?: boolean;
    disableHighlight?: boolean;
    /** Cor customizada para o estado de hover/highlighted (substitui a cor terciária padrão do tema) */
    highlightColor?: string;
    /** Cor customizada para texto e ícones no estado de hover/highlighted */
    highlightTextColor?: string;
    /** Quando true e o spot está highlighted, exibe apenas o ícone da câmera sem o contador */
    showIconOnHighlight?: boolean;
    /** Set de IDs de spots a destacar (ex.: dentro de um círculo de seleção). Usa highlightColor/highlightTextColor. */
    highlightedSpotIds?: Set<string | number>;
    /** Set de IDs de câmeras a destacar individualmente (aplica o estilo de "câmera selecionada" em cada uma). */
    highlightedCameraIds?: Set<string>;
    /** Quando true, `isSelected` apenas expande o spot (mostra rotation lines) sem alterar a cor do pin — apenas `isHighlighted`/`isMarked` mudam a cor. */
    disableSelectedHighlight?: boolean;
    /** Força todos os spots a exibir os ícones de tipo de câmera com contagem, independente do zoom. */
    forceShowIcons?: boolean;
}
export interface MapSpotProps {
    count: number;
    addressText?: string;
    cameras?: Array<RawCameraData> | null;
    currentZoom?: number;
    isSelected?: boolean;
    selectedCameraId?: string;
    /** Marca o spot com a cor terciária permanentemente, sem expandir nem remover ícones */
    isMarked?: boolean;
    /** Destaca o background do spot com cor de seleção sem mostrar linhas de rotação */
    isHighlighted?: boolean;
    /** Destaca uma câmera específica quando o spot está selecionado (hover da lista) */
    highlightedCameraId?: string;
    /** Destaca múltiplas câmeras dentro do spot — aplica o mesmo estilo de "selecionada" em cada câmera presente no set. */
    highlightedCameraIds?: Set<string>;
    /** Quando true, `isSelected` apenas expande o spot sem alterar a cor do pin — apenas `isHighlighted`/`isMarked` mudam a cor. */
    disableSelectedHighlight?: boolean;
    animateOnClick?: boolean;
    disableClick?: boolean;
    className?: string;
    onClick?: () => void;
    onCameraClick?: (camera: RawCameraData) => void;
    /** Chamado no auxclick (middle-click) de um ícone de câmera */
    onCameraAuxClick?: (camera: RawCameraData) => void;
    /** Chamado quando o mouse entra/sai de um ícone de câmera na ponta da linha de rotação */
    onCameraHover?: (camera: RawCameraData | null) => void;
    sx?: SxProps<Theme>;
    disableHighlight?: boolean;
    /** Cor customizada para o estado de hover/highlighted (substitui a cor terciária padrão do tema) */
    highlightColor?: string;
    /** Cor customizada para texto e ícones no estado de hover/highlighted */
    highlightTextColor?: string;
    /** Quando true e o spot está highlighted, exibe apenas o ícone da câmera sem o contador */
    showIconOnHighlight?: boolean;
    /** Força o spot a exibir os ícones de tipo de câmera com contagem, independente do zoom. */
    forceShowIcons?: boolean;
}
