import Chart from "../core.js";
import { Followings, Users } from "../../../models/index.js";
import { Not, IsNull } from "typeorm";
import { name, schema } from "./entities/per-user-following.js";
/**
 * ユーザーごとのフォローに関するチャート
 */ export default class PerUserFollowingChart extends Chart {
    constructor(){
        super(name, schema, true);
    }
    async tickMajor(group) {
        const [localFollowingsCount, localFollowersCount, remoteFollowingsCount, remoteFollowersCount] = await Promise.all([
            Followings.countBy({
                followerId: group,
                followeeHost: IsNull()
            }),
            Followings.countBy({
                followeeId: group,
                followerHost: IsNull()
            }),
            Followings.countBy({
                followerId: group,
                followeeHost: Not(IsNull())
            }),
            Followings.countBy({
                followeeId: group,
                followerHost: Not(IsNull())
            })
        ]);
        return {
            "local.followings.total": localFollowingsCount,
            "local.followers.total": localFollowersCount,
            "remote.followings.total": remoteFollowingsCount,
            "remote.followers.total": remoteFollowersCount
        };
    }
    async tickMinor() {
        return {};
    }
    async update(follower, followee, isFollow) {
        const prefixFollower = Users.isLocalUser(follower) ? "local" : "remote";
        const prefixFollowee = Users.isLocalUser(followee) ? "local" : "remote";
        this.commit({
            [`${prefixFollower}.followings.total`]: isFollow ? 1 : -1,
            [`${prefixFollower}.followings.inc`]: isFollow ? 1 : 0,
            [`${prefixFollower}.followings.dec`]: isFollow ? 0 : 1
        }, follower.id);
        this.commit({
            [`${prefixFollowee}.followers.total`]: isFollow ? 1 : -1,
            [`${prefixFollowee}.followers.inc`]: isFollow ? 1 : 0,
            [`${prefixFollowee}.followers.dec`]: isFollow ? 0 : 1
        }, followee.id);
    }
}
