// pages/api/admin/categories/[id].js
import { apiHandler, db } from "@/helpers/api";

export default apiHandler({
	put: updateCategory,
	delete: deleteCategory,
});

async function updateCategory(req, res) {
	const userID = req.userID;
	const categoryID = req.query.id;
	const { name, slug, parentID, title, description, keywords } = req.body;

	if (!db.initialized) await db.initialize();

	try {
		const userData = await db.User.findByPk(userID);

		if (!userData) return res.status(404).json({ error: "Unknown!" });

		if (userData.admin < 1) {
			return res.status(401).json({ error: "Unauthorized access." });
		}

		const category = await db.Categories.findByPk(categoryID);

		if (!category) {
			return res.status(404).json({ error: "Categoria nu există!" });
		}

		const oldName = category.name;
		const oldSlug = category.slug;

		// Actualizează categoria
		await category.update({
			name: name || category.name,
			slug: slug || category.slug,
			parentID: parentID !== undefined ? parentID : category.parentID,
			title: title !== undefined ? title : category.title,
			description: description !== undefined ? description : category.description,
			keywords: keywords !== undefined ? keywords : category.keywords,
		});

		// Dacă s-a schimbat numele sau slug-ul, actualizează și produsele
		if (name !== oldName || slug !== oldSlug) {
			// Găsește nivelul categoriei pentru a actualiza câmpurile corecte
			const level = category.parentID
				? (await db.Categories.findOne({ where: { id: category.parentID } })).parentID
					? 3
					: 2
				: 1;

			const updateFields = {};

			if (level === 1) {
				updateFields.categoryName = name;
				updateFields.categorySlug = slug;
			} else if (level === 2) {
				updateFields.subcategoryName = name;
				updateFields.subcategorySlug = slug;
			} else if (level === 3) {
				updateFields.thirdCategoryName = name;
				updateFields.thirdCategorySlug = slug;
			}

			// Actualizează produsele
			const searchFields = {};
			if (level === 1) {
				searchFields.categoryName = oldName;
			} else if (level === 2) {
				searchFields.subcategoryName = oldName;
			} else if (level === 3) {
				searchFields.thirdCategoryName = oldName;
			}

			const updatedProducts = await db.Products.update(updateFields, { where: searchFields });

			return res.status(200).json({
				message: "Categoria și produsele au fost actualizate cu succes!",
				updatedProducts: updatedProducts[0],
			});
		}

		return res.status(200).json({
			message: "Categoria a fost actualizată cu succes!",
		});
	} catch (error) {
		console.error("Eroare la actualizarea categoriei:", error);
		return res.status(500).json({ error: "Eroare la actualizarea categoriei" });
	}
}

async function deleteCategory(req, res) {
	const userID = req.userID;
	const categoryID = req.query.id;

	if (!db.initialized) await db.initialize();

	try {
		const userData = await db.User.findByPk(userID);

		if (!userData) return res.status(404).json({ error: "Unknown!" });

		if (userData.admin < 1) {
			return res.status(401).json({ error: "Unauthorized access." });
		}

		const category = await db.Categories.findByPk(categoryID);

		if (!category) {
			return res.status(404).json({ error: "Categoria nu există!" });
		}

		// Funcție recursivă pentru a găsi toate subcategoriile
		const getAllSubcategories = async (parentId) => {
			const children = await db.Categories.findAll({
				where: { parentID: parentId },
				attributes: ["id", "name", "slug"],
				raw: true,
			});

			let allIds = children.map((c) => c.id);
			let allSlugs = children.map((c) => c.slug);

			for (const child of children) {
				const { ids, slugs } = await getAllSubcategories(child.id);
				allIds = allIds.concat(ids);
				allSlugs = allSlugs.concat(slugs);
			}

			return { ids: allIds, slugs: allSlugs };
		};

		// Găsește toate subcategoriile
		const { ids: subcategoryIds, slugs: subcategorySlugs } = await getAllSubcategories(categoryID);
		const allCategorySlugs = [category.slug, ...subcategorySlugs];
		const allCategoryIds = [parseInt(categoryID), ...subcategoryIds];

		// Numără produsele afectate
		const affectedProducts = await db.Products.count({
			where: {
				[db.Sequelize.Op.or]: [
					{ categorySlug: { [db.Sequelize.Op.in]: allCategorySlugs } },
					{ subcategorySlug: { [db.Sequelize.Op.in]: allCategorySlugs } },
					{ thirdCategorySlug: { [db.Sequelize.Op.in]: allCategorySlugs } },
				],
			},
		});

		// Șterge produsele
		await db.Products.destroy({
			where: {
				[db.Sequelize.Op.or]: [
					{ categorySlug: { [db.Sequelize.Op.in]: allCategorySlugs } },
					{ subcategorySlug: { [db.Sequelize.Op.in]: allCategorySlugs } },
					{ thirdCategorySlug: { [db.Sequelize.Op.in]: allCategorySlugs } },
				],
			},
		});

		// Șterge toate subcategoriile
		if (subcategoryIds.length > 0) {
			await db.Categories.destroy({
				where: {
					id: { [db.Sequelize.Op.in]: subcategoryIds },
				},
			});
		}

		// Șterge categoria principală
		await category.destroy();

		return res.status(200).json({
			message: "Categoria a fost ștearsă cu succes!",
			deletedCategories: allCategoryIds.length,
			deletedProducts: affectedProducts,
		});
	} catch (error) {
		console.error("Eroare la ștergerea categoriei:", error);
		return res.status(500).json({ error: "Eroare la ștergerea categoriei" });
	}
}
