import { describe, it, expect, vi, beforeEach } from 'vitest';
import { render } from 'ink-testing-library';
import React from 'react';
import { CategoryCreateScreen } from '../../../components/masterdata/categories/CategoryCreateScreen.js';
import { useCategories } from '../../../hooks/useCategories.js';

vi.mock('../../../state/navigation-context.js', () => ({
  useNavigation: () => ({
    replace: vi.fn(),
    back: vi.fn(),
    navigate: vi.fn(),
    current: 'category-create',
    params: {},
    canGoBack: true,
  }),
}));

vi.mock('../../../hooks/useCategories.js', () => ({
  useCategories: vi.fn(),
}));

const createCategoryMock = vi.fn();

const defaultState = {
  categories: [],
  loading: false,
  error: null,
  fetchCategories: vi.fn(),
  createCategory: createCategoryMock,
  updateCategory: vi.fn(),
  deleteCategory: vi.fn(),
  clearError: vi.fn(),
};

describe('TC-CAT: Produktkategorie-Formular', () => {
  beforeEach(() => {
    vi.clearAllMocks();
    vi.mocked(useCategories).mockReturnValue(defaultState);
  });

  it('TC-CAT-01: Rendert Formular korrekt (Happy-Path-Vorbedingung)', () => {
    const { lastFrame } = render(React.createElement(CategoryCreateScreen));
    expect(lastFrame()).toContain('Neue Produktkategorie');
    expect(lastFrame()).toContain('Name *');
    expect(lastFrame()).toContain('Beschreibung');
  });

  it('TC-CAT-04: Doppelter Name → API-Fehler wird angezeigt', () => {
    vi.mocked(useCategories).mockReturnValue({
      ...defaultState,
      error: 'Kategorie mit diesem Namen existiert bereits.',
    });
    const { lastFrame } = render(React.createElement(CategoryCreateScreen));
    expect(lastFrame()).toContain('Kategorie mit diesem Namen existiert bereits.');
  });

  it('TC-CAT-06: Leerer Name → Fehlermeldung, kein API-Call', async () => {
    createCategoryMock.mockResolvedValue(null);
    vi.mocked(useCategories).mockReturnValue({ ...defaultState, createCategory: createCategoryMock });

    const { stdin, lastFrame } = render(React.createElement(CategoryCreateScreen));
    // Warten bis useInput-Effects (ink 5, readable-Listener) registriert sind
    await new Promise((r) => setTimeout(r, 20));

    // Enter auf Feld 0 (name) → springt zu Feld 1 (description)
    stdin.write('\r');
    // Warten bis React re-rendert (description bekommt focus=true)
    await new Promise((r) => setTimeout(r, 30));
    // Enter auf Feld 1 (description, letztes Feld) → löst handleSubmit aus
    stdin.write('\r');
    await new Promise((r) => setTimeout(r, 50));

    expect(lastFrame()).toContain('Name ist erforderlich');
    expect(createCategoryMock).not.toHaveBeenCalled();
  });
});
