import type { Metadata } from "./metadata";
import type { Reference, ReferencesByInstant } from "./references";
export interface AmountBracket extends BracketBase {
    amount: {
        [instant: string]: NumberValue | "expected";
    };
}
export interface AmountBracketAtInstant extends BracketAtInstantBase {
    amount: NumberValue | "expected";
}
export interface BooleanParameter extends ValueParameterBase {
    type: ValueType.Boolean;
    values: {
        [instant: string]: MaybeBooleanValue | "expected";
    };
}
export interface BooleanValue extends ValueBase {
    value: boolean;
}
export type Bracket = AmountBracket | RateBracket;
export type BracketAtInstant = AmountBracketAtInstant | RateBracketAtInstant;
export interface BracketAtInstantBase {
    threshold: MaybeNumberValue | "expected";
}
export interface BracketBase {
    threshold: {
        [instant: string]: MaybeNumberValue | "expected";
    };
}
export type BracketValueAtInstant = MaybeNumberValue | NumberValue | "expected";
export interface LinearAverageRateScaleParameter extends ScaleParameterBase {
    brackets: RateBracket[];
    rate_unit?: string;
    type: ScaleType.LinearAverageRate;
}
export interface MarginalAmountScaleParameter extends ScaleParameterBase {
    amount_unit?: string;
    brackets: AmountBracket[];
    type: ScaleType.MarginalAmount;
}
export interface MarginalRateScaleParameter extends ScaleParameterBase {
    brackets: RateBracket[];
    rate_unit?: string;
    type: ScaleType.MarginalRate;
}
export interface MaybeBooleanValue extends ValueBase {
    value: boolean | null;
}
export interface MaybeNumberValue extends ValueBase {
    value: number | null;
}
export interface MaybeStringArrayValue extends ValueBase {
    value: Array<string | null> | null;
}
export interface MaybeStringByStringValue extends ValueBase {
    value: {
        [key: string]: string | null;
    } | null;
}
export interface NodeParameter extends ParameterBase {
    children?: {
        [id: string]: Parameter;
    };
    class: ParameterClass.Node;
    order?: string[];
    unit?: string;
}
export interface NumberValue extends ValueBase {
    value: number;
}
export interface NumberParameter extends ValueParameterBase {
    type: ValueType.Number;
    values: {
        [instant: string]: MaybeNumberValue | "expected";
    };
}
export type OfficialJournalDatesByInstant = {
    [instant: string]: string | null;
};
export type Parameter = NodeParameter | ScaleParameter | ValueParameter;
export interface ParameterBase {
    class: ParameterClass;
    description?: string;
    label_en?: string;
    documentation?: string;
    documentation_start?: boolean;
    file_path?: string;
    id?: string;
    inflator?: string;
    inflator_reference?: ReferencesByInstant;
    last_value_still_valid_on?: string;
    name?: string;
    notes?: ReferencesByInstant;
    official_journal_date?: OfficialJournalDatesByInstant;
    parent?: NodeParameter;
    reference?: ReferencesByInstant;
    referring_variables?: string[];
    short_label?: string;
    short_label_en?: string;
    title?: string;
    titles?: string[];
}
export declare enum ParameterClass {
    Node = "Node",
    Scale = "Scale",
    Value = "Value"
}
export interface ParameterWithAncestors {
    parameter: Parameter;
    ancestors: NodeParameter[];
}
export interface RateBracket extends BracketBase {
    base?: {
        [instant: string]: NumberValue | "expected";
    };
    rate: {
        [instant: string]: MaybeNumberValue | "expected";
    };
}
export interface RateBracketAtInstant extends BracketAtInstantBase {
    base?: NumberValue | "expected";
    rate: MaybeNumberValue | "expected";
}
export type ScaleAtInstant = BracketAtInstant[];
export type ScaleParameter = LinearAverageRateScaleParameter | MarginalAmountScaleParameter | MarginalRateScaleParameter | SingleAmountScaleParameter;
export interface ScaleParameterBase extends ParameterBase {
    brackets: AmountBracket[] | RateBracket[];
    class: ParameterClass.Scale;
    ipp_csv_id?: string | {
        [bracketName: string]: string;
    };
    threshold_unit?: string;
    type: ScaleType;
}
export declare enum ScaleType {
    LinearAverageRate = "linear_average_rate",
    MarginalAmount = "marginal_amount",
    MarginalRate = "marginal_rate",
    SingleAmount = "single_amount"
}
export interface SingleAmountScaleParameter extends ScaleParameterBase {
    amount_unit?: string;
    brackets: AmountBracket[];
    type: ScaleType.SingleAmount;
}
export interface StringArrayParameter extends ValueParameterBase {
    type: ValueType.StringArray;
    values: {
        [instant: string]: MaybeStringArrayValue;
    };
}
export interface StringByStringParameter extends ValueParameterBase {
    type: ValueType.StringByString;
    values: {
        [instant: string]: MaybeStringByStringValue;
    };
}
export type ValueAtInstant = BooleanValue | MaybeBooleanValue | MaybeNumberValue | MaybeStringArrayValue | MaybeStringByStringValue | NumberValue | "expected";
export interface ValueBase {
    reference?: Reference[];
    unit?: string;
    value?: unknown;
}
export type ValueParameter = BooleanParameter | NumberParameter | StringArrayParameter | StringByStringParameter;
export interface ValueParameterBase extends ParameterBase {
    class: ParameterClass.Value;
    ipp_csv_id?: string;
    type: ValueType;
    unit?: string;
    values: {
        [instant: string]: ValueAtInstant;
    };
}
export declare enum ValueType {
    Boolean = "boolean",
    Number = "number",
    StringArray = "string_array",
    StringByString = "string_by_string"
}
export declare function accessParameterFromIds(parameter: Parameter, ids: string[]): [Parameter, unknown];
export declare function bracketsFromScaleByInstant(scaleByInstant: {
    [instant: string]: ScaleAtInstant;
}): AmountBracket[] | RateBracket[];
export declare function improveParameter(parameter: Parameter, parent?: NodeParameter | undefined | null, ids?: string[]): void;
export declare function isAmountScaleParameter(parameter: ScaleParameter): boolean;
export declare function isRateScaleParameter(parameter: ScaleParameter): boolean;
export declare function isVectorialNodeParameter(node: NodeParameter): boolean;
export declare function iterParameterAncestors(parameter?: Parameter | undefined | null): Generator<Parameter, void, unknown>;
export declare function mergeParameters(parameters: Parameter[]): {
    [id: string]: Parameter;
};
export declare function mergeReferences(references1: Reference[] | undefined | null, references2: Reference[] | undefined | null): Reference[] | undefined;
export declare function newParameterRepositoryUrl(metadata: Metadata, parameter: Parameter): string | undefined;
export declare function parameterLastReviewOrChange(parameter: Parameter): string | undefined;
export declare function parameterWithoutChildren(parameter: Parameter): Parameter;
export declare function patchParameter<ParameterType extends Parameter>(parameter: ParameterType, patch: {
    [key: string]: unknown;
}): ParameterType;
export declare function scaleByInstantFromBrackets(brackets: Bracket[]): {
    [instant: string]: ScaleAtInstant;
};
export declare function scaleParameterUsesBase(parameter: ScaleParameter): boolean;
export declare function walkParameters(parameter: Parameter, depthFirst?: boolean): Generator<Parameter, void, unknown>;
