import createReaction from "../../../../../services/note/reaction/create.js";
import define from "../../../define.js";
import { getNote } from "../../../common/getters.js";
import { ApiError } from "../../../error.js";
import { getGroupActor } from "../../../common/get-group-actor.js";
export const meta = {
    tags: [
        "reactions",
        "notes"
    ],
    requireCredential: true,
    kind: "write:reactions",
    errors: {
        noSuchNote: {
            message: "No such note.",
            code: "NO_SUCH_NOTE",
            id: "033d0620-5bfe-4027-965d-980b0c85a3ea"
        },
        alreadyReacted: {
            message: "You are already reacting to that note.",
            code: "ALREADY_REACTED",
            id: "71efcf98-86d6-4e2b-b2ad-9d032369366b"
        },
        youHaveBeenBlocked: {
            message: "You cannot react this note because you have been blocked by this user.",
            code: "YOU_HAVE_BEEN_BLOCKED",
            id: "20ef5475-9f38-4e4c-bd33-de6d979498ec"
        },
        accountLocked: {
            message: "You migrated. Your account is now locked.",
            code: "ACCOUNT_LOCKED",
            id: "d390d7e1-8a5e-46ed-b625-06271cafd3d3"
        },
        noSuchGroup: {
            message: "No such group.",
            code: "NO_SUCH_GROUP",
            id: "8ad1dbe0-6498-45ac-9243-5864d80ed5c1"
        }
    }
};
export const paramDef = {
    type: "object",
    properties: {
        noteId: {
            type: "string",
            format: "misskey:id"
        },
        reaction: {
            type: "string"
        },
        groupId: {
            type: "string",
            format: "misskey:id",
            nullable: true
        }
    },
    required: [
        "noteId",
        "reaction"
    ]
};
export default define(meta, paramDef, async (ps, user)=>{
    if (user.movedToUri != null) throw new ApiError(meta.errors.accountLocked);
    const note = await getNote(ps.noteId, user).catch((err)=>{
        if (err.id === "9725d0ce-ba28-4dde-95a7-2cbb2c15de24") throw new ApiError(meta.errors.noSuchNote);
        throw err;
    });
    const group = await getGroupActor(ps.groupId, user);
    if (ps.groupId != null && group == null) throw new ApiError(meta.errors.noSuchGroup);
    await createReaction({
        ...user,
        groupId: group?.id ?? null
    }, note, ps.reaction).catch((e)=>{
        if (e.id === "51c42bb4-931a-456b-bff7-e5a8a70dd298") throw new ApiError(meta.errors.alreadyReacted);
        if (e.id === "e70412a4-7197-4726-8e74-f3e0deb92aa7") throw new ApiError(meta.errors.youHaveBeenBlocked);
        throw e;
    });
    return;
});
