import { act, renderHook } from '@testing-library/react';
import { beforeEach, describe, expect, it, vi } from 'vitest';

const mocks = vi.hoisted(() => ({
  createTemplate: vi.fn(),
  updateTemplate: vi.fn(),
  deleteTemplate: vi.fn(),
  getTemplates: vi.fn(),
  getFolders: vi.fn(),
  invalidateQueries: vi.fn(),
  showError: vi.fn(),
  showSuccess: vi.fn(),
  folders: [{ Id: 'folder-email', Name: 'Email', DeveloperName: 'Email', Type: 'Email' }],
}));

vi.mock('@tanstack/react-query', () => ({
  useQuery: ({ queryKey }: { queryKey: string[] }) => {
    if (queryKey[0] === 'emailTemplateFolders') {
      return {
        data: mocks.folders,
        isLoading: false,
        error: null,
      };
    }
    return { data: [], isLoading: false, error: null };
  },
  useQueryClient: () => ({
    invalidateQueries: mocks.invalidateQueries,
  }),
}));

vi.mock('@nexuscrm/salesforce-crm-standard-frontend/platform/components/ui', () => ({
  useErrorToast: () => mocks.showError,
  useSuccessToast: () => mocks.showSuccess,
}));

vi.mock('../src/platform/core/services/Logger', () => ({
  Logger: {
    error: vi.fn(),
    info: vi.fn(),
  },
}));

vi.mock('../src/platform/infrastructure/api/email-templates', () => ({
  emailTemplateAPI: {
    createTemplate: mocks.createTemplate,
    updateTemplate: mocks.updateTemplate,
    deleteTemplate: mocks.deleteTemplate,
    getTemplates: mocks.getTemplates,
    getFolders: mocks.getFolders,
  },
}));

import { useEmailTemplates } from '../src/platform/features/email-templates/hooks/useEmailTemplates';

describe('useEmailTemplates payloads', () => {
  beforeEach(() => {
    vi.clearAllMocks();
    mocks.createTemplate.mockResolvedValue({ id: 'template-1', success: true, errors: [] });
    mocks.updateTemplate.mockResolvedValue(undefined);
    mocks.deleteTemplate.mockResolvedValue(undefined);
    mocks.folders = [{ Id: 'folder-email', Name: 'Email', DeveloperName: 'Email', Type: 'Email' }];
  });

  it('creates email templates with required API identity and body fields', async () => {
    const { result } = renderHook(() => useEmailTemplates());

    act(() => {
      result.current.setFormData({
        name: 'Quarterly Launch Email!',
        subject: 'Launch update',
        folderId: 'folder-email',
        description: 'Customer announcement',
        htmlBody: '<p>Hello world</p>',
      });
    });

    await act(async () => {
      await result.current.handleSave();
    });

    expect(mocks.createTemplate).toHaveBeenCalledWith({
      Name: 'Quarterly Launch Email!',
      DeveloperName: 'Quarterly_Launch_Email',
      Subject: 'Launch update',
      FolderId: 'folder-email',
      Description: 'Customer announcement',
      HtmlValue: '<p>Hello world</p>',
      Body: '<p>Hello world</p>',
      IsActive: true,
    });
  });

  it('does not submit an email template without body content', async () => {
    const { result } = renderHook(() => useEmailTemplates());

    act(() => {
      result.current.setFormData({
        name: 'Missing Body',
        subject: 'No body',
        folderId: 'folder-email',
        description: '',
        htmlBody: '   ',
      });
    });

    await act(async () => {
      await result.current.handleSave();
    });

    expect(mocks.createTemplate).not.toHaveBeenCalled();
    expect(mocks.showError).toHaveBeenCalledWith('Name, subject, and email body are required');
  });

  it('omits FolderId while preserving required fields when no email folders exist', async () => {
    mocks.folders = [];
    const { result } = renderHook(() => useEmailTemplates());

    act(() => {
      result.current.handleCreate();
    });

    act(() => {
      result.current.setFormData({
        name: 'No Folder Template',
        subject: 'No folder',
        folderId: result.current.formData.folderId,
        description: '',
        htmlBody: '<p>No folder body</p>',
      });
    });

    await act(async () => {
      await result.current.handleSave();
    });

    const payload = mocks.createTemplate.mock.calls[0]?.[0];
    expect(payload).toMatchObject({
      Name: 'No Folder Template',
      DeveloperName: 'No_Folder_Template',
      Subject: 'No folder',
      HtmlValue: '<p>No folder body</p>',
      Body: '<p>No folder body</p>',
      IsActive: true,
    });
    expect(payload).not.toHaveProperty('FolderId');
  });
});
