// src/routes/users.ts
import { Router, Request, Response } from "express";

/**
 * @Middleware
 */
import { uploadBlogMiddleware } from "../middlewares/blogUpload";
import { uploadMiddleware } from "../middlewares/upload";

/**
 * @Controllers
 */
import { UsersController } from "../controllers/UsersController";
import { ToolPagesController } from "../controllers/ToolPagesController";
import { CustomPageController } from "../controllers/CustomPageController";
import { LanguagesController } from "../controllers/LanguagesController";
import { BlogController } from "../controllers/BlogController";
import { SettingsController } from "../controllers/SettingsController";
import { ToolPromptsController } from "../controllers/ToolPromptsController";
import { QueryController } from "../controllers/QueryController";
import { PricingPlansController } from "../controllers/PricingPlansController";
import { AuthController } from "../controllers/AuthController";
import { FileManagerController, upload } from "../controllers/FileManagerController";

const router = Router();

const usersController = new UsersController();
const toolpagesController = new ToolPagesController();
const custompagesController = new CustomPageController();
const langController = new LanguagesController();
const blogsController = new BlogController();
const settingsController = new SettingsController();
const toolPromptsController = new ToolPromptsController();
const queryController = new QueryController();
const pricingPlanController = new PricingPlansController();
const fileManagerController = new FileManagerController();

// For the User Authenticate
router.get("/", usersController.authUser.bind(usersController));
// For the Users
router.get("/users/show", usersController.show.bind(usersController));
router.post("/users/add", usersController.add.bind(usersController));
router.get("/user/get/:id", usersController.get.bind(usersController));
router.patch("/user/edit/:id", usersController.edit.bind(usersController));
router.delete("/user/delete/:id", usersController.delete.bind(usersController));

// For the Tool Pages
router.get(
  "/tool-pages/show",
  toolpagesController.show.bind(toolpagesController)
);
router.get(
  "/tool-pages/get/:id",
  toolpagesController.showTool.bind(toolpagesController)
);
router.post(
  "/tool-pages/add",
  toolpagesController.add.bind(toolpagesController)
);
router.patch(
  "/tool-pages/edit/:id",
  toolpagesController.edit.bind(toolpagesController)
);
router.delete(
  "/tool-pages/delete/:id",
  toolpagesController.delete.bind(toolpagesController)
);

// For the Custom Pages
router.get(
  "/custom-pages/show",
  custompagesController.show.bind(custompagesController)
);
router.get(
  "/custom-pages/page-names",
  (custompagesController as any).getPageNames.bind(custompagesController)
);
router.get(
  "/custom-pages/get/:id",
  custompagesController.showCustom.bind(custompagesController)
);
router.post(
  "/custom-pages/add",
  custompagesController.add.bind(custompagesController)
);
router.patch(
  "/custom-pages/edit/:id",
  custompagesController.edit.bind(custompagesController)
);
router.delete(
  "/custom-pages/delete/:id",
  custompagesController.delete.bind(custompagesController)
);

// For the Blogs
router.get("/blogs/show", blogsController.show.bind(blogsController));
router.post(
  "/blogs/add",
  uploadBlogMiddleware,
  blogsController.add.bind(blogsController)
);
router.get("/blog/get/:id", blogsController.get.bind(blogsController));
router.patch(
  "/blog/edit/:id",
  uploadBlogMiddleware,
  blogsController.edit.bind(blogsController)
);
router.delete("/blog/delete/:id", blogsController.remove.bind(blogsController));

// For the Tool Prompts
router.get(
  "/tool-prompts/show",
  toolPromptsController.show.bind(toolPromptsController)
);
router.get(
  "/tool-prompts/getTools",
  toolPromptsController.getTools.bind(toolPromptsController)
);
router.get(
  "/tool-prompts/get/:id",
  toolPromptsController.get.bind(toolPromptsController)
);
router.post(
  "/tool-prompts/add",
  toolPromptsController.add.bind(toolPromptsController)
);
router.patch(
  "/tool-prompts/edit/:id",
  toolPromptsController.edit.bind(toolPromptsController)
);
router.delete(
  "/tool-prompts/delete/:id",
  toolPromptsController.delete.bind(toolPromptsController)
);

// Queries

router.get("/queries/show", queryController.show.bind(queryController));
router.post("/queries/add", queryController.add.bind(queryController));
router.get("/queries/get/:id", queryController.get.bind(queryController));
router.patch("/queries/edit/:id", queryController.edit.bind(queryController));
router.delete(
  "/queries/delete/:id",
  queryController.delete.bind(queryController)
);

// Pricing Plan
router.get(
  "/pricing-plans/show",
  pricingPlanController.show.bind(pricingPlanController)
);
router.post(
  "/pricing-plans/add",
  pricingPlanController.add.bind(pricingPlanController)
);
router.get(
  "/pricing-plans/get/:id",
  pricingPlanController.get.bind(pricingPlanController)
);
router.patch(
  "/pricing-plans/edit/:id",
  pricingPlanController.edit.bind(pricingPlanController)
);
router.delete(
  "/pricing-plans/delete/:id",
  pricingPlanController.delete.bind(pricingPlanController)
);

//Settings
router.get("/settings/show", settingsController.get.bind(settingsController));
router.post(
  "/settings/add",
  uploadMiddleware,
  AuthController.verifyJWT,
  settingsController.save.bind(settingsController)
);
router.post(
  "/settings/generate-sitemap",
  settingsController.generateSitemap.bind(settingsController)
);

// Get the Languages
router.get("/lang", langController.show.bind(langController));

// Media Upload
router.post(
  "/textarea/image",
  uploadMiddleware,
  (req: Request, res: Response): void => {
    const files = req.files as Express.Multer.File[];

    if (!files || files.length === 0) {
      res.status(400).json({ message: "No file uploaded" });
      return;
    }

    // For now, just return the first file's URL
    const file = files[0];
    const url = `${process.env.BACKEND_DOMAIN}/images/${file.filename}`;

    console.log(url);
    res.json({ url });
  }
);

export default router;

// File Manager
router.get("/file-manager/list", fileManagerController.listContents.bind(fileManagerController));
router.post("/file-manager/folder", fileManagerController.createFolder.bind(fileManagerController));
router.post("/file-manager/upload", upload.single('file'), fileManagerController.uploadFile.bind(fileManagerController));
router.delete("/file-manager/item", fileManagerController.deleteItem.bind(fileManagerController));
router.patch("/file-manager/item", fileManagerController.renameItem.bind(fileManagerController));
router.post("/file-manager/copy-url", fileManagerController.copyUrl.bind(fileManagerController));
