/// <reference types="node" />
import { AxiosResponse, AxiosRequestConfig } from 'axios';

declare abstract class Base {
    protected _apiKey: string;
    private _baseUrl;
    private _http;
    constructor(apiKey: string);
    /**
     *  Function to set the client environment
     *
     * @param {apiUrl} urlPath (optional)
     *
     * @returns {void}
     */
    protected setClientSide(apiUrl: string): void;
    protected request<T, R = AxiosResponse<T>>(config: AxiosRequestConfig): Promise<T>;
    protected upload<T, R = AxiosResponse<T>>(config: AxiosRequestConfig, baseurl?: string): Promise<T>;
    private handleError;
}

interface IPrototype {
    prototype: any;
}
/**
 * Typescripy Mixing to combine classes: https://www.typescriptlang.org/docs/handbook/mixins.html
 *
 */
declare function applyCombination(derivedCtor: IPrototype, baseCtors: IPrototype[]): void;

/**
 * Functions to help unit conversions
 * @param unit to converty
 * @returns converted unit
 */
declare function convertMetersToMiles(meters: number): number;
declare function convertMilesToMeters(miles: number): number;
declare function convertMetersToFeet(meters: number): number;
declare function convertFeetToMeters(feet: number): number;
declare function convertMetersToKilometers(meters: number): number;
declare function convertKilometersToMeters(kilometers: number): number;
declare function convertMilesToKilometers(miles: number): number;
declare function convertKilometersToMiles(kilometers: number): number;
declare function metersToKilometers(meters: number): number;
declare function kilometersToMeters(kilometers: number): number;

declare const utils_d_convertMetersToMiles: typeof convertMetersToMiles;
declare const utils_d_convertMilesToMeters: typeof convertMilesToMeters;
declare const utils_d_convertMetersToFeet: typeof convertMetersToFeet;
declare const utils_d_convertFeetToMeters: typeof convertFeetToMeters;
declare const utils_d_convertMetersToKilometers: typeof convertMetersToKilometers;
declare const utils_d_convertKilometersToMeters: typeof convertKilometersToMeters;
declare const utils_d_convertMilesToKilometers: typeof convertMilesToKilometers;
declare const utils_d_convertKilometersToMiles: typeof convertKilometersToMiles;
declare const utils_d_metersToKilometers: typeof metersToKilometers;
declare const utils_d_kilometersToMeters: typeof kilometersToMeters;
declare namespace utils_d {
  export {
    utils_d_convertMetersToMiles as convertMetersToMiles,
    utils_d_convertMilesToMeters as convertMilesToMeters,
    utils_d_convertMetersToFeet as convertMetersToFeet,
    utils_d_convertFeetToMeters as convertFeetToMeters,
    utils_d_convertMetersToKilometers as convertMetersToKilometers,
    utils_d_convertKilometersToMeters as convertKilometersToMeters,
    utils_d_convertMilesToKilometers as convertMilesToKilometers,
    utils_d_convertKilometersToMiles as convertKilometersToMiles,
    utils_d_metersToKilometers as metersToKilometers,
    utils_d_kilometersToMeters as kilometersToMeters,
  };
}

declare enum ContractStatus {
    NonActive = "NonActive",
    Pending = "Pending",
    Active = "Active",
    Paused = "Paused",
    Archive = "Archive"
}
declare enum ContractEnvironment {
    Localhost = "localhost",
    Testnet = "testnet",
    Mainnet = "mainnet",
    Mezzanine = "mezzanine"
}
declare enum BlockchainTypes {
    Ethereum = "ethereum",
    Polygon = "polygon",
    Base = "base",
    Sui = "sui",
    Monad = "monad",
    Soneium = "soneium",
    None = "none"
}

declare enum ContentSource {
    tiktok = "tiktok",
    youtube = "youtube",
    youtubeMusic = "youtube-music",
    instagram = "instagram",
    x = "x",
    spotify = "spotify",
    soundcloud = "soundcloud",
    website = "website"
}
interface ICertificateProject {
    contractId: string;
    projectId: string;
    customerId: string;
    ownerWallet: string;
    projectName: string;
    ownerName: string;
    environment: ContractEnvironment;
    blockchain: BlockchainTypes;
    status: ContractStatus;
    createdTimestamp: string;
    registryProjectId?: string;
    projectBaseURI?: string;
    address?: string;
    certificatesCount?: number;
}

/**
 *
 * Main common types
 *
 */
declare enum Status {
    NON_INIT = "Non-Initialized",
    INIT = "Initializing",
    COLLECTING = "Collecting",
    SUCCESS = "Success",
    NO_LOCATION = "No-Location",
    FAILED = "Failed",
    ERROR = "Error",
    BLOCK = "Block"
}
declare enum Environment {
    DEVELOPMENT = "DEVELOPMENT",
    STAGING = "STAGING",
    PRODUCTION = "PRODUCTION"
}
declare enum DistanceUnits {
    meter = "m",
    kilometers = "km",
    miles = "mi",
    ft = "feet"
}
interface IInfoStatus {
    status: Status;
    message: string;
    data?: number;
}
interface IResults<T> {
    status: boolean;
    statusCode: number;
    message: string;
    data?: T;
}
type FormData = {
    contractId: string;
    address: string;
    fileName: string;
    fileData: Buffer;
};

export { Base, BlockchainTypes, ContentSource, ContractEnvironment, ContractStatus, DistanceUnits, Environment, FormData, ICertificateProject, IInfoStatus, IResults, utils_d as MentaportUtils, Status, applyCombination };
