import { Request, Response } from "express";
import { HowItWorksSteps } from "../../database/menu/howItWorksSteps";
import { sendSuccessResponse, sendErrorResponse } from "../../utills/response";
import { DemoVideos } from "../../database/menu/demoVideos";
export const getAllHowItWorksSteps = async (req: Request, res: Response) => {
  try {
    const { page = '1', limit = '10' } = req.query;
    const pageNum = Math.max(1, parseInt(page as string, 10));
    const limitNum = Math.max(1, Math.min(100, parseInt(limit as string, 10)));
    const skip = (pageNum - 1) * limitNum;

    // fetch steps with pagination
    const [steps, totalCount] = await HowItWorksSteps.findAndCount({
      order: { order: "ASC" },
      skip,
      take: limitNum
    });

    // fetch demo videos
    const demovideos = await DemoVideos.find();

    // safely extract first video (if exists)
    const video = demovideos.length > 0 ? demovideos[0].video : null;

    const totalPages = Math.ceil(totalCount / limitNum);

    // keep same response shape with pagination
    return sendSuccessResponse(
      res,
      200,
      "How it works steps retrieved successfully",
      {
        steps,
        video,
        pagination: {
          currentPage: pageNum,
          totalPages,
          totalCount,
          limit: limitNum
        }
      }
    );
  } catch (error) {
    return sendErrorResponse(res, 500, "Internal server error", error);
  }
};


export const createHowItWorksStep = async (req: Request, res: Response) => {
  try {
    const { stepNumber, title, description, icon, order,isActive } = req.body;

    if (!stepNumber || !title || !description) {
      return sendErrorResponse(res, 400, "Step number, title and description are required");
    }

    const step = new HowItWorksSteps();
    step.stepNumber = stepNumber;
    step.title = title;
    step.description = description;
    step.icon = icon ?? null;
    step.isActive = isActive !== "false" && !!isActive;
    step.order = order ?? 0;

    await step.save();
    return sendSuccessResponse(res, 201, "How it works step created successfully", step);
  } catch (error) {
    return sendErrorResponse(res, 500, "Internal server error", error);
  }
};

export const updateHowItWorksStep = async (req: Request, res: Response) => {
  try {
    const { id } = req.params;
    const { stepNumber, title, description, icon, order,isActive } = req.body;

    const step = await HowItWorksSteps.findOne({ where: { id } });
    if (!step) {
      return sendErrorResponse(res, 404, "How it works step not found");
    }

    if (stepNumber) step.stepNumber = stepNumber;
    if (title) step.title = title;
    if (description) step.description = description;
    if (icon !== undefined) step.icon = icon;
    if (order !== undefined) step.order = order;
    if (isActive !== undefined) {
      step.isActive = isActive === false || isActive === "false" ? false : !!isActive;
    }
    step.updated_at = new Date();
    await step.save();
    return sendSuccessResponse(res, 200, "How it works step updated successfully", step);
  } catch (error) {
    return sendErrorResponse(res, 500, "Internal server error", error);
  }
};

export const deleteHowItWorksStep = async (req: Request, res: Response) => {
  try {
    const { id } = req.params;

    const step = await HowItWorksSteps.findOne({ where: { id } });
    if (!step) {
      return sendErrorResponse(res, 404, "How it works step not found");
    }

    await step.remove();
    return sendSuccessResponse(res, 200, "How it works step deleted successfully", null);
  } catch (error) {
    return sendErrorResponse(res, 500, "Internal server error", error);
  }
};