import { DriveFiles } from "@/models/index.js";
import define from "../../../define.js";
import { ApiError } from "../../../error.js";

export const meta = {
	tags: ["admin"],

	requireCredential: true,
	requireModerator: true,

	errors: {
		noSuchFile: {
			message: "No such file.",
			code: "NO_SUCH_FILE",
			id: "caf3ca38-c6e5-472e-a30c-b05377dcc240",
		},
	},

	res: {
		type: "object",
		optional: false,
		nullable: false,
		properties: {
			id: {
				type: "string",
				optional: false,
				nullable: false,
				format: "id",
				example: "xxxxxxxxxx",
			},
			createdAt: {
				type: "string",
				optional: false,
				nullable: false,
				format: "date-time",
			},
			userId: {
				type: "string",
				optional: false,
				nullable: true,
				format: "id",
				example: "xxxxxxxxxx",
			},
			userHost: {
				type: "string",
				optional: false,
				nullable: true,
				description: "The local host is represented with `null`.",
			},
			md5: {
				type: "string",
				optional: false,
				nullable: false,
				format: "md5",
				example: "15eca7fba0480996e2245f5185bf39f2",
			},
			name: {
				type: "string",
				optional: false,
				nullable: false,
				example: "lenna.jpg",
			},
			type: {
				type: "string",
				optional: false,
				nullable: false,
				example: "image/jpeg",
			},
			size: {
				type: "number",
				optional: false,
				nullable: false,
				example: 51469,
			},
			comment: {
				type: "string",
				optional: false,
				nullable: true,
			},
			blurhash: {
				type: "string",
				optional: false,
				nullable: true,
			},
			properties: {
				type: "object",
				optional: false,
				nullable: false,
				properties: {
					width: {
						type: "number",
						optional: false,
						nullable: false,
						example: 1280,
					},
					height: {
						type: "number",
						optional: false,
						nullable: false,
						example: 720,
					},
					avgColor: {
						type: "string",
						optional: true,
						nullable: false,
						example: "rgb(40,65,87)",
					},
				},
			},
			storedInternal: {
				type: "boolean",
				optional: false,
				nullable: true,
				example: true,
			},
			url: {
				type: "string",
				optional: false,
				nullable: true,
				format: "url",
			},
			thumbnailUrl: {
				type: "string",
				optional: false,
				nullable: true,
				format: "url",
			},
			webpublicUrl: {
				type: "string",
				optional: false,
				nullable: true,
				format: "url",
			},
			accessKey: {
				type: "string",
				optional: false,
				nullable: false,
			},
			thumbnailAccessKey: {
				type: "string",
				optional: false,
				nullable: false,
			},
			webpublicAccessKey: {
				type: "string",
				optional: false,
				nullable: false,
			},
			uri: {
				type: "string",
				optional: false,
				nullable: true,
			},
			src: {
				type: "string",
				optional: false,
				nullable: true,
			},
			folderId: {
				type: "string",
				optional: false,
				nullable: true,
				format: "id",
				example: "xxxxxxxxxx",
			},
			isSensitive: {
				type: "boolean",
				optional: false,
				nullable: false,
			},
			isLink: {
				type: "boolean",
				optional: false,
				nullable: false,
			},
		},
	},
} as const;

export const paramDef = {
	type: "object",
	anyOf: [
		{
			properties: {
				fileId: { type: "string", format: "misskey:id" },
			},
			required: ["fileId"],
		},
		{
			properties: {
				url: { type: "string" },
			},
			required: ["url"],
		},
	],
} as const;

export default define(meta, paramDef, async (ps, me) => {
	const file = ps.fileId
		? await DriveFiles.findOneBy({ id: ps.fileId })
		: await DriveFiles.findOne({
				where: [
					{
						url: ps.url,
					},
					{
						thumbnailUrl: ps.url,
					},
					{
						webpublicUrl: ps.url,
					},
				],
		  });

	if (file == null) {
		throw new ApiError(meta.errors.noSuchFile);
	}

	if (!me.isAdmin) {
		file.requestIp = undefined;
		file.requestHeaders = undefined;
	}

	return file;
});
