import * as factory from '../../factory';
type KeyOfOffer = keyof Omit<factory.unitPriceOffer.IUnitPriceOffer, 'id'>;
type IProjection = {
    [key in KeyOfOffer]?: 0 | 1;
};
type IOfferInCatalog = factory.unitPriceOffer.IUnitPriceOffer & {
    /**
     * 集計オファー内インデックス
     */
    offerIndex?: number;
    parentOffer?: {
        id: string;
    };
    /**
     * 単価オファーID
     * 検索レスポンスに必ず含まれる
     */
    id: string;
};
interface IPriceSpecificationConditionsOnSearchWithSortIndex {
    appliesToMovieTicket?: {
        serviceType?: {
            $exists?: boolean;
        };
        serviceOutput?: {
            /**
             * 適用決済方法タイプ
             */
            typeOf?: {
                $eq?: string;
                $all?: string[];
            };
        };
    };
}
/**
 * カタログ内オファー読取リポジトリ
 */
declare abstract class OfferInCatalogReadOnlyRepo {
    /**
     * カタログIDで単価オファーを全て検索する
     * 必ずカタログデータから単価オファーIDを参照する
     */
    abstract searchAllByOfferCatalogId(params: {
        subOfferCatalog: {
            /**
             * サブカタログID
             */
            id: string;
            isOfferCatalogItem: boolean;
        };
        projection?: IProjection;
    }): Promise<{
        offers: IOfferInCatalog[];
    }>;
    /**
     * 単価オファーIDとカタログIDで単価オファーを全て検索する
     * 単価オファーIDを一定数指定する想定なのでpagingは不要
     */
    abstract searchAllByIdsAndOfferCatalogId(params: {
        /**
         * 指定したIDの単価オファーだけ取得
         */
        ids: string[];
        includedInDataCatalog: {
            /**
             * オファー記載のカタログID(複数対応)
             */
            id: string[];
            isOfferCatalogItem: boolean;
        };
        availableAtOrFrom?: {
            id?: string;
        };
        unacceptedPaymentMethod?: string[];
        excludeAppliesToMovieTicket: boolean;
        onlyValid?: boolean;
        projection?: IProjection;
    }): Promise<IOfferInCatalog[]>;
    /**
     * カタログに含まれるオファーを検索する(カタログ内ソートは保証しない)
     * カタログ内ソートインデックスはsortedOfferIdsで判断する
     */
    abstract searchByOfferCatalogIdWithSortIndex(params: {
        offerCatalog: {
            /**
             * サブカタログID
             */
            id: string;
            isOfferCatalogItem: boolean;
        };
        availableAtOrFrom?: {
            id?: string;
        };
        unacceptedPaymentMethod?: string[];
        excludeAppliesToMovieTicket: boolean;
        /**
         * 適用決済カード条件
         */
        priceSpecification: IPriceSpecificationConditionsOnSearchWithSortIndex;
        onlyValid?: boolean;
        useIncludeInDataCatalog: boolean;
        limit?: number;
        page?: number;
        projection?: IProjection;
    }): Promise<{
        offers: IOfferInCatalog[];
        /**
         * カタログ内ソートされた集計オファーIDリスト
         */
        sortedOfferIds: string[];
    }>;
    /**
     * クライアントの利用可能カタログを検索する
     */
    abstract searchAvailableCatalogs(params: {
        project: {
            id: string;
        };
        includedInDataCatalog: {
            id: string[];
        };
        availableAtOrFrom: {
            id: string;
        };
        unacceptedPaymentMethod: string[];
    }): Promise<{
        /**
         * カタログID
         */
        id: string;
    }[]>;
    abstract count(params: Omit<factory.unitPriceOffer.ISearchConditions, 'limit' | 'page' | 'sort'>): Promise<number>;
    abstract search(params: factory.unitPriceOffer.ISearchConditions, projection?: IProjection): Promise<IOfferInCatalog[]>;
}
export { KeyOfOffer, IProjection, IOfferInCatalog, IPriceSpecificationConditionsOnSearchWithSortIndex, OfferInCatalogReadOnlyRepo };
