/**
 * GenerateBriefModal tests — NEW-CI-007: serp_key_available scope preview.
 *
 * The component does not call usePage(), so no Inertia provider is needed.
 * Inertia's `Link` is mocked as a plain anchor in resources/js/test/setup.ts.
 * The global `route()` mock handles `settings.serp` via mockRoutes in setup.ts.
 */
import { render, screen } from '@testing-library/react';
import { describe, expect, it } from 'vitest';

import GenerateBriefModal from './GenerateBriefModal';

const noop = () => {};
const noopForm = (e: React.FormEvent) => e.preventDefault();

const baseProps = {
  open: true,
  onOpenChange: noop,
  targetKeyword: 'content marketing',
  onTargetKeywordChange: noop,
  customInstructions: '',
  onCustomInstructionsChange: noop,
  onSubmit: noopForm,
  processing: false,
  errors: {},
};

describe('GenerateBriefModal', () => {
  it('renders the dialog when open=true', () => {
    render(<GenerateBriefModal {...baseProps} />);
    expect(screen.getByText('Generate Content Brief')).toBeInTheDocument();
  });

  it('does NOT render the dialog content when open=false', () => {
    render(<GenerateBriefModal {...baseProps} open={false} />);
    expect(screen.queryByText('Generate Content Brief')).not.toBeInTheDocument();
  });

  it('shows SERP-grounded bullet list when serpKeyAvailable=true', () => {
    render(<GenerateBriefModal {...baseProps} serpKeyAvailable={true} />);
    expect(screen.getByText('Brief will include:')).toBeInTheDocument();
    expect(screen.getByText(/competitive positioning/i)).toBeInTheDocument();
  });

  it('shows SERP-grounded bullet list when serpKeyAvailable is omitted (default=true)', () => {
    render(<GenerateBriefModal {...baseProps} />);
    expect(screen.getByText('Brief will include:')).toBeInTheDocument();
    expect(screen.getByText(/competitive positioning/i)).toBeInTheDocument();
    // Degrade notice must NOT be present
    expect(screen.queryByText(/Generic brief/i)).not.toBeInTheDocument();
  });

  it('shows degrade notice when serpKeyAvailable=false', () => {
    render(<GenerateBriefModal {...baseProps} serpKeyAvailable={false} />);
    expect(screen.getByText('Generic brief (no competitor data)')).toBeInTheDocument();
    expect(
      screen.getByText(/Without a DataForSEO key this brief is generated from your GSC data only/),
    ).toBeInTheDocument();
  });

  it('hides SERP-grounded bullet list when serpKeyAvailable=false', () => {
    render(<GenerateBriefModal {...baseProps} serpKeyAvailable={false} />);
    expect(screen.queryByText('Brief will include:')).not.toBeInTheDocument();
    expect(screen.queryByText(/competitive positioning/i)).not.toBeInTheDocument();
  });

  it('renders Add DataForSEO key link pointing to settings.serp when serpKeyAvailable=false', () => {
    render(<GenerateBriefModal {...baseProps} serpKeyAvailable={false} />);
    const link = screen.getByRole('link', { name: /Add a DataForSEO key/i });
    expect(link).toBeInTheDocument();
    // Link href comes from the mockRoutes route() function — /settings/serp
    expect(link).toHaveAttribute('href', '/settings/serp');
  });

  it('does NOT render the degrade link when serpKeyAvailable=true', () => {
    render(<GenerateBriefModal {...baseProps} serpKeyAvailable={true} />);
    expect(screen.queryByRole('link', { name: /Add a DataForSEO key/i })).not.toBeInTheDocument();
  });

  it('renders the model label in the AI usage section', () => {
    render(<GenerateBriefModal {...baseProps} modelLabel="gpt-4o" />);
    expect(screen.getByText('gpt-4o')).toBeInTheDocument();
  });

  it('renders validation error for target_keyword', () => {
    render(
      <GenerateBriefModal
        {...baseProps}
        errors={{ target_keyword: 'Keyword is required' }}
      />,
    );
    expect(screen.getByText('Keyword is required')).toBeInTheDocument();
  });

  it('shows custom description text', () => {
    render(<GenerateBriefModal {...baseProps} description="Test description text" />);
    expect(screen.getByText('Test description text')).toBeInTheDocument();
  });
});
