import { Request, Response, NextFunction, RequestHandler } from "express";
import { AiRepository } from "../utils/AiRepositoryHelper";
import { getPromptRepository } from "../utils/AiPromptHelper";

const VALID_MODES = [
  "basic",
  "advance",
  "academic",
  "expand",
  "shorten",
  "copywriting",
  "seo",
] as const;
type Mode = (typeof VALID_MODES)[number];

export class ToolController {
  humanize: RequestHandler = async (
    req: Request,
    res: Response,
    next: NextFunction
  ): Promise<void> => {
    const { inputText, mode, lang, total_characters, is_premium } = req.body;

    const limit = is_premium === "premium" ? 1500 : 1200;

    if (total_characters > limit) {
      res.status(400).json({
        error: `Reached character limit (${limit}), reduce your input characters`,
      });
      return;
    }

    // Validate inputs
    if (!inputText || typeof inputText !== "string") {
      res.status(400).json({ error: "Invalid or missing inputText" });
      return;
    }
    if (!lang || typeof lang !== "string") {
      res.status(400).json({ error: "Invalid or missing lang" });
      return;
    }
    if (!mode || !VALID_MODES.includes(mode)) {
      res.status(400).json({
        error: `Invalid mode. Supported modes: ${VALID_MODES.join(", ")}`,
      });
      return;
    }

    try {
      // Fetch prompt based on mode and language
      const prompt = await getPromptRepository(`${mode}-${lang}`, lang);

      // Call AI repository
      const output = await AiRepository({
        text: inputText,
        model: "chatgpt",
        modelMode: "gpt-4o",
        prompt,
        variables: {},
      });

      res.json({ output });
    } catch (err) {
      console.error("[Humanize] Error:", err);
      res.status(500).json({ error: "Failed to generate response" });
    }
  };
}