import { normalizeDistanceKm, normalizeDurationSeconds } from '../../../utils/format';
import { TripStatus } from '../../../constants/trip-status';

export type RouteDistance = { value: number; unit: 'km' | 'm' };

export type RoutePoint = {
    latitude: number;
    longitude: number;
};

export type VehiclePointMode =
    | 'first'
    | 'last'
    | 'served_last_then_first'
    | 'first_then_served_last';

export type RouteSnapshot = {
    points: RoutePoint[];
    distance: RouteDistance | null;
    duration: number | null;
    direction: number | null;
    timestamp: number | null;
    routeKey: string;
    vehicleMoveAlongPoints: RoutePoint[];
    forceFullRedraw: boolean;
    eraseVehiclePointMode: VehiclePointMode;
    normalVehiclePointMode: VehiclePointMode;
};

// 归一化路线点。
export function normalizeRoutePoints(rawPoints: any): RoutePoint[] {
    if (!Array.isArray(rawPoints)) {
        return [];
    }
    return rawPoints
        .map((item: any) => ({
            longitude: Number(item?.longitude),
            latitude: Number(item?.latitude),
        }))
        .filter((item: RoutePoint) => Number.isFinite(item.longitude) && Number.isFinite(item.latitude));
}

// 归一化方向角到 0-359。
export function normalizeDirection(rawDirection: any) {
    const direction = Number(rawDirection);
    if (!Number.isFinite(direction)) {
        return null;
    }
    return ((direction % 360) + 360) % 360;
}

// 将分享页轮询返回的数据统一为路线快照。
export function buildShareRouteSnapshot(payload: {
    points: any[];
    servedPoints: any[];
    distance: any;
    duration: any;
    direction: any;
    timestamp?: any;
    routeKey?: any;
    forceFullRedraw?: boolean;
}): RouteSnapshot {
    const timestamp = Number(payload?.timestamp);
    return {
        points: normalizeRoutePoints(payload?.points),
        distance: normalizeDistanceKm(Number(payload?.distance)),
        duration: normalizeDurationSeconds(Number(payload?.duration)),
        direction: normalizeDirection(payload?.direction),
        timestamp: Number.isFinite(timestamp) ? timestamp : Date.now(),
        routeKey: String(payload?.routeKey || ''),
        vehicleMoveAlongPoints: normalizeRoutePoints(payload?.servedPoints),
        forceFullRedraw: payload?.forceFullRedraw === true,
        eraseVehiclePointMode: 'first_then_served_last',
        normalVehiclePointMode: 'served_last_then_first',
    };
}

// 判断当前状态是否属于平滑补帧态。
export function isSmoothMotionTripStatus(tripStatus: TripStatus | number) {
    return tripStatus === TripStatus.VehicleApproaching || tripStatus === TripStatus.InService;
}
