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

// 1. Public: Submit enquiry form (generates ticketNumber)
export const submitEnquiry = async (req: Request, res: Response) => {
  try {
    const { name, email, subject, message } = req.body;

    const ticketNumber = `TK-${Date.now().toString().slice(-4)}-${Math.floor(1000 + Math.random() * 9000)}`;

    const enquiry = await prisma.contactEnquiry.create({
      data: {
        ticketNumber,
        name,
        email: email.toLowerCase(),
        subject,
        message,
        status: 'PENDING',
      },
    });

    logger.info(`New Contact ticket raised: ${ticketNumber} by ${email}`);

    // Send acknowledgement email notification
    await EmailService.sendEmail({
      to: email,
      subject: `Support Request Received - ${ticketNumber}`,
      html: `
        <div style="font-family: sans-serif; padding: 20px; color: #333;">
          <h3>Hello ${name},</h3>
          <p>We have successfully received your support request ticket: <strong>${ticketNumber}</strong>.</p>
          <p>Our Vedic lit specialist team will review your message and reply within 24 business hours.</p>
          <hr />
          <p><strong>Subject:</strong> ${subject}</p>
          <p><strong>Message:</strong> ${message}</p>
        </div>
      `,
    });

    return sendSuccess(res, 'Support request ticket created successfully', { ticketNumber, enquiry });
  } catch (error: any) {
    return sendError(res, 'Failed to raise contact ticket', error.message, 500);
  }
};

// 2. Admin: List tickets queue
export const getTicketsQueue = async (req: AuthenticatedRequest, res: Response) => {
  try {
    if (res.locals.userRole !== 'ADMIN' && req.user?.role !== 'ADMIN') {
      return sendError(res, 'Forbidden', null, 403);
    }
    const tickets = await prisma.contactEnquiry.findMany({
      orderBy: { createdAt: 'desc' },
    });
    return sendSuccess(res, 'Tickets list retrieved successfully', { tickets });
  } catch (error: any) {
    return sendError(res, 'Failed to fetch tickets queue', error.message, 500);
  }
};

// 3. Admin: Update ticket notes & send reply
export const replyToTicket = async (req: AuthenticatedRequest, res: Response) => {
  try {
    const { id } = req.params;
    const { response, adminNotes, status } = req.body;

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

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

    const updated = await prisma.contactEnquiry.update({
      where: { id },
      data: {
        response: response || undefined,
        adminNotes: adminNotes || undefined,
        status: status || undefined,
      },
    });

    // Send email notification reply to customer
    if (response) {
      await EmailService.sendEmail({
        to: ticket.email,
        subject: `Re: ${ticket.subject} [${ticket.ticketNumber}]`,
        html: `
          <div style="font-family: sans-serif; padding: 20px; color: #333; line-height: 1.5;">
            <p>Hello ${ticket.name},</p>
            <p>An administrator has responded to your ticket <strong>${ticket.ticketNumber}</strong>:</p>
            <div style="background-color: #f9f9f9; padding: 15px; border-left: 4px solid #701a08; margin: 15px 0;">
              ${response}
            </div>
            <p>Best regards,<br />Customer Care Team<br />Indian Books Worldwide</p>
          </div>
        `,
      });
      logger.info(`Replied to ticket ${ticket.ticketNumber} and sent email notification.`);
    }

    return sendSuccess(res, 'Ticket reply submitted successfully', { ticket: updated });
  } catch (error: any) {
    return sendError(res, 'Failed to submit ticket reply', error.message, 500);
  }
};

// 4. Admin: Delete ticket
export const deleteTicket = 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.contactEnquiry.delete({ where: { id } });
    return sendSuccess(res, 'Support ticket deleted successfully');
  } catch (error: any) {
    return sendError(res, 'Failed to delete ticket', error.message, 500);
  }
};
