import { Request, Response } from 'express';
import Department from '../models/department';
import Designation from '../models/designation';
import { sendResponse, handleError } from '../utils/apiResponse';

// Get all active departments
export const getAllDepartments = async (_req: Request, res: Response) => {
  try {
    const departments = await Department.find({ is_active: true }).lean();
    sendResponse(res, 200, 'Departments fetched', { departments });
  } catch (error) {
    handleError(res, error);
  }
};

// Get all active designations, optionally filter by department
export const getAllDesignations = async (req: Request, res: Response) => {
  try {
    const { departmentId } = req.query;
    const filter: any = { is_active: true };
    if (departmentId) filter.department = departmentId;
    const designations = await Designation.find(filter).lean();
    sendResponse(res, 200, 'Designations fetched', { designations });
  } catch (error) {
    handleError(res, error);
  }
};

// Admin: Create or update department
export const upsertDepartment = async (req: Request, res: Response) => {
  try {
    let { id, name, is_active } = req.body;
    if (!name) return sendResponse(res, 400, 'Department name is required');
    const update: any = { name };
    if (typeof is_active === 'boolean') update.is_active = is_active;
    const department = await Department.findOneAndUpdate(
      id ? { _id: id } : { name },
      update,
      { upsert: true, new: true }
    );
    sendResponse(res, 200, 'Department saved', { department });
  } catch (error) {
    handleError(res, error);
  }
};

// Admin: Create or update designation
export const upsertDesignation = async (req: Request, res: Response) => {
  try {
    let { id, name, is_active, departmentId } = req.body;
    if (!name) return sendResponse(res, 400, 'Designation name is required');
    const update: any = { name };
    if (typeof is_active === 'boolean') update.is_active = is_active;
    if (departmentId) update.department = departmentId;
    const designation = await Designation.findOneAndUpdate(
      id ? { _id: id } : { name },
      update,
      { upsert: true, new: true }
    );
    sendResponse(res, 200, 'Designation saved', { designation });
  } catch (error) {
    handleError(res, error);
  }
};
