import Resolver from "../resolver.js";
import { fetchPerson } from "../models/person.js";
import { createBite } from "../../../services/create-bite.js";
import { tickBiteIncoming } from "../../../metrics.js";
import { getNote } from "../../../server/api/common/getters.js";
import { parseUri } from "../db-resolver.js";
export default (async (actor, bite)=>{
    if (actor.uri !== bite.actor) {
        return "skip: actor uri mismatch";
    }
    if (bite.id === null) {
        return "skip: bite id not specified";
    }
    const resolver = new Resolver();
    const biteActor = await fetchPerson(bite.actor, resolver);
    if (biteActor === null) {
        return "skip: biteActor is null";
    }
    const targetParsed = parseUri(bite.target);
    if (!targetParsed.local) {
        return "skip: target is not local";
    }
    const targetDbId = targetParsed.id;
    const targetPathType = targetParsed.type;
    let targetType;
    let targetId;
    let fallback = false;
    if (targetPathType === "users") {
        targetType = "user";
        targetId = targetDbId;
    } else if (targetPathType === "bites") {
        targetType = "bite";
        targetId = targetDbId;
    } else if (targetPathType === "notes") {
        targetType = "note";
        targetId = targetDbId;
        try {
            await getNote(targetDbId, actor);
        } catch (err) {
            if (err.id === "9725d0ce-ba28-4dde-95a7-2cbb2c15de24") {
                // note either doesn't exist or the remote user shouldn't be able to access it
                fallback = true;
            }
        }
    } else {
        fallback = true;
    }
    if (fallback) {
        // fallback for unknown object types
        targetType = "user";
        if (bite.to !== undefined) {
            const to = Array.isArray(bite.to) ? bite.to[0] : bite.to;
            targetId = to.split("/").pop();
        } else {
            return "skip: unknown type missing to field";
        }
    }
    await createBite(biteActor, targetType, targetId, bite.id, bite.published ? new Date(bite.published) : null);
    tickBiteIncoming();
    return "ok";
});
