import define from "../../../define.js";
import { Emojis } from "../../../../../models/index.js";
import { toPuny } from "../../../../../misc/convert-host.js";
import { makePaginationQuery } from "../../../common/make-pagination-query.js";
import { sqlLikeEscape } from "../../../../../misc/sql-like-escape.js";
export const meta = {
    tags: [
        "admin"
    ],
    requireCredential: true,
    requireModerator: true,
    res: {
        type: "array",
        optional: false,
        nullable: false,
        items: {
            type: "object",
            optional: false,
            nullable: false,
            properties: {
                id: {
                    type: "string",
                    optional: false,
                    nullable: false,
                    format: "id"
                },
                aliases: {
                    type: "array",
                    optional: false,
                    nullable: false,
                    items: {
                        type: "string",
                        optional: false,
                        nullable: false
                    }
                },
                name: {
                    type: "string",
                    optional: false,
                    nullable: false
                },
                category: {
                    type: "string",
                    optional: false,
                    nullable: true
                },
                host: {
                    type: "string",
                    optional: false,
                    nullable: true,
                    description: "The local host is represented with `null`."
                },
                url: {
                    type: "string",
                    optional: false,
                    nullable: false
                },
                license: {
                    type: "string",
                    optional: false,
                    nullable: true
                },
                glyph: {
                    type: "boolean",
                    optional: false,
                    nullable: false
                },
                glyphUrl: {
                    type: "string",
                    optional: false,
                    nullable: true
                },
                width: {
                    type: "number",
                    optional: false,
                    nullable: true
                },
                height: {
                    type: "number",
                    optional: false,
                    nullable: true
                }
            }
        }
    }
};
export const paramDef = {
    type: "object",
    properties: {
        query: {
            type: "string",
            nullable: true,
            default: null
        },
        host: {
            type: "string",
            nullable: true,
            default: null,
            description: "Use `null` to represent the local host."
        },
        limit: {
            type: "integer",
            minimum: 1,
            maximum: 100,
            default: 10
        },
        sinceId: {
            type: "string",
            format: "misskey:id"
        },
        untilId: {
            type: "string",
            format: "misskey:id"
        }
    },
    required: []
};
export default define(meta, paramDef, async (ps)=>{
    const q = makePaginationQuery(Emojis.createQueryBuilder("emoji"), ps.sinceId, ps.untilId);
    if (ps.host == null) {
        q.andWhere("emoji.host IS NOT NULL");
    } else {
        q.andWhere("emoji.host = :host", {
            host: toPuny(ps.host)
        });
    }
    if (ps.query) {
        q.andWhere("emoji.name like :query", {
            query: `%${sqlLikeEscape(ps.query)}%`
        });
    }
    const emojis = await q.orderBy("emoji.id", "DESC").take(ps.limit).getMany();
    return Emojis.packMany(emojis);
});
