import React from 'react';
import { describe, it, expect, vi } from 'vitest';
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import { MemoryRouter } from 'react-router-dom';
import { I18nextProvider } from 'react-i18next';
import { ThemeProvider } from '@/app/providers/ThemeProvider';
import '@testing-library/jest-dom';
import { SprintActionsMenu } from '@/features/projects/components/SprintActionsMenu';
import type { ProjectSprint } from '@/features/projects/types/project.types';
import i18n from '@/locales/i18n';

const activeSprint: ProjectSprint = {
  id: 's1',
  project_id: 'p1',
  name: 'Sprint 1',
  goal: 'Ship it',
  status: 'active',
  start_date: '2026-01-01',
  due_date: '2026-01-14',
  completed_at: null,
  sort_order: 0,
  is_overdue: false,
};

function renderMenu(overrides: Partial<React.ComponentProps<typeof SprintActionsMenu>> = {}) {
  return render(
    <I18nextProvider i18n={i18n}>
      <ThemeProvider>
        <MemoryRouter>
          <SprintActionsMenu
            sprint={activeSprint}
            projectId="p1"
            onEdit={vi.fn()}
            onComplete={vi.fn()}
            onCancel={vi.fn()}
            {...overrides}
          />
        </MemoryRouter>
      </ThemeProvider>
    </I18nextProvider>,
  );
}

describe('SprintActionsMenu', () => {
  it('shows active sprint actions when lifecycle metadata is missing', async () => {
    const user = userEvent.setup();
    renderMenu({ sprint: { ...activeSprint, lifecycle: undefined } });

    await user.click(screen.getByRole('button', { name: /more/i }));

    expect(screen.getByRole('menuitem', { name: /view sprint/i })).toBeInTheDocument();
    expect(screen.getByRole('menuitem', { name: /edit sprint/i })).toBeInTheDocument();
    expect(screen.getByRole('menuitem', { name: /complete sprint/i })).toBeInTheDocument();
  });

  it('hides management actions when handlers are not provided', async () => {
    const user = userEvent.setup();
    renderMenu({
      sprint: { ...activeSprint, lifecycle: undefined },
      onEdit: undefined,
      onComplete: undefined,
      onCancel: undefined,
    });

    await user.click(screen.getByRole('button', { name: /more/i }));

    expect(screen.getByRole('menuitem', { name: /view sprint/i })).toBeInTheDocument();
    expect(screen.queryByRole('menuitem', { name: /edit sprint/i })).not.toBeInTheDocument();
    expect(screen.queryByRole('menuitem', { name: /complete sprint/i })).not.toBeInTheDocument();
  });
});
