// Auto-generated by create-backlist v5.1 (Prisma Version)
import { Request, Response } from 'express';
import { prisma } from '../db/prisma';

function safeErrorMessage(error: unknown) {
  return error instanceof Error ? error.message : String(error);
}

function parseId(id: string) {
  <% if (idIsNumber) { -%>
  return Number(id);
  <% } else { -%>
  return id;
  <% } -%>
}

// @desc    Create a new <%= modelName %>
export const create<%= modelName %> = async (req: Request, res: Response) => {
  try {
    const newDoc = await prisma.<%= modelName.toLowerCase() %>.create({
      data: req.body,
    });
    return res.status(201).json(newDoc);
  } catch (error) {
    return res.status(500).json({ message: 'Error creating document', error: safeErrorMessage(error) });
  }
};

// @desc    Get all <%= modelName %>s (supports pagination: ?page=&limit=)
export const getAll<%= modelName %>s = async (req: Request, res: Response) => {
  try {
    const page = Number(req.query.page || 1);
    const limit = Number(req.query.limit || 50);
    const skip = (page - 1) * limit;

    const docs = await prisma.<%= modelName.toLowerCase() %>.findMany({
      skip,
      take: limit,
      orderBy: { createdAt: 'desc' } as any
    });

    return res.status(200).json(docs);
  } catch (error) {
    return res.status(500).json({ message: 'Error fetching documents', error: safeErrorMessage(error) });
  }
};

// @desc    Get a single <%= modelName %> by ID
export const get<%= modelName %>ById = async (req: Request, res: Response) => {
  try {
    const id = parseId(req.params.id);

    const doc = await prisma.<%= modelName.toLowerCase() %>.findUnique({
      where: { id } as any,
    });

    if (!doc) return res.status(404).json({ message: '<%= modelName %> not found' });
    return res.status(200).json(doc);
  } catch (error) {
    return res.status(500).json({ message: 'Error fetching document', error: safeErrorMessage(error) });
  }
};

// @desc    Update a <%= modelName %> by ID
export const update<%= modelName %>ById = async (req: Request, res: Response) => {
  try {
    const id = parseId(req.params.id);

    const doc = await prisma.<%= modelName.toLowerCase() %>.update({
      where: { id } as any,
      data: req.body,
    });

    return res.status(200).json(doc);
  } catch (error: any) {
    // Prisma "Record not found"
    if (error?.code === 'P2025') {
      return res.status(404).json({ message: '<%= modelName %> not found' });
    }
    return res.status(500).json({ message: 'Error updating document', error: safeErrorMessage(error) });
  }
};

// @desc    Delete a <%= modelName %> by ID
export const delete<%= modelName %>ById = async (req: Request, res: Response) => {
  try {
    const id = parseId(req.params.id);

    await prisma.<%= modelName.toLowerCase() %>.delete({
      where: { id } as any,
    });

    return res.status(200).json({ message: '<%= modelName %> deleted successfully' });
  } catch (error: any) {
    if (error?.code === 'P2025') {
      return res.status(404).json({ message: '<%= modelName %> not found' });
    }
    return res.status(500).json({ message: 'Error deleting document', error: safeErrorMessage(error) });
  }
};