import { fetchMeta } from "../../../../misc/fetch-meta.js";
import { genId } from "../../../../misc/gen-id.js";
import { SwSubscriptions } from "../../../../models/index.js";
import define from "../../define.js";
export const meta = {
    tags: [
        "account"
    ],
    requireCredential: true,
    description: "Register to receive push notifications.",
    res: {
        type: "object",
        optional: false,
        nullable: false,
        properties: {
            state: {
                type: "string",
                optional: true,
                nullable: false,
                enum: [
                    "already-subscribed",
                    "subscribed"
                ]
            },
            key: {
                type: "string",
                optional: false,
                nullable: true
            },
            userId: {
                type: "string",
                optional: true,
                nullable: false
            },
            endpoint: {
                type: "string",
                optional: false,
                nullable: false
            },
            sendReadMessage: {
                type: "boolean",
                optional: false,
                nullable: false
            }
        }
    }
};
export const paramDef = {
    type: "object",
    properties: {
        endpoint: {
            type: "string"
        },
        auth: {
            type: "string"
        },
        publickey: {
            type: "string"
        },
        sendReadMessage: {
            type: "boolean",
            default: false
        }
    },
    required: [
        "endpoint",
        "auth",
        "publickey"
    ]
};
export default define(meta, paramDef, async (ps, me)=>{
    const subscription = await SwSubscriptions.findOneBy({
        userId: me.id,
        endpoint: ps.endpoint,
        auth: ps.auth,
        publickey: ps.publickey
    });
    const instance = await fetchMeta(true);
    // if already subscribed
    if (subscription != null) {
        return {
            state: "already-subscribed",
            key: instance.swPublicKey,
            userId: me.id,
            endpoint: subscription.endpoint,
            sendReadMessage: subscription.sendReadMessage
        };
    }
    await SwSubscriptions.insert({
        id: genId(),
        createdAt: new Date(),
        userId: me.id,
        endpoint: ps.endpoint,
        auth: ps.auth,
        publickey: ps.publickey,
        sendReadMessage: ps.sendReadMessage
    });
    return {
        state: "subscribed",
        key: instance.swPublicKey,
        userId: me.id,
        endpoint: ps.endpoint,
        sendReadMessage: ps.sendReadMessage
    };
});
