import { Brackets, In } from "typeorm";
import { Polls, Mutings, Notes, PollVotes } from "../../../../../models/index.js";
import define from "../../../define.js";
export const meta = {
    tags: [
        "notes"
    ],
    requireCredential: true,
    res: {
        type: "array",
        optional: false,
        nullable: false,
        items: {
            type: "object",
            optional: false,
            nullable: false,
            ref: "Note"
        }
    }
};
export const paramDef = {
    type: "object",
    properties: {
        limit: {
            type: "integer",
            minimum: 1,
            maximum: 100,
            default: 10
        },
        offset: {
            type: "integer",
            default: 0
        }
    },
    required: []
};
export default define(meta, paramDef, async (ps, user)=>{
    const query = Polls.createQueryBuilder("poll").where("poll.userHost IS NULL").andWhere("poll.userId != :meId", {
        meId: user.id
    }).andWhere("poll.noteVisibility = 'public'").andWhere(new Brackets((qb)=>{
        qb.where("poll.expiresAt IS NULL").orWhere("poll.expiresAt > :now", {
            now: new Date()
        });
    }));
    //#region exclude arleady voted polls
    const votedQuery = PollVotes.createQueryBuilder("vote").select("vote.noteId").where("vote.userId = :meId", {
        meId: user.id
    });
    query.andWhere(`poll.noteId NOT IN (${votedQuery.getQuery()})`);
    query.setParameters(votedQuery.getParameters());
    //#endregion
    //#region mute
    const mutingQuery = Mutings.createQueryBuilder("muting").select("muting.muteeId").where("muting.muterId = :muterId", {
        muterId: user.id
    });
    query.andWhere(`poll.userId NOT IN (${mutingQuery.getQuery()})`);
    query.setParameters(mutingQuery.getParameters());
    //#endregion
    const polls = await query.orderBy("poll.noteId", "DESC").take(ps.limit).skip(ps.offset).getMany();
    if (polls.length === 0) return [];
    const notes = await Notes.find({
        where: {
            id: In(polls.map((poll)=>poll.noteId))
        },
        order: {
            createdAt: "DESC"
        }
    });
    return await Notes.packMany(notes, user, {
        detail: true
    });
});
