import { r as NarouSearchResult, d as SearchResultFieldNames, a as ParamsBaseWithOrder, q as GzipLevel, S as SearchParams, g as Order, o as NovelTypeParam, m as BuntaiParam, D as DateParam, N as NarouSearchResults, j as BigGenre, G as Genre, F as Fields, u as SearchResultFields, O as OptionalFields, v as SearchResultOptionalFields, y as PickedNarouSearchResult, b as RankingParams, c as RankingHistoryParams, U as UserSearchParams, s as UserSearchResult } from './narou-search-results-DT0YdaBn.js';
import { RankingHistoryRawResult } from './ranking-history.js';
import { Join } from './util/type.js';

type DefaultSearchResultFields = keyof Omit<NarouSearchResult, "weekly_unique" | "noveltype" | "nocgenre" | "xid">;
declare abstract class SearchBuilderBase<TParams extends ParamsBaseWithOrder<TOrder>, TOrder extends string> {
    protected params: TParams;
    protected api: NarouNovel;
    /**
     * constructor
     * @private
     * @param params クエリパラメータ
     * @param api NarouNovel インスタンス
     */
    constructor(params: TParams | undefined, api: NarouNovel);
    /**
     * 配列から重複を除去する
     * @protected
     * @static
     * @param array 配列
     * @returns 重複を除去した配列
     */
    protected static distinct<T>(array: readonly T[]): T[];
    /**
     * 配列をハイフン区切りの文字列に変換する
     * @protected
     * @static
     * @param n 文字列または数値の配列、あるいは単一の文字列または数値
     * @returns ハイフン区切りの文字列
     */
    protected static array2string<T extends string | number>(n: T | readonly T[]): Join<T>;
    /**
     * 取得件数を指定する (lim)
     * @param num 取得件数 (1-500)
     * @return {this}
     */
    limit(num: number): this;
    /**
     * 取得開始位置を指定する (st)
     * @param num 取得開始位置 (1-)
     * @return {this}
     */
    start(num: number): this;
    /**
     * ページ番号と1ページあたりの件数で取得範囲を指定する
     * @param no ページ番号 (0-)
     * @param count 1ページあたりの件数 (デフォルト: 20)
     * @return {this}
     */
    page(no: number, count?: number): this;
    /**
     * 出力順序を指定する (order)
     * 指定しない場合は新着順となります。
     * @param {TOrder} order 出力順序
     * @return {this}
     */
    order(order: TOrder): this;
    /**
     * gzip圧縮レベルを指定する (gzip)
     *
     * 転送量上限を減らすためにも推奨
     * @param {GzipLevel} level gzip圧縮レベル(1～5)
     * @return {this}
     */
    gzip(level: GzipLevel): this;
    /**
     * クエリパラメータをセットする
     * @protected
     * @param obj セットするパラメータ
     * @return {this}
     */
    protected set(obj: TParams): this;
    /**
     * クエリパラメータを削除する
     * @protected
     * @param key 削除するパラメータのキー
     * @returns {this}
     */
    protected unset(key: keyof TParams): this;
}
declare abstract class NovelSearchBuilderBase<T extends SearchResultFieldNames> extends SearchBuilderBase<SearchParams, Order> {
    /**
     * 検索語を指定します (word)。
     * 半角または全角スペースで区切るとAND抽出になります。部分一致でHITします。
     * @param word 検索語
     * @return {this}
     */
    word(word: string): this;
    /**
     * 除外したい単語を指定します (notword)。
     * スペースで区切ることにより除外する単語を増やせます。部分一致で除外されます。
     * @param word 除外語
     * @return {this}
     */
    notWord(word: string): this;
    /**
     * 検索対象を作品名に限定するかどうかを指定します (title)。
     * @param bool trueの場合、作品名を検索対象とする (デフォルト: true)
     * @return {this}
     */
    byTitle(bool?: boolean): this;
    /**
     * 検索対象をあらすじに限定するかどうかを指定します (ex)。
     * @param bool trueの場合、あらすじを検索対象とする (デフォルト: true)
     * @return {this}
     */
    byOutline(bool?: boolean): this;
    /**
     * 検索対象をキーワードに限定するかどうかを指定します (keyword)。
     * @param bool trueの場合、キーワードを検索対象とする (デフォルト: true)
     * @return {this}
     */
    byKeyword(bool?: boolean): this;
    /**
     * 検索対象を作者名に限定するかどうかを指定します (wname)。
     * @param bool trueの場合、作者名を検索対象とする (デフォルト: true)
     * @return {this}
     */
    byAuthor(bool?: boolean): this;
    /**
     * ボーイズラブ作品を抽出または除外します (isbl/notbl)。
     * @param bool trueの場合、ボーイズラブ作品を抽出する (デフォルト: true)。falseの場合、除外する。
     * @return {this}
     */
    isBL(bool?: boolean): this;
    /**
     * ガールズラブ作品を抽出または除外します (isgl/notgl)。
     * @param bool trueの場合、ガールズラブ作品を抽出する (デフォルト: true)。falseの場合、除外する。
     * @return {this}
     */
    isGL(bool?: boolean): this;
    /**
     * 残酷な描写あり作品を抽出または除外します (iszankoku/notzankoku)。
     * @param bool trueの場合、残酷な描写あり作品を抽出する (デフォルト: true)。falseの場合、除外する。
     * @return {this}
     */
    isZankoku(bool?: boolean): this;
    /**
     * 異世界転生作品を抽出または除外します (istensei/nottensei)。
     * @param bool trueの場合、異世界転生作品を抽出する (デフォルト: true)。falseの場合、除外する。
     * @return {this}
     */
    isTensei(bool?: boolean): this;
    /**
     * 異世界転移作品を抽出または除外します (istenni/nottenni)。
     * @param bool trueの場合、異世界転移作品を抽出する (デフォルト: true)。falseの場合、除外する。
     * @return {this}
     */
    isTenni(bool?: boolean): this;
    /**
     * 異世界転生または異世界転移作品を抽出します (istt)。
     * @return {this}
     */
    isTT(): this;
    /**
     * 抽出する作品の文字数を指定します (length)。
     * 範囲指定する場合は、最小文字数と最大文字数をハイフン(-)記号で区切ってください。
     * @param length 文字数、または[最小文字数, 最大文字数]
     * @return {this}
     */
    length(length: number | readonly number[]): this;
    /**
     * 抽出する作品の会話率を%単位で指定します (kaiwaritu)。
     * @param num 会話率(%)
     * @return {this}
     */
    kaiwaritu(num: number): this;
    /**
     * 抽出する作品の会話率を%単位で範囲指定します (kaiwaritu)。
     * @param min 最低会話率(%)
     * @param max 最高会話率(%)
     * @return {this}
     */
    kaiwaritu(min: number, max: number): this;
    /**
     * 抽出する作品の挿絵数を指定します (sasie)。
     * @param num 挿絵数、または[最小挿絵数, 最大挿絵数]
     * @return {this}
     */
    sasie(num: number | readonly number[]): this;
    /**
     * 抽出する作品の予想読了時間を分単位で指定します (time)。
     * @param num 読了時間(分)、または[最小読了時間, 最大読了時間]
     * @return {this}
     */
    time(num: number | readonly number[]): this;
    /**
     * Nコードを指定して取得します (ncode)。
     * @param ncodes Nコード、またはNコードの配列
     * @return {this}
     */
    ncode(ncodes: string | readonly string[]): this;
    /**
     * 抽出する小説タイプを指定します (type)。
     * @param type 小説タイプ (t: 短編, r: 連載中, er: 完結済連載小説, ter: 短編と完結済連載小説, re: 連載中と完結済連載小説)
     * @return {this}
     */
    type(type: NovelTypeParam): this;
    /**
     * 抽出する作品の文体を指定します (buntai)。
     * 複数指定する場合はハイフン(-)で区切ってください。
     * @param buntai 文体コード、または文体コードの配列
     * @return {this}
     */
    buntai(buntai: BuntaiParam | readonly BuntaiParam[]): this;
    /**
     * 連載停止中作品に関する指定をします (stop)。
     * @param bool trueの場合、長期連載停止中のみ取得する (デフォルト: true)。falseの場合、長期連載停止中を除外する。
     * @return {this}
     */
    isStop(bool?: boolean): this;
    /**
     * ピックアップ作品のみを取得します (ispickup)。
     * @return {this}
     */
    isPickup(): this;
    /**
     * 最終更新日時を指定します (lastup)。
     * @param date 最終更新日時 (YYYYMMDDhhmmss形式またはUNIXタイムスタンプ)
     * @return {this}
     */
    lastUpdate(date: DateParam): this;
    /**
     * 最終更新日時の範囲を指定します (lastup)。
     * @param from 開始日時 (UNIXタイムスタンプ)
     * @param to 終了日時 (UNIXタイムスタンプ)
     * @return {this}
     */
    lastUpdate(from: number, to: number): this;
    /**
     * 最終更新日時の範囲を指定します (lastup)。
     * @param from 開始日時 (Dateオブジェクト)
     * @param to 終了日時 (Dateオブジェクト)
     * @return {this}
     */
    lastUpdate(from: Date, to: Date): this;
    /**
     * 作品の更新日時を指定します (lastupdate)。
     * @param date 作品の更新日時 (YYYYMMDDhhmmss形式またはUNIXタイムスタンプ)
     * @return {this}
     */
    lastNovelUpdate(date: DateParam): this;
    /**
     * 作品の更新日時の範囲を指定します (lastupdate)。
     * @param from 開始日時 (UNIXタイムスタンプ)
     * @param to 終了日時 (UNIXタイムスタンプ)
     * @return {this}
     */
    lastNovelUpdate(from: number, to: number): this;
    /**
     * 作品の更新日時の範囲を指定します (lastupdate)。
     * @param from 開始日時 (Dateオブジェクト)
     * @param to 終了日時 (Dateオブジェクト)
     * @return {this}
     */
    lastNovelUpdate(from: Date, to: Date): this;
    /**
     * なろう小説APIへの検索リクエストを実行する
     * @returns {Promise<NarouSearchResults>} 検索結果
     */
    execute(): Promise<NarouSearchResults<NarouSearchResult, T>>;
}
/**
 * 検索ヘルパー
 * @class SearchBuilder
 */
declare class SearchBuilder<T extends keyof NarouSearchResult = DefaultSearchResultFields, TOpt extends keyof NarouSearchResult = never> extends NovelSearchBuilderBase<T | TOpt> {
    /**
     * 大ジャンルを指定して取得します (biggenre)。
     * 複数指定する場合はハイフン(-)で区切ってください。
     * @param genre 大ジャンルコード、または大ジャンルコードの配列
     * @return {this}
     */
    bigGenre(genre: BigGenre | readonly BigGenre[]): this;
    /**
     * 除外したい大ジャンルを指定します (notbiggenre)。
     * 複数指定する場合はハイフン(-)で区切ってください。
     * @param genre 除外する大ジャンルコード、または大ジャンルコードの配列
     * @return {this}
     */
    notBigGenre(genre: BigGenre | readonly BigGenre[]): this;
    /**
     * ジャンルを指定して取得します (genre)。
     * 複数指定する場合はハイフン(-)で区切ってください。
     * @param genre ジャンルコード、またはジャンルコードの配列
     * @return {this}
     */
    genre(genre: Genre | readonly Genre[]): this;
    /**
     * 除外したいジャンルを指定します (notgenre)。
     * 複数指定する場合はハイフン(-)で区切ってください。
     * @param genre 除外するジャンルコード、またはジャンルコードの配列
     * @return {this}
     */
    notGenre(genre: Genre | readonly Genre[]): this;
    /**
     * ユーザIDを指定して取得します (userid)。
     * 複数指定する場合はハイフン(-)で区切ってください。
     * @param ids ユーザID、またはユーザIDの配列
     * @return {this}
     */
    userId(ids: number | readonly number[]): this;
    /**
     * R15作品を抽出または除外します (isr15/notr15)。
     * @param bool trueの場合、R15作品を抽出する (デフォルト: true)。falseの場合、除外する。
     * @return {this}
     */
    isR15(bool?: boolean): this;
    /**
     * 出力する項目を個別に指定します (of)。
     * 未指定時は全項目出力されます。転送量軽減のため、このパラメータの使用が推奨されます。
     * 複数項目を出力する場合はハイフン(-)記号で区切ってください。
     * @param fields 出力するフィールド名、またはフィールド名の配列
     * @return {SearchBuilder<SearchResultFields<TFields>, TOpt>} 型が更新されたビルダー
     */
    fields<TFields extends Fields>(fields: TFields | readonly TFields[]): SearchBuilder<SearchResultFields<TFields>, TOpt>;
    /**
     * 出力オプション項目を指定します (opt)。
     * 複数項目を出力する場合はハイフン(-)記号で区切ってください。
     * @param option 出力するオプションフィールド名、またはオプションフィールド名の配列
     * @return {SearchBuilder<T, SearchResultOptionalFields<TFields>>} 型が更新されたビルダー
     */
    opt<TFields extends OptionalFields>(option: TFields | readonly TFields[]): SearchBuilder<T, SearchResultOptionalFields<TFields>>;
}

/**
 * ランキングAPIの結果
 * @see https://dev.syosetu.com/man/rankapi/#output
 */
interface NarouRankingResult {
    /** Nコード */
    ncode: string;
    /** 順位 */
    rank: number;
    /** ポイント */
    pt: number;
}
/**
 * ランキングと小説情報をマージした結果
 */
type RankingResult<T extends SearchResultFieldNames = DefaultSearchResultFields> = Partial<PickedNarouSearchResult<T>> & NarouRankingResult;

/**
 * なろう小説APIへのリクエストパラメータ
 */
type NarouParams = SearchParams | RankingParams | RankingHistoryParams | UserSearchParams;
/**
 * なろう小説APIへのリクエストを実行する
 * @class NarouNovel
 * @private
 */
declare abstract class NarouNovel {
    /**
     * なろうAPIへのAPIリクエストを実行する
     * @param params クエリパラメータ
     * @param endpoint APIエンドポイント
     * @returns 実行結果
     */
    protected abstract execute<T>(params: NarouParams, endpoint: string): Promise<T>;
    /**
     * APIへの検索リクエストを実行する
     * @param params クエリパラメータ
     * @param endpoint APIエンドポイント
     * @returns 検索結果
     */
    protected executeSearch<T extends keyof NarouSearchResult>(params: SearchParams, endpoint?: string): Promise<NarouSearchResults<NarouSearchResult, T>>;
    /**
     * 小説APIへの検索リクエストを実行する
     * @param params クエリパラメータ
     * @returns 検索結果
     * @see https://dev.syosetu.com/man/api/
     */
    executeNovel<T extends keyof NarouSearchResult>(params: SearchParams): Promise<NarouSearchResults<NarouSearchResult, T>>;
    /**
     * R18小説APIへの検索リクエストを実行する
     * @param params クエリパラメータ
     * @returns 検索結果
     * @see https://dev.syosetu.com/xman/api/
     */
    executeNovel18<T extends keyof NarouSearchResult>(params: SearchParams): Promise<NarouSearchResults<NarouSearchResult, T>>;
    /**
     * ランキングAPIへのリクエストを実行する
     * @param params クエリパラメータ
     * @returns ランキング結果
     * @see https://dev.syosetu.com/man/rankapi/
     */
    executeRanking(params: RankingParams): Promise<NarouRankingResult[]>;
    /**
     * 殿堂入りAPiへのリクエストを実行する
     * @param params クエリパラメータ
     * @returns ランキング履歴結果
     * @see https://dev.syosetu.com/man/rankinapi/
     */
    executeRankingHistory(params: RankingHistoryParams): Promise<RankingHistoryRawResult[]>;
    /**
     * ユーザー検索APIへのリクエストを実行する
     * @param params クエリパラメータ
     * @returns 検索結果
     * @see https://dev.syosetu.com/man/userapi/
     */
    executeUserSearch<T extends keyof UserSearchResult>(params: UserSearchParams): Promise<NarouSearchResults<UserSearchResult, T>>;
}

export { type DefaultSearchResultFields as D, NarouNovel as N, type RankingResult as R, SearchBuilder as S, type NarouParams as a, type NarouRankingResult as b, SearchBuilderBase as c, NovelSearchBuilderBase as d };
