import { authenticateAPIToken } from "@middleware/authentication";
import { applicationErrorResponse, sendFailedResponse, sendSuccessResponse } from "@lib/responses";
import { NextApiResponse } from "next";
import formidable from "formidable";
import fs from "fs";
import { forwardBannerImageUpload } from "@lib/forwardBannerImageUpload";

export const config = {
	api: {
		bodyParser: false,
	},
};

const parseForm = (req: any): Promise<{ fields: formidable.Fields; files: formidable.Files }> =>
	new Promise((resolve, reject) => {
		const form = formidable({
			maxFileSize: 5 * 1024 * 1024,
			keepExtensions: true,
		});
		form.parse(req, (err, fields, files) => {
			if (err) reject(err);
			else resolve({ fields, files });
		});
	});

const getFieldValue = (value: formidable.Fields[string]) => {
	if (Array.isArray(value)) return value[0];
	return value;
};

const getUploadedFile = (value: formidable.Files[string]) => {
	if (Array.isArray(value)) return value[0];
	return value;
};

export default async function handler(req: any, res: NextApiResponse) {
	if (req.method !== "POST") {
		return res.status(405).json({ message: "Method not allowed" });
	}

	authenticateAPIToken(req, res, async () => {
		let tempPath: string | null = null;
		try {
			const { fields, files } = await parseForm(req);
			const websiteId = parseInt(String(req.websiteId || getFieldValue(fields.websiteId) || ""), 10);
			const uploadedFile = getUploadedFile(files.file);

			if (!websiteId || Number.isNaN(websiteId)) {
				return sendFailedResponse(res, {}, "Website ID is required");
			}
			if (!uploadedFile?.filepath) {
				return sendFailedResponse(res, {}, "File is required");
			}

			tempPath = uploadedFile.filepath;
			const result: any = await forwardBannerImageUpload({
				websiteId,
				filePath: uploadedFile.filepath,
				originalName: uploadedFile.originalFilename || "image",
				mimetype: uploadedFile.mimetype || "application/octet-stream",
			});

			if (result?.status === "success" && result?.data?.fileUrl) {
				return sendSuccessResponse(
					res,
					{ fileUrl: result.data.fileUrl, websiteId },
					result.message || "Banner image uploaded successfully"
				);
			}

			return sendFailedResponse(res, {}, result?.message || "Failed to upload banner image");
		} catch (e) {
			console.error("uploadBannerImage:", e);
			return applicationErrorResponse(res);
		} finally {
			if (tempPath && fs.existsSync(tempPath)) {
				try {
					fs.unlinkSync(tempPath);
				} catch (unlinkErr) {
					console.error("uploadBannerImage unlink:", unlinkErr);
				}
			}
		}
	});
}
