"""Distance util functions."""
from __future__ import annotations

from collections.abc import Callable

# pylint: disable-next=hass-deprecated-import
from homeassistant.const import (  # noqa: F401
    LENGTH,
    LENGTH_CENTIMETERS,
    LENGTH_FEET,
    LENGTH_INCHES,
    LENGTH_KILOMETERS,
    LENGTH_METERS,
    LENGTH_MILES,
    LENGTH_MILLIMETERS,
    LENGTH_YARD,
    UNIT_NOT_RECOGNIZED_TEMPLATE,
)
from homeassistant.helpers.frame import report

from .unit_conversion import DistanceConverter

VALID_UNITS = DistanceConverter.VALID_UNITS

TO_METERS: dict[str, Callable[[float], float]] = {
    LENGTH_METERS: lambda meters: meters,
    LENGTH_MILES: lambda miles: miles * 1609.344,
    LENGTH_YARD: lambda yards: yards * 0.9144,
    LENGTH_FEET: lambda feet: feet * 0.3048,
    LENGTH_INCHES: lambda inches: inches * 0.0254,
    LENGTH_KILOMETERS: lambda kilometers: kilometers * 1000,
    LENGTH_CENTIMETERS: lambda centimeters: centimeters * 0.01,
    LENGTH_MILLIMETERS: lambda millimeters: millimeters * 0.001,
}

METERS_TO: dict[str, Callable[[float], float]] = {
    LENGTH_METERS: lambda meters: meters,
    LENGTH_MILES: lambda meters: meters * 0.000621371,
    LENGTH_YARD: lambda meters: meters * 1.09361,
    LENGTH_FEET: lambda meters: meters * 3.28084,
    LENGTH_INCHES: lambda meters: meters * 39.3701,
    LENGTH_KILOMETERS: lambda meters: meters * 0.001,
    LENGTH_CENTIMETERS: lambda meters: meters * 100,
    LENGTH_MILLIMETERS: lambda meters: meters * 1000,
}


def convert(value: float, from_unit: str, to_unit: str) -> float:
    """Convert one unit of measurement to another."""
    report(
        (
            "uses distance utility. This is deprecated since 2022.10 and will "
            "stop working in Home Assistant 2023.4, it should be updated to use "
            "unit_conversion.DistanceConverter instead"
        ),
        error_if_core=False,
    )
    return DistanceConverter.convert(value, from_unit, to_unit)