import { db } from "../../db/postgre.js";
import { Bite } from "../entities/bite.js";
import { Bites, Notes, Users } from "../index.js";
import { awaitAll } from "../../prelude/await-all.js";
import config from "../../config/index.js";
export const BiteRespository = db.getRepository(Bite).extend({
    targetType (bite) {
        if (bite.targetUserId) return "user";
        if (bite.targetBiteId) return "bite";
        return "note";
    },
    async pack (src, me) {
        const bite = typeof src === "object" ? src : await this.findOneByOrFail({
            id: src
        });
        return await awaitAll({
            id: bite.id,
            user: Users.pack(bite.user ?? bite.userId, me, {
                detail: false
            }),
            targetType: BiteRespository.targetType(bite),
            target: this.packTarget(bite, me),
            replied: bite.replied
        });
    },
    async packTarget (bite, me) {
        switch(BiteRespository.targetType(bite)){
            case "user":
                return await Users.pack(bite.targetUser ?? bite.targetUserId, me, {
                    detail: false
                });
            case "bite":
                return await this.pack(bite.targetBite ?? bite.targetBiteId, me);
            case "note":
                return await Notes.pack(bite.targetNote ?? bite.targetNoteId, me, {
                    detail: false
                });
        }
    },
    async targetUri (bite) {
        switch(BiteRespository.targetType(bite)){
            case "user":
                {
                    bite.targetUser = bite.targetUser ?? await Users.findOneOrFail({
                        where: {
                            id: bite.targetUserId
                        }
                    });
                    return bite.targetUser.uri ?? `${config.url}/users/${bite.targetUserId}`;
                }
            case "bite":
                {
                    bite.targetBite = bite.targetBite ?? await Bites.findOneOrFail({
                        where: {
                            id: bite.targetBiteId
                        }
                    });
                    return bite.targetBite.uri ?? `${config.url}/bites/${bite.targetBiteId}`;
                }
            case "note":
                {
                    bite.targetNote = bite.targetNote ?? await Notes.findOneOrFail({
                        where: {
                            id: bite.targetNoteId
                        }
                    });
                    return bite.targetNote.uri ?? `${config.url}/notes/${bite.targetBiteId}`;
                }
        }
    },
    async targetUserUri (bite) {
        switch(BiteRespository.targetType(bite)){
            case "user":
                if (!bite.targetUser) bite.targetUser = await Users.findOneByOrFail({
                    id: bite.targetUserId
                });
                return bite.targetUser.uri ?? `${config.url}/users/${bite.targetUserId}`;
            case "bite":
                bite.targetBite = bite.targetBite ?? await Bites.findOneOrFail({
                    where: {
                        id: bite.targetBiteId
                    },
                    relations: [
                        "user"
                    ]
                });
                bite.targetBite.user = bite.targetBite.user ?? await Users.findOneByOrFail({
                    id: bite.targetBite.userId
                });
                return bite.targetBite.user.uri ?? `${config.url}/users/${bite.targetBite.userId}`;
            case "note":
                bite.targetNote = bite.targetNote ?? await Notes.findOneOrFail({
                    where: {
                        id: bite.targetNoteId
                    },
                    relations: [
                        "user"
                    ]
                });
                bite.targetNote.user = bite.targetNote.user ?? await Users.findOneByOrFail({
                    id: bite.targetNote.userId
                });
                return bite.targetNote.user.uri ?? `${config.url}/users/${bite.targetNote.userId}`;
        }
    }
});
