import { InternalStorage } from "./internal-storage.js";
import { DriveFiles, Users } from "../../models/index.js";
import { driveChart, perUserDriveChart, instanceChart } from "../chart/index.js";
import { createDeleteObjectStorageFileJob } from "../../queue/index.js";
import { fetchMeta } from "../../misc/fetch-meta.js";
import { getS3 } from "./s3.js";
import { v4 as uuid } from "uuid";
import { DeleteObjectCommand } from "@aws-sdk/client-s3";
export async function deleteFile(file, isExpired = false) {
    if (file.storedInternal) {
        InternalStorage.del(file.accessKey);
        if (file.thumbnailUrl) {
            InternalStorage.del(file.thumbnailAccessKey);
        }
        if (file.webpublicUrl) {
            InternalStorage.del(file.webpublicAccessKey);
        }
    } else if (!file.isLink) {
        createDeleteObjectStorageFileJob(file.accessKey);
        if (file.thumbnailUrl) {
            createDeleteObjectStorageFileJob(file.thumbnailAccessKey);
        }
        if (file.webpublicUrl) {
            createDeleteObjectStorageFileJob(file.webpublicAccessKey);
        }
    }
    postProcess(file, isExpired);
}
export async function deleteFileSync(file, isExpired = false) {
    if (file.storedInternal) {
        InternalStorage.del(file.accessKey);
        if (file.thumbnailUrl) {
            InternalStorage.del(file.thumbnailAccessKey);
        }
        if (file.webpublicUrl) {
            InternalStorage.del(file.webpublicAccessKey);
        }
    } else if (!file.isLink) {
        const promises = [];
        promises.push(deleteObjectStorageFile(file.accessKey));
        if (file.thumbnailUrl) {
            promises.push(deleteObjectStorageFile(file.thumbnailAccessKey));
        }
        if (file.webpublicUrl) {
            promises.push(deleteObjectStorageFile(file.webpublicAccessKey));
        }
        await Promise.all(promises);
    }
    postProcess(file, isExpired);
}
async function postProcess(file, isExpired = false) {
    // リモートファイル期限切れ削除後は直リンクにする
    if (isExpired && file.userHost !== null && file.uri != null) {
        DriveFiles.update(file.id, {
            isLink: true,
            url: file.uri,
            thumbnailUrl: null,
            webpublicUrl: null,
            storedInternal: false,
            // ローカルプロキシ用
            accessKey: uuid(),
            thumbnailAccessKey: `thumbnail-${uuid()}`,
            webpublicAccessKey: `webpublic-${uuid()}`
        });
        Users.update({
            avatarId: file.id
        }, {
            avatarUrl: file.uri
        });
        Users.update({
            bannerId: file.id
        }, {
            bannerUrl: file.uri
        });
    } else {
        DriveFiles.delete(file.id);
    }
    // 統計を更新
    driveChart.update(file, false);
    perUserDriveChart.update(file, false);
    if (file.userHost !== null) {
        instanceChart.updateDrive(file, false);
    }
}
export async function deleteObjectStorageFile(key) {
    const meta = await fetchMeta();
    const s3 = getS3(meta);
    await s3.send(new DeleteObjectCommand({
        Bucket: meta.objectStorageBucket,
        Key: key
    }));
}
