import { RedisService } from '../common/redis.service'; import { ArtilleryMissionRequestDto, TacticalSymbolDto } from './dto/tactical.dto'; export interface LosPoint { index: number; distanceMeters: number; lat: number; lng: number; groundElevationMeters: number; earthCurvatureSagittaMeters: number; apparentElevationMeters: number; sightRayElevationMeters: number; marginMeters: number; isVisible: boolean; isDeadGround: boolean; horizonAngleMils: number; } export interface LineOfSightResponse { isDirectlyVisible: boolean; status: 'CLEAR_LINE_OF_SIGHT' | 'OBSTRUCTED'; statusAr: string; summary: { totalDistanceMeters: number; totalDistanceKm: number; azimuthDegrees: number; verticalAngleDegrees: number; verticalAngleMilsNato: number; verticalAngleMilsSoviet: number; observerGroundElevationMeters: number; observerTotalElevationMeters: number; targetGroundElevationMeters: number; targetTotalElevationMeters: number; minElevationMeters: number; maxElevationMeters: number; deadGroundPercentage: number; samplePointsCount: number; stepMeters?: number; }; highestObstacle: { distanceMeters: number; lat: number; lng: number; elevationMeters: number; sightRayElevationMeters: number; penetrationMeters: number; } | null; observer: { lat: number; lng: number; heightOffsetMeters: number; groundElevationMeters: number; totalElevationMeters: number; }; target: { lat: number; lng: number; heightOffsetMeters: number; groundElevationMeters: number; totalElevationMeters: number; }; profile?: LosPoint[]; } export declare class TacticalService { private readonly redisService; private readonly logger; constructor(redisService: RedisService); computeLineOfSight(observerLat: number, observerLng: number, targetLat: number, targetLng: number, observerHeight?: number, targetHeight?: number, samplesCount?: number, stepMeters?: number, compact?: boolean): Promise; calculateArtilleryFireMission(dto: ArtilleryMissionRequestDto): Promise<{ fireMissionId: string; caliber: string; muzzleVelocityMs: number; distanceMeters: number; distanceKm: number; azimuthDegrees: number; azimuthMils: number; gunElevationMeters: number; targetElevationMeters: number; apexAltitudeMeters: number; timeOfFlightSeconds: number; lowAngle: { degrees: number; mils: number; }; highAngle: { degrees: number; mils: number; }; hasCrestClearance: boolean; criticalObstacle: any; trajectoryPoints: any[]; }>; assessHelicopterLandingZones(lat: number, lng: number, radiusMeters?: number): Promise<{ centerLat: number; centerLng: number; searchRadiusMeters: number; totalAssessed: number; suitableCount: number; zones: any[]; }>; saveScenario(name: string, symbols: TacticalSymbolDto[]): Promise<{ success: boolean; count: number; name: string; }>; getScenario(name: string): Promise; private haversineDistance; private calculateBearing; private estimateElevation; }