import { Product } from '../../interfaces/product';
import { ProductsService } from './products.service';
import { CartService } from '../cart.service';
import { ToastService } from '../../utils/toast.service';
import { Constants } from '../../core.consts';
import { AnalyticsService } from '../analytics.service';
import { ParamsProductsWithUniqueVariant } from '../../interfaces/paramsInterfaces/paramsProductsWithUniqueVariant';
export declare class ProductDetailService {
    private productsService;
    private cartService;
    private toastrService;
    private constants;
    analyticsService: AnalyticsService;
    private productSubject;
    private optionsSubject;
    private asociatedDataSubject;
    private variants;
    product$: import("rxjs").Observable<Product>;
    options$: import("rxjs").Observable<any>;
    asociatedData$: import("rxjs").Observable<any>;
    constructor(productsService: ProductsService, cartService: CartService, toastrService: ToastService, constants: Constants, analyticsService: AnalyticsService);
    /**
    * @param code Identificador del producto
    * @param variant Indica si se está solicitando un producto por su codigo, o por el codigo correspondiente a una de sus variantes
    *
    * Carga el producto solicitado asyncronicamente sin respuesta
    */
    loadProduct: (code: any, variant?: boolean) => Promise<void>;
    /**
     * @param product_id Identificador del producto
     * @param variant Indica si se está solicitando un producto por su codigo, o por el codigo correspondiente a una de sus variantes
     * @async
     *
     * A diferencia del metodo loadProduct, este retorna un valor cuando termina
     */
    getProduct: (product_id: any, variant?: boolean) => Promise<boolean>;
    private initialize;
    setProduct: (product: any) => void;
    isReady: () => boolean;
    setOption: (option_code: any, option_value: any) => void;
    changePicture: (picture: any) => void;
    handleError: (error: any) => void;
    addToCart(quantity: any): void;
    addToCartPromise: (quantity: any) => Promise<boolean | {
        error: boolean;
        message: string;
    }>;
    private getOptions;
    private toOption;
    private makeAffordableProduct;
    private updateVariants;
    private updateOptions;
    private generateAsociatedDataFromVariants;
    private crateDiscount;
    private cratePrice;
    private crateSalePrice;
    private inRange;
    private validateQuantity;
    private isProductValid;
    /**
     *
     * @param options Array de Variantes y sus valores
     *
     * @description Retorna una lista filtrada de las variantes que estan seleccionadas
     */
    private getVariantsSelected;
    /**
     *
     * @param options Array de Variantes y sus valores
     * @param variants Todas las variantes disponibles del producto
     *
     * @description retorna todas las variantes disponibles a seleccion y su stock
     */
    getVariantsAvailable(options: any, variants: any, optionsException: Array<any>): any;
    /**
     *
     * @param options Array de variantes y sus valores
     * @param code Codigo de la variante a buscar
     * @param name nombre de la variante a buscar
     * @param variants variantes del producto
     *
     * @description busca en la lista de variantes disponibles si hay de ese codigo, ese nombre y con stock
     */
    existVariantAndHasStock(options: any, code: any, name: any, variants: any, optionsException?: any[]): boolean;
    /**
     *
     * @param product producto el cual se quiere desdoblar por variantes por una opción.
     * @param withOption 'type' tipo de opción, code: código de la opción. 'defaultFirstOption': en caso de que no se pueda desdoblar por la opción indicada si el valor es verdadero se intentara desdoblar por la primera opción asociada al producto.
     * 'checkIfStock': en caso de que esta valor sea verdadero se realiza un control de que la variantes cuenten con stock para ser un producto desdoblado por la variante, si el valor es falso no se realiza dicho control y el producto se desdoblara con stock en 0.
     * @returns arreglo con el producto desdoblado por la variante solicitada.
     * (opción por defecto que se intenta hacer el desdoblamiento 'color', o bien si en le parámetro withOption el atributo 'defaultFirstOption' es verdadero se desdobla por la primera opción asociada al producto )
     */
    getProductWithUniqueVariant: (product: any, withOption?: ParamsProductsWithUniqueVariant) => any;
}
