/**
 * @description This is the base service class
 * @generator Jsm
 * @author dr. Salmi <reevosolutions@gmail.com>
 * @since 05-03-2024 07:06:13
 */
import Joi from "joi";
import exceptions from "jsm-exceptions";
import { JsmLogger } from "jsm-logger";
import mongoose from "mongoose";
import { JsmCoreSdk } from "jsm-sdk";
/**
 * This is the base service class
 */
export declare class BaseService<Sdk extends JsmCoreSdk = JsmCoreSdk> {
    protected logger: JsmLogger;
    protected _sdk: Sdk;
    constructor();
    /**
     * This method is used to log errors
     * @param {Function} method
     * @param {Error} error
     * @param {Jsm.Core.Security.AuthData} authData
     * @param {string} related_to
     * @param {any} scenario
     */
    logError(method: Function, error: typeof exceptions.JsmException | Joi.ValidationError | Error, authData?: Jsm.Core.Security.AuthData | null, related_to?: string, scenario?: Jsm.Core.Library.ExecutionScenario.Scenario): void;
    /**
     * @description This method is used to log execution results
     * @param {Function} method
     * @param {Object} result
     * @param {Jsm.Core.Security.AuthData} auth_data
     * @param {any} scenario
     */
    logExecutionResult(method: Function, result: any, auth_data?: Jsm.Core.Security.AuthData, scenario?: any, is_error?: boolean): Promise<void>;
    getPaginationOptions(count: number, page: number): {
        skip: number;
        take: number;
    };
    /**
     *
     * @param {"asc" | "desc"} sort
     * - @default "desc"
     * @param {string} sort_by
     * - @default
     *    - "created_at"  if prefer_update_date = false
     *    - "updated_at" if prefer_update_date = true
     * @param {boolean} prefer_update_date
     * - @default false
     * @returns
     */
    getSortOptions(sort: "asc" | "desc", sort_by?: string, prefer_update_date?: boolean): {
        [key: string]: 1 | -1;
    };
    getSelectFields<Q extends mongoose.Query<any[], any>>(q: Q, fields?: string | string[]): Q;
    analyzeMongodbQuery(q: mongoose.QueryWithFuzzySearch<any>): Promise<void>;
    get sdk(): Sdk;
    flattenUpdateObject(updateObj: Record<string, any>): Record<string, any>;
    /**
     * @description This method is used to get the internal authentication data
     * @author dr. Salmi <reevosolutions@gmail.com>
     * @since 23-05-2024 06:40:43
     */
    get internalAuthData(): {
        current: {
            service: {
                name: Jsm.Core.Utils.SystemStructure.TMicroService | string;
                is_external: boolean;
            };
        };
    };
    /**
     * Update : generateSdkRequestConfigFromAuthData
     * @description used to port the authentication credentials between the services
     * @author dr. Salmi <reevosolutions@gmail.com>
     * @since 23-05-2024 06:39:42
     */
    generateSdkRequestConfigFromAuthData(authData: Jsm.Core.Security.AuthData, setInternalAuthData?: boolean): Jsm.Sdk.TRequestConfig | undefined;
    dispatchEvent<T = any>(eventName: string, payload: T): void;
    protected initScenario<T extends {
        [Key: string]: any;
    }, F extends Function, Args extends Record<string, any> = {}>(logger: JsmLogger, method: F, args?: Args, authData?: Jsm.Core.Security.AuthData): ExcecutionScenario<T>;
    calculateTimePeriod(timePeriod: {
        granularity?: "minute" | "hour" | "day" | "week" | "month" | "quarter" | "year";
        timezone?: string;
    } & ({
        start: Date;
        end: Date;
        preset: "custom";
    } | {
        preset: "today" | "yesterday" | "last_7_days" | "last_30_days" | "last_90_days" | "last_year";
    })): {
        now: Date;
        startDate: Date;
        endDate: Date;
        granularity: "year" | "month" | "week" | "day" | "hour" | "minute" | "quarter";
        timezone: string | undefined;
        preset: string | undefined;
    };
}
export declare class ExcecutionScenario<T extends {
    [Key: string]: any;
} = {}> implements Jsm.Core.Library.ExecutionScenario.Scenario<T> {
    _class: string;
    method: string;
    args: Record<string, any>;
    authData: Jsm.Core.Security.AuthData;
    execution: T;
    private timer;
    private logger;
    constructor(_class: string, logger: JsmLogger, method: string, args?: Record<string, any>, authData?: Jsm.Core.Security.AuthData | null);
    set<K extends string | {
        [Key: string]: any;
    } = string>(key: K, value?: K extends string ? any : never): this;
    get(key: string): any;
    progress(logger: JsmLogger, progress: number, message: string): void;
    /**
     * @description This method is used to log execution results
     * @param {Function} method
     * @param {Object} result
     * @param {Jsm.Core.Security.AuthData} auth_data
     * @param {any} scenario
     */
    log(purpose?: "error" | "success" | "warn"): Promise<void>;
    end(purpose?: "error" | "success" | "warn"): Promise<void>;
    step(logger: JsmLogger, data: any): Promise<void>;
    /**
     * This method is used to log errors
     * @param {Function} method
     * @param {Error} error
     * @param {Jsm.Core.Security.AuthData} authData
     * @param {string} related_to
     * @param {any} scenario
     */
    error(error: typeof exceptions.JsmException | Joi.ValidationError | Error): void;
}
