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

// 1. Public subscribe
export const subscribeNewsletter = async (req: Request, res: Response) => {
  try {
    const { email, name } = req.body;

    const existing = await prisma.newsletterSubscriber.findUnique({
      where: { email: email.toLowerCase() },
    });

    if (existing) {
      if (existing.isActive) {
        return sendSuccess(res, 'You are already subscribed to our newsletter list.', { subscriber: existing });
      }
      const updated = await prisma.newsletterSubscriber.update({
        where: { email: email.toLowerCase() },
        data: { isActive: true },
      });
      return sendSuccess(res, 'Resubscribed successfully!', { subscriber: updated });
    }

    const subscriber = await prisma.newsletterSubscriber.create({
      data: {
        email: email.toLowerCase(),
        name,
        isActive: true,
      },
    });

    logger.info(`New newsletter subscriber: ${email}`);

    // Mock Mailchimp & SendGrid subscriber list sync
    await syncToMailchimp(email, name);
    await syncToSendGrid(email);

    return sendSuccess(res, 'Subscribed to newsletter list successfully!', { subscriber });
  } catch (error: any) {
    return sendError(res, 'Failed to subscribe to newsletter list', error.message, 500);
  }
};

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

// 3. Admin: Toggle subscription state / unsubscribe
export const toggleSubscription = 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 subscriber = await prisma.newsletterSubscriber.findUnique({ where: { id } });
    if (!subscriber) return sendError(res, 'Subscriber not found', null, 404);

    const updated = await prisma.newsletterSubscriber.update({
      where: { id },
      data: { isActive: !subscriber.isActive },
    });

    return sendSuccess(res, `Subscription status updated successfully to ${updated.isActive ? 'Active' : 'Inactive'}`);
  } catch (error: any) {
    return sendError(res, 'Toggle failed', error.message, 500);
  }
};

// 4. Admin: Delete subscriber
export const deleteSubscriber = 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.newsletterSubscriber.delete({ where: { id } });
    return sendSuccess(res, 'Subscriber deleted from registry database');
  } catch (error: any) {
    return sendError(res, 'Deletion failed', error.message, 500);
  }
};

// 5. Admin: Send Newsletter Campaign Campaign
export const sendNewsletterCampaign = async (req: AuthenticatedRequest, res: Response) => {
  try {
    const { subject, htmlContent } = req.body;
    if (res.locals.userRole !== 'ADMIN' && req.user?.role !== 'ADMIN') {
      return sendError(res, 'Forbidden', null, 403);
    }

    const subscribers = await prisma.newsletterSubscriber.findMany({
      where: { isActive: true },
    });

    logger.info(`Dispatching newsletter campaign: '${subject}' to ${subscribers.length} active readers.`);

    // Mock Mailchimp & SendGrid API campaigns trigger
    return sendSuccess(res, `Newsletter campaign successfully scheduled for delivery to ${subscribers.length} subscribers.`);
  } catch (error: any) {
    return sendError(res, 'Failed to dispatch newsletter campaign', error.message, 500);
  }
};

// MOCK MARKETING INTEGRATIONS
async function syncToMailchimp(email: string, name?: string) {
  logger.info(`[Mailchimp API] Synced contact: ${email} (${name || 'Subscriber'}) to audience list ID: 'ibw_readers'`);
}

async function syncToSendGrid(email: string) {
  logger.info(`[SendGrid Marketing Campaigns] Added contact: ${email} to contact list ID: 'ibw_newsletters'`);
}
