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

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

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

vi.mock('../../../utils/api-client.js', () => ({
  client: {
    countries: {
      search: vi.fn().mockResolvedValue([]),
    },
  },
}));

const createSupplierMock = vi.fn();

const defaultState = {
  suppliers: [],
  loading: false,
  error: null,
  fetchSuppliers: vi.fn(),
  createSupplier: createSupplierMock,
  updateSupplier: vi.fn(),
  activateSupplier: vi.fn(),
  deactivateSupplier: vi.fn(),
  rateSupplier: vi.fn(),
  addCertificate: vi.fn(),
  removeCertificate: vi.fn(),
  clearError: vi.fn(),
};

describe('TC-SUP: Lieferanten-Formular', () => {
  beforeEach(() => {
    vi.clearAllMocks();
    vi.mocked(useSuppliers).mockReturnValue(defaultState);
  });

  it('TC-SUP-01: Rendert Formular mit Pflichtfeld-Labels', () => {
    const { lastFrame } = render(React.createElement(SupplierCreateScreen));
    expect(lastFrame()).toContain('Neuer Lieferant');
    expect(lastFrame()).toContain('Name *');
    expect(lastFrame()).toContain('Telefon *');
  });

  it('TC-SUP-02: API-Fehler wird im Formular angezeigt', () => {
    vi.mocked(useSuppliers).mockReturnValue({
      ...defaultState,
      error: 'Lieferant mit diesem Namen existiert bereits.',
    });
    const { lastFrame } = render(React.createElement(SupplierCreateScreen));
    expect(lastFrame()).toContain('Lieferant mit diesem Namen existiert bereits.');
  });

  it('TC-SUP-03: Leerer Name → Fehlermeldung, kein API-Call', async () => {
    createSupplierMock.mockResolvedValue(null);
    vi.mocked(useSuppliers).mockReturnValue({ ...defaultState, createSupplier: createSupplierMock });

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

    // Tab durch alle 9 Feldübergänge bis zum letzten Feld (paymentDueDays)
    for (let i = 0; i < 9; i++) {
      stdin.write('\t');
    }
    // Warten bis React re-rendert und das fokussierte Feld aktualisiert
    await new Promise((r) => setTimeout(r, 30));
    // Enter auf letztem Feld (paymentDueDays) löst handleSubmit aus
    stdin.write('\r');
    await new Promise((r) => setTimeout(r, 50));

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