import { BaseRegionResponse, RegionsResponse, Unit } from '../services';
import { IKosDataModel } from '../../../../core';

export interface UnitSource {
    system?: string;
    measure?: string;
    unit?: string;
}
export type MeasureMapKeys = string | "default";
export type SystemMeasureMap = Record<MeasureMapKeys, Unit>;
export type MeasureMap = Record<string, SystemMeasureMap>;
export type SystemDefaultMap = Record<string, string>;
export type DefaultMeasureMap = Record<string, SystemDefaultMap>;
export interface RegionInfoOptions {
}
interface BaseOptions {
    id: string;
}
interface FormatOptions extends BaseOptions {
    format: string;
}
/**
 * Interface for time format options, extending FormatOptions.
 * @internal
 **/
export interface TimeFormatOptions extends FormatOptions {
    ampm: boolean;
}
/**
 * Interface for date format options, extending FormatOptions.
 * @internal
 **/
export interface DateFormatOptions extends FormatOptions {
    order: string;
}
/**
 * Interface for unit system options, extending BaseOptions.
 * @internal
 **/
export interface UnitSystemOptions extends BaseOptions {
    name: string;
}
/**
 * Represents a model for region information, extending the basic region options and data model.
 * It allows for managing regional settings and unit conversions.
 *
 * @category Model
 * @template AdditionalData - Extends the base region response to include additional data as needed.
 */
export interface RegionInfoModel<AdditionalData extends BaseRegionResponse = BaseRegionResponse> extends RegionInfoOptions, IKosDataModel {
    /** Unique identifier for the region model instance. */
    readonly id: string;
    /** The default unit system (e.g., metric or imperial) for the region. */
    readonly defaultUnitSystem: string;
    /** The currently selected unit system. */
    readonly selectedUnitSystem: string;
    /** The currently selected time format as a string. */
    readonly selectedTimeFormat: string;
    /** The currently selected date format as a string. */
    readonly selectedDateFormat: string;
    /** The order of date elements (e.g., day/month/year) for the selected format. */
    readonly selectedDateOrder: string;
    /** The currently selected country. */
    readonly selectedCountry: string;
    /** The currently selected time zone. */
    readonly selectedTimeZone: string;
    /**
     * The detailed information of the selected region, extended with additional data.
     * The type of additional data is determined by the generic parameter `AdditionalData`.
     */
    selectedRegion: RegionsResponse<AdditionalData>;
    /** Flag indicating if the 12-hour time format (AM/PM) is used. */
    is12HourTimeFormat: boolean;
    /** An array of available regions as strings. */
    availableRegions: string[];
    /** Identifier of the region. */
    regionId: string;
    readonly dateFormatId: string;
    readonly timeFormatId: string;
    readonly unitSystemId: string;
    /** An array of available time zones as strings. */
    timeZones: string[];
    /** An array of all available time zones as strings. */
    allTimeZones: string[];
    /** Time format options available for selection. */
    readonly timeFormatOptions: TimeFormatOptions[];
    /** Date format options available for selection. */
    readonly dateFormatOptions: DateFormatOptions[];
    /** Unit system options available for selection. */
    readonly unitSystemOptions: UnitSystemOptions[];
    /**
     * Converts a value from one unit to another.
     *
     * @param value - The numerical value to convert.
     * @param from - The unit source to convert from.
     * @param to - The unit source to convert to.
     * @returns The converted value as a string.
     * @internal
     */
    convert(value: number, from: UnitSource, to: UnitSource): string;
    /**
     * Sets the selected time format.
     *
     * @param id - The identifier of the time format to select.
     */
    setSelectedTimeFormat(id: string): void;
    /**
     * Sets the selected date format.
     *
     * @param id - The identifier of the date format to select.
     */
    setSelectedDateFormat(id: string): void;
    /**
     * Sets the selected unit system.
     *
     * @param id - The identifier of the unit system to select.
     */
    setSelectedUnitSystem(id: string): void;
    /**
     * Retrieves the default unit for a given measure in a specified unit system.
     *
     * @param measure - The measure for which to get the default unit.
     * @param unitSystem - The unit system in which to find the default unit.
     * @returns The default unit for the specified measure and system.
     */
    getDefaultUnitForMeasure(measure: string, unitSystem: string): string;
    /**
     * Retrieves the measure associated with a given unit.
     *
     * @param unit - The unit for which to get the measure.
     * @returns The measure associated with the specified unit.
     *
     * @internal
     */
    getUnitMeasure: (unit: string) => string;
    /**
     *
     * @internal
     */
    getUnitSystem: (unit?: string) => string;
    /**
     * Retrieves the default number of decimal places for a unit in a given measure and system.
     *
     * @param measure - The measure to consider.
     * @param unitSystem - The unit system in which the unit is defined.
     * @param unit - Optional specific unit to consider.
     * @returns The number of decimal places for the unit.
     */
    getDefaultUnitDecimalPlaces(measure: string, unitSystem: string, unit?: string): number;
}
export declare enum UnitTupleKeys {
    family = 0,
    scale = 1,
    offset = 2,
    decimals = 3,
    alias = 4,
    system = 5
}
export type UnitTuple = [
    family: string,
    scale: number,
    offset: number,
    decimals: number,
    alias: string,
    system: string
];
export {};
//# sourceMappingURL=index.d.ts.map