import { Response } from 'express';
import { prisma } from '../config/database';
import { AuthRequest } from '../middleware/auth';

export async function listDepartments(req: AuthRequest, res: Response) {
  try {
    const departments = await prisma.department.findMany({
      where: { ownerId: req.ownerId },
      orderBy: { name: 'asc' },
    });
    res.json(departments);
  } catch (error) {
    console.error('listDepartments error:', error);
    res.status(500).json({ error: 'Failed to fetch departments' });
  }
}

export async function createDepartment(req: AuthRequest, res: Response) {
  try {
    const { name } = req.body;
    if (!name || !String(name).trim()) {
      res.status(400).json({ error: 'Name is required' });
      return;
    }
    const trimmed = String(name).trim();

    const existing = await prisma.department.findFirst({
      where: { ownerId: req.ownerId, name: trimmed },
    });
    if (existing) {
      res.status(409).json({ error: 'A department with that name already exists' });
      return;
    }

    const department = await prisma.department.create({
      data: { ownerId: req.ownerId!, name: trimmed },
    });
    res.status(201).json(department);
  } catch (error) {
    console.error('createDepartment error:', error);
    res.status(500).json({ error: 'Failed to create department' });
  }
}

export async function updateDepartment(req: AuthRequest, res: Response) {
  try {
    const existing = await prisma.department.findFirst({
      where: { id: req.params.id, ownerId: req.ownerId },
    });
    if (!existing) {
      res.status(404).json({ error: 'Department not found' });
      return;
    }
    const { name } = req.body;
    if (!name || !String(name).trim()) {
      res.status(400).json({ error: 'Name is required' });
      return;
    }
    const trimmed = String(name).trim();

    // Rename existing approvers' department string to match
    if (trimmed !== existing.name) {
      await prisma.approver.updateMany({
        where: { ownerId: req.ownerId, department: existing.name },
        data: { department: trimmed },
      });
    }

    const department = await prisma.department.update({
      where: { id: req.params.id },
      data: { name: trimmed },
    });
    res.json(department);
  } catch (error: any) {
    if (error?.code === 'P2002') {
      res.status(409).json({ error: 'A department with that name already exists' });
      return;
    }
    console.error('updateDepartment error:', error);
    res.status(500).json({ error: 'Failed to update department' });
  }
}

export async function deleteDepartment(req: AuthRequest, res: Response) {
  try {
    const existing = await prisma.department.findFirst({
      where: { id: req.params.id, ownerId: req.ownerId },
    });
    if (!existing) {
      res.status(404).json({ error: 'Department not found' });
      return;
    }

    // Clear the department on any approvers using it
    await prisma.approver.updateMany({
      where: { ownerId: req.ownerId, department: existing.name },
      data: { department: null },
    });
    await prisma.department.delete({ where: { id: req.params.id } });
    res.json({ message: 'Department deleted' });
  } catch (error) {
    console.error('deleteDepartment error:', error);
    res.status(500).json({ error: 'Failed to delete department' });
  }
}
