import { Observable } from 'rxjs';
import 'rxjs/add/operator/map';
import { ConnectionService } from '../../api/connection.service';
import { Constants } from '../../core.consts';
import { Product } from '../../interfaces/product';
import { FilterType, FilterElement, DefaultFilter } from '../../interfaces/filter';
import { PaginationService } from '../pagination.service';
import { OptionsService } from '../options.service';
import { Filter } from '../../classes/filters/Filter';
import 'rxjs/add/operator/catch';
import { ParamsProductsWithUniqueVariant } from '../../interfaces/paramsInterfaces/paramsProductsWithUniqueVariant';
export declare class ProductsService {
    private connection;
    private constants;
    private pagination;
    private options;
    /** ATTRIBUTES */
    private subscription;
    private productsSubject;
    private filtersSubject;
    currency: string;
    catalogMode: boolean;
    products$: Observable<Product[]>;
    filters$: Observable<Filter[]>;
    private search_value;
    /** APIS */
    latestProductsByCategoryApi: (category: any) => string;
    latestProductsApi: () => string;
    specificProductApi: (code: any, variant: any) => string;
    productsBySpecialMarkApi: (specialmark: any) => string;
    relatedProductsApi: (key: any) => string;
    productVariantApi: (code: any) => string;
    latestProductsByAttributeApi: (attribute: any) => string;
    productSearchApi: () => string;
    cmsRelatedProductsApi: (page: any) => string;
    productsFilterApi: (filters?: string) => string;
    constructor(connection: ConnectionService, constants: Constants, pagination: PaginationService, options: OptionsService);
    /** FUNCTIONS */
    getLatestProducts: (limit?: string) => Observable<any>;
    getLatestProductsByCategory: (category: string, limit?: string) => Observable<any>;
    getPaginated: (limit: string, page: string) => Observable<any>;
    getSpecificProduct: (code: string, variant: boolean) => Observable<any>;
    getProductsBySpecialMark: (specialmark: any, limit?: string) => Observable<any>;
    getRelatedProducts: (key: string) => Observable<any>;
    getProductVariant: (code: string) => Observable<any>;
    getlatestProductsByAttribute: (attribute: any) => Observable<any>;
    getSearchedProducts: (content: any) => void;
    getCMSRelatedProducts: (page: any) => Observable<any>;
    getProductsSearched: (search_value: any, filters?: FilterType[]) => void;
    /**
     * @param products
     * @param filters
     * @param search_value
     * @param defaultFilters
     */
    getProductsForFilter: (products?: {
        type?: string;
        value?: string;
        limit?: number;
        latest?: boolean;
    }, filters?: FilterType[], search_value?: any, defaultFilters?: DefaultFilter[]) => void;
    setFilters: (products: any, filters: FilterType[], defaultFilters?: DefaultFilter[]) => void;
    getFilterInstance: (filter: string, products: any) => Filter;
    updateDynamicFilters: (request: any) => void;
    getNext: () => boolean;
    setFilterSelected: (filterObj: Filter, filterElem: FilterElement) => void;
    updateProductsForFilter: () => void;
    /**
     *
     * @param products  Array. Lista de productos.
     * @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 los productos desdoblados por la opción 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 )
     *
     * @description Recibe una lista de productos y retorna los mismos productos tantas veces como variantes tenga.
     * cada producto retornado tendrá una única variante.
     */
    getProductsWithUniqueVariant: (products: any, withOption?: ParamsProductsWithUniqueVariant) => any;
    productWithVariantValues: (product: any, variant: any, optionValue: any) => any;
    cleanAllFilters: () => void;
    /** UTILS AND FILTERING */
    isWaiting: () => boolean;
    isFinished: () => any;
    generateFinalApi: (search_value?: any) => string;
    finished: () => Observable<boolean>;
    getTotal: () => number;
}
