import { UserGroups, UserGroupJoinings, UserGroupInvitations } from "../../../../../models/index.js";
import { genId } from "../../../../../misc/gen-id.js";
import { createNotification } from "../../../../../services/create-notification.js";
import { getUser } from "../../../common/getters.js";
import { ApiError } from "../../../error.js";
import define from "../../../define.js";
export const meta = {
    tags: [
        "groups",
        "users"
    ],
    requireCredential: true,
    kind: "write:user-groups",
    description: "Invite a user to an existing group.",
    errors: {
        noSuchGroup: {
            message: "No such group.",
            code: "NO_SUCH_GROUP",
            id: "583f8bc0-8eee-4b78-9299-1e14fc91e409"
        },
        noSuchUser: {
            message: "No such user.",
            code: "NO_SUCH_USER",
            id: "da52de61-002c-475b-90e1-ba64f9cf13a8"
        },
        alreadyAdded: {
            message: "That user has already been added to that group.",
            code: "ALREADY_ADDED",
            id: "7e35c6a0-39b2-4488-aea6-6ee20bd5da2c"
        },
        alreadyInvited: {
            message: "That user has already been invited to that group.",
            code: "ALREADY_INVITED",
            id: "ee0f58b4-b529-4d13-b761-b9a3e69f97e6"
        }
    }
};
export const paramDef = {
    type: "object",
    properties: {
        groupId: {
            type: "string",
            format: "misskey:id"
        },
        userId: {
            type: "string",
            format: "misskey:id"
        }
    },
    required: [
        "groupId",
        "userId"
    ]
};
export default define(meta, paramDef, async (ps, me)=>{
    // Fetch the group
    const userGroup = await UserGroups.findOneBy({
        id: ps.groupId,
        userId: me.id
    });
    if (userGroup == null) {
        throw new ApiError(meta.errors.noSuchGroup);
    }
    // Fetch the user
    const user = await getUser(ps.userId).catch((e)=>{
        if (e.id === "15348ddd-432d-49c2-8a5a-8069753becff") throw new ApiError(meta.errors.noSuchUser);
        throw e;
    });
    const joining = await UserGroupJoinings.findOneBy({
        userGroupId: userGroup.id,
        userId: user.id
    });
    if (joining) {
        throw new ApiError(meta.errors.alreadyAdded);
    }
    const existInvitation = await UserGroupInvitations.findOneBy({
        userGroupId: userGroup.id,
        userId: user.id
    });
    if (existInvitation) {
        throw new ApiError(meta.errors.alreadyInvited);
    }
    const invitation = await UserGroupInvitations.insert({
        id: genId(),
        createdAt: new Date(),
        userId: user.id,
        userGroupId: userGroup.id
    }).then((x)=>UserGroupInvitations.findOneByOrFail(x.identifiers[0]));
    // 通知を作成
    createNotification(user.id, "groupInvited", {
        notifierId: me.id,
        userGroupInvitationId: invitation.id
    });
});
