import { NextResponse } from 'next/server';
import mongoose from 'mongoose';
import { z } from 'zod';
import connectToDatabase from '@/lib/db';
import NewsletterModel from '@/lib/models/newsletter';

export const runtime = 'nodejs';

const newsletterSchema = z.object({
  email: z.string().email('Please enter a valid email address.'),
  name: z.string().max(100).optional(),
  source: z.string().max(50).optional(),
});

export async function POST(request: Request) {
  try {
    const parsed = newsletterSchema.safeParse(await request.json());

    if (!parsed.success) {
      return NextResponse.json(
        { error: parsed.error.issues[0]?.message ?? 'Invalid newsletter data.' },
        { status: 400 }
      );
    }

    const { email, name, source } = parsed.data;
    const normalizedEmail = email.trim().toLowerCase();

    await connectToDatabase();

    const Newsletter = mongoose.models.newsletters || NewsletterModel(mongoose);

    const updateData = {
      name: name?.trim(),
      source: source?.trim() || 'website',
      status: 'subscribed',
      subscribedAt: new Date(),
      unsubscribedAt: null,
    };

    await Newsletter.updateOne(
      { email: normalizedEmail },
      { $set: updateData },
      { upsert: true, runValidators: true }
    );

    return NextResponse.json(
      {
        success: true,
        message: 'Subscribed successfully.',
      },
      { status: 201 }
    );
  } catch (error) {
    console.error('Newsletter subscription error:', error);

    return NextResponse.json(
      { error: 'Failed to save newsletter subscription. Please try again later.' },
      { status: 500 }
    );
  }
}
