import { POST } from '@/app/api/email/route';
import { NextRequest, NextResponse } from 'next/server';
import nodemailermock from '@/app/__tests__/__mocks__/nodemailer';

jest.mock('next/server', () => ({
  NextResponse: {
    json: jest.fn(),
  },
}));

beforeEach(() => {
  nodemailermock.mock.reset();
  process.env.NEXT_PUBLIC_MY_EMAIL = 'test@dki.one';
  process.env.NEXT_PUBLIC_MY_PASSWORD = 'test-password';
});

describe('POST /api/email', () => {
  it('should send an email', async () => {
    const mockRequest = {
      json: jest.fn().mockResolvedValue({
        email: 'test@example.com',
        name: 'Test User',
        message: 'Hello!',
      }),
    } as unknown as NextRequest;

    await POST(mockRequest);

    expect(NextResponse.json).toHaveBeenCalledWith({ message: 'Email sent' });

    const sentEmails = nodemailermock.mock.getSentMail();
    expect(sentEmails.length).toBe(1);
    expect(sentEmails[0].to).toBe('test@dki.one');
    expect(sentEmails[0].text).toBe('Hello!\n\n' + 'test@example.com');
  });

  it('should return an error if EMAIL or PASSWORD is missing', async () => {
    delete process.env.NEXT_PUBLIC_MY_EMAIL;
    delete process.env.NEXT_PUBLIC_MY_PASSWORD;

    const mockRequest = {
      json: jest.fn().mockResolvedValue({
        email: 'test@example.com',
        name: 'Test User',
        message: 'Hello!',
      }),
    } as unknown as NextRequest;

    await POST(mockRequest);

    expect(NextResponse.json).toHaveBeenCalledWith({ error: 'Missing EMAIL or PASSWORD' }, { status: 500 });
  });

  it('should return an error if request body is invalid', async () => {
    const mockRequest = {
      json: jest.fn().mockResolvedValue({
        email: '',
        name: 'Test User',
        message: 'Test message',
      }),
    } as unknown as NextRequest;

    await POST(mockRequest);

    expect(NextResponse.json).toHaveBeenCalledWith({ error: 'Invalid request body' }, { status: 400 });
  });

  it('should return an error if sending email fails', async () => {
    nodemailermock.mock.setShouldFail(true);

    const mockRequest = {
      json: jest.fn().mockResolvedValue({
        email: 'test@example.com',
        name: 'Test User',
        message: 'Hello!',
      }),
    } as unknown as NextRequest;

    await POST(mockRequest);

    expect(NextResponse.json).toHaveBeenCalledWith({ error: 'Failed to send email' }, { status: 500 });
  });
});
