import { Request, Response } from 'express';
import prisma from '../config/database';
import { sendSuccess, sendError } from '../utils/response.utils';
import { AuthenticatedRequest } from '../middleware/auth.middleware';

// 1. List all customers
export const getAllCustomers = async (req: AuthenticatedRequest, res: Response) => {
  try {
    if (res.locals.userRole !== 'ADMIN' && req.user?.role !== 'ADMIN') {
      return sendError(res, 'Forbidden', null, 403);
    }

    const customers = await prisma.user.findMany({
      orderBy: { createdAt: 'desc' },
      select: {
        id: true,
        email: true,
        firstName: true,
        lastName: true,
        phone: true,
        avatarUrl: true,
        status: true,
        isEmailVerified: true,
        createdAt: true,
      },
    });

    return sendSuccess(res, 'Customers list retrieved', { customers });
  } catch (error: any) {
    return sendError(res, 'Failed to fetch customers list', error.message, 500);
  }
};

// 2. View customer details and their order history
export const getCustomerDetails = async (req: AuthenticatedRequest, res: Response) => {
  try {
    const { id } = req.params;
    if (res.locals.userRole !== 'ADMIN' && req.user?.role !== 'ADMIN') {
      return sendError(res, 'Forbidden', null, 403);
    }

    const customer = await prisma.user.findUnique({
      where: { id },
      include: {
        orders: {
          orderBy: { createdAt: 'desc' },
        },
      },
    });

    if (!customer) return sendError(res, 'Customer not found', null, 404);

    return sendSuccess(res, 'Customer details retrieved', { customer });
  } catch (error: any) {
    return sendError(res, 'Failed to fetch customer details', error.message, 500);
  }
};

// 3. Toggle suspend/activate account
export const toggleCustomerStatus = async (req: AuthenticatedRequest, res: Response) => {
  try {
    const { id } = req.params;
    if (res.locals.userRole !== 'ADMIN' && req.user?.role !== 'ADMIN') {
      return sendError(res, 'Forbidden', null, 403);
    }

    const customer = await prisma.user.findUnique({ where: { id } });
    if (!customer) return sendError(res, 'Customer not found', null, 404);

    const newStatus = customer.status === 'SUSPENDED' ? 'ACTIVE' : 'SUSPENDED';

    const updated = await prisma.user.update({
      where: { id },
      data: { status: newStatus },
    });

    // Log Activity
    await prisma.activityLog.create({
      data: {
        adminId: req.user?.adminId,
        action: newStatus === 'SUSPENDED' ? 'USER_SUSPENDED' : 'USER_ACTIVATED',
        details: { userId: id, userEmail: customer.email },
      },
    });

    return sendSuccess(res, `Customer account status updated to ${newStatus}`, { status: updated.status });
  } catch (error: any) {
    return sendError(res, 'Failed to update customer status', error.message, 500);
  }
};

// 4. Update customer parameters
export const updateCustomer = async (req: AuthenticatedRequest, res: Response) => {
  try {
    const { id } = req.params;
    const { firstName, lastName, phone } = req.body;

    if (res.locals.userRole !== 'ADMIN' && req.user?.role !== 'ADMIN') {
      return sendError(res, 'Forbidden', null, 403);
    }

    const updated = await prisma.user.update({
      where: { id },
      data: { firstName, lastName, phone },
    });

    return sendSuccess(res, 'Customer parameters updated successfully', { customer: updated });
  } catch (error: any) {
    return sendError(res, 'Failed to update customer', error.message, 500);
  }
};

// 5. Delete customer account
export const deleteCustomer = async (req: AuthenticatedRequest, res: Response) => {
  try {
    const { id } = req.params;
    if (res.locals.userRole !== 'ADMIN' && req.user?.role !== 'ADMIN') {
      return sendError(res, 'Forbidden', null, 403);
    }

    await prisma.user.delete({ where: { id } });
    return sendSuccess(res, 'Customer account deleted successfully');
  } catch (error: any) {
    return sendError(res, 'Failed to delete customer account', error.message, 500);
  }
};
