import type { Act } from "../commons/Act";
import type { ReadGed } from "../import/ReadGed";
import { type GeocodeCandidate } from "./place-geocode";
export interface CoordVariant {
    readonly lat: number;
    readonly lng: number;
    readonly actCount: number;
}
/** Groupe de lieux similaires à harmoniser (libellés ou coordonnées divergents). */
export interface CityHarmonizationCluster {
    readonly clusterKey: string;
    readonly labels: readonly string[];
    readonly coordVariants: readonly CoordVariant[];
    readonly acts: readonly Act[];
    readonly actsWithoutCoord: number;
}
/** Groupe d’actes partageant une même ville au sens {@link citiesAreSimilar}. */
export interface SimilarCityActGroup {
    readonly cityLabel: string;
    /** Même clé que {@link clusterKeyForCity} / carte. */
    readonly clusterKey: string;
    readonly acts: readonly Act[];
    readonly withoutCoordCount: number;
}
export interface GroupActsBySimilarCityOptions {
    /** Ne retient que les actes sans coordonnées GPS utilisables. */
    readonly onlyWithoutCoordinates?: boolean;
}
export interface FilterActsBySimilarCityOptions {
    readonly onlyWithoutCoordinates?: boolean;
}
/** Distance de Levenshtein (petites chaînes de noms de villes). */
export declare function levenshteinDistance(a: string, b: string): number;
/**
 * Ville proche : même clé décorée, faute légère, ou inclusion évidente (Saint-X / St-X).
 * **Règle unique** pour regrouper actes, carte et harmonisation.
 */
export declare function citiesAreSimilar(a: string, b: string): boolean;
/**
 * Clé stable pour la carte et les listes « par ville ».
 * Utilise la localité principale (segment avant la première virgule), comme le regroupement
 * par {@link citiesAreSimilar}, afin que « Pleurtuit » et « Pleurtuit, Ille-et-Vilaine, France »
 * partagent la même clé.
 */
export declare function clusterKeyForCity(city: string): string;
/** Alias explicite de {@link clusterKeyForCity}. */
export declare const similarCityKey: typeof clusterKeyForCity;
/**
 * Regroupe les actes par ville similaire (tri décroissant par nombre d’actes).
 * Utiliser pour une UI « lieux sans position » (`onlyWithoutCoordinates: true`).
 */
export declare function groupActsBySimilarCity(acts: readonly Act[], options?: GroupActsBySimilarCityOptions): SimilarCityActGroup[];
/**
 * Actes dont le lieu est similaire à `cityRef` (même logique que l’harmonisation / la carte).
 */
export declare function filterActsBySimilarCity(acts: readonly Act[], cityRef: string, options?: FilterActsBySimilarCityOptions): Act[];
/**
 * Actes similaires à `cityRef` sans coordonnées GPS — à géolocaliser en une fois.
 * Alias de `filterActsBySimilarCity(..., { onlyWithoutCoordinates: true })`.
 */
export declare function actsNeedingGeocodeForCity(acts: readonly Act[], cityRef: string): Act[];
/**
 * Conflits d’harmonisation : libellés multiples, positions GPS divergentes,
 * ou mixte avec/sans coordonnées sur la même ville similaire.
 */
export declare function findHarmonizationClustersFromActs(acts: readonly Act[]): CityHarmonizationCluster[];
/** Analyse toute l’arbre (préférer {@link findHarmonizationClustersFromActs} sur un sous-ensemble). */
export declare function findHarmonizationClusters(ged: ReadGed): CityHarmonizationCluster[];
export declare function applyCoordinatesToActs(acts: readonly Act[], lat: number, lng: number, patch?: {
    city?: string;
    country?: string | null;
}): void;
export declare function applyGeocodeCandidateToActs(acts: readonly Act[], candidate: GeocodeCandidate, preferredCityLabel?: string): void;
