import { Request, Response } from 'express';
import { CustomerGroup } from '../models/CustomerGroup';

// Get all customer groups
export const getCustomerGroups = async (req: Request, res: Response) => {
  try {
    const { includeInactive } = req.query;
    const query = includeInactive === 'true' ? {} : { isActive: true };
    const groups = await CustomerGroup.find(query).sort({ name: 1 });
    res.json({ success: true, data: groups });
  } catch (error: any) {
    res.status(500).json({ success: false, message: error.message });
  }
};

// Get single customer group by ID
export const getCustomerGroupById = async (req: Request, res: Response) => {
  try {
    const { id } = req.params;
    const group = await CustomerGroup.findById(id);
    
    if (!group) {
      return res.status(404).json({ success: false, message: 'Customer group not found' });
    }
    
    res.json({ success: true, data: group });
  } catch (error: any) {
    res.status(500).json({ success: false, message: error.message });
  }
};

// Create new customer group
export const createCustomerGroup = async (req: Request, res: Response) => {
  try {
    const { name, code, description } = req.body;

    // Validate required fields
    if (!name || !code) {
      return res.status(400).json({ success: false, message: 'Name and code are required' });
    }

    // Check if group with same name or code exists
    const existingGroup = await CustomerGroup.findOne({
      $or: [{ name }, { code: code.toUpperCase() }]
    });

    if (existingGroup) {
      return res.status(400).json({ success: false, message: 'Customer group with this name or code already exists' });
    }

    const newGroup = new CustomerGroup({
      name,
      code: code.toUpperCase(),
      description,
      isActive: true,
    });

    await newGroup.save();

    res.status(201).json({ success: true, message: 'Customer group created successfully', data: newGroup });
  } catch (error: any) {
    res.status(500).json({ success: false, message: error.message });
  }
};

// Update customer group
export const updateCustomerGroup = async (req: Request, res: Response) => {
  try {
    const { id } = req.params;
    const updateData = { ...req.body };

    // Remove _id from update data
    delete updateData._id;

    // If code is being updated, ensure it's uppercase
    if (updateData.code) {
      updateData.code = updateData.code.toUpperCase();
    }

    // Check for duplicate name or code if updating
    if (updateData.name || updateData.code) {
      const existingGroup = await CustomerGroup.findOne({
        _id: { $ne: id },
        $or: [
          updateData.name ? { name: updateData.name } : {},
          updateData.code ? { code: updateData.code.toUpperCase() } : {}
        ]
      });

      if (existingGroup) {
        return res.status(400).json({ success: false, message: 'Customer group with this name or code already exists' });
      }
    }

    const group = await CustomerGroup.findByIdAndUpdate(
      id,
      { $set: updateData },
      { new: true, runValidators: true }
    );

    if (!group) {
      return res.status(404).json({ success: false, message: 'Customer group not found' });
    }

    res.json({ success: true, message: 'Customer group updated successfully', data: group });
  } catch (error: any) {
    res.status(500).json({ success: false, message: error.message });
  }
};

// Delete customer group (soft delete by setting isActive to false)
export const deleteCustomerGroup = async (req: Request, res: Response) => {
  try {
    const { id } = req.params;
    const { hardDelete } = req.query;

    const group = await CustomerGroup.findById(id);

    if (!group) {
      return res.status(404).json({ success: false, message: 'Customer group not found' });
    }

    // Check if group is being used in contracts
    if (hardDelete !== 'true') {
      const { Contract } = await import('../models/Contract');
      const contractsUsingGroup = await Contract.countDocuments({ customerGroup: group.code });
      
      if (contractsUsingGroup > 0) {
        return res.status(400).json({ 
          success: false, 
          message: `Cannot delete customer group. It is being used in ${contractsUsingGroup} contract(s). Use hardDelete=true to force delete.` 
        });
      }
    }

    if (hardDelete === 'true') {
      // Hard delete
      await CustomerGroup.findByIdAndDelete(id);
      res.json({ success: true, message: 'Customer group deleted successfully' });
    } else {
      // Soft delete
      group.isActive = false;
      await group.save();
      res.json({ success: true, message: 'Customer group deactivated successfully', data: group });
    }
  } catch (error: any) {
    res.status(500).json({ success: false, message: error.message });
  }
};
