import type { Request, Response, NextFunction } from 'express';
import * as planModel from '../models/plan.model.js';
import { successResponse, errorResponse } from '../utils/response.js';

function actorId(req: Request): number | undefined {
  return req.user ? Number(req.user.sub) : undefined;
}

async function createPlan(req: Request, res: Response, next: NextFunction) {
  try {
    const plan = await planModel.createPlan(req.body, actorId(req));
    return successResponse(res, 'Plan created successfully', plan, 201);
  } catch (error) {
    next(error);
    return;
  }
}

async function getPlans(_req: Request, res: Response, next: NextFunction) {
  try {
    const plans = await planModel.getPlans();
    return successResponse(res, 'Plans fetched successfully', plans);
  } catch (error) {
    next(error);
    return;
  }
}

async function getPlan(req: Request, res: Response, next: NextFunction) {
  try {
    const plan = await planModel.getPlanById(String(req.params.id));
    if (!plan) return void errorResponse(res, 'Plan not found', 404);
    return successResponse(res, 'Plan fetched successfully', plan);
  } catch (error) {
    next(error);
    return;
  }
}

async function updatePlan(req: Request, res: Response, next: NextFunction) {
  try {
    const plan = await planModel.updatePlan(String(req.params.id), req.body, actorId(req));
    return successResponse(res, 'Plan updated successfully', plan);
  } catch (error) {
    next(error);
    return;
  }
}

export { createPlan, getPlans, getPlan, updatePlan };
