import React from 'react';
import { describe, it, expect, vi, beforeEach } from 'vitest';
import { render, screen, waitFor } 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 { LocaleProvider } from '@/app/providers/LocaleProvider';
import '@testing-library/jest-dom';
import { PortfolioExecutiveGantt } from '@/features/projects/components/PortfolioExecutiveGantt';
import * as productAnalytics from '@/shared/analytics/productAnalytics';
import * as projectService from '@/features/projects/services/projectService';
import i18n from '@/locales/i18n';
import type { PortfolioTimelineRow } from '@/features/projects/types/project.types';

vi.mock('@/shared/analytics/productAnalytics', () => ({
  trackProductEvent: vi.fn(),
}));

vi.mock('@/features/projects/services/projectService', () => ({
  fetchProjectHealthExplanation: vi.fn(),
}));

const summary = {
  total_projects: 2,
  active_projects: 2,
  completed_projects: 0,
  delayed_projects: 1,
  blocked_projects: 1,
  at_risk_projects: 1,
  portfolio_health_score: 78,
  portfolio_health_class: 'healthy',
  health_trend: {
    previous_score: 72,
    trend_percent: 8.3,
    direction: 'up',
  },
  portfolio_health_contributors: {
    blocked: 40,
    delayed: 30,
    risks: 20,
    capacity: 10,
  },
  portfolio_health_drivers: {
    at_risk_projects: 1,
    delayed_projects: 1,
    blocked_dependencies: 2,
    critical_projects: 1,
    healthy_projects: 1,
  },
  portfolio_forecast: {
    planned_finish: '2026-10-01',
    forecast_finish: '2026-10-15',
    variance_days: 14,
    confidence_percent: 82,
    label: 'behind',
  },
  delivery_confidence: {
    percent: 82,
    level: 'high',
  },
};

const rows: PortfolioTimelineRow[] = [
  {
    id: 'project-p1',
    project_id: 'p1',
    title: 'Owner Portal',
    owner: 'Alex',
    department: 'IT',
    start_date: '2026-01-01',
    end_date: '2020-01-01',
    planned_start_date: '2026-01-01',
    planned_end_date: '2020-01-01',
    actual_start_date: null,
    actual_end_date: null,
    progress_percentage: 40,
    status: 'active',
    health: 'critical',
    current_sprint: null,
    next_milestone: null,
    delayed_milestones_count: 1,
    milestones_count: 1,
    open_risks_count: 0,
    blocked_dependencies_count: 0,
    is_delayed: true,
    is_blocked: false,
    is_at_risk: true,
    milestones: [{ id: 'm1', name: 'Beta', due_date: '2026-03-01', completed: false }],
  },
  {
    id: 'project-p2',
    project_id: 'p2',
    title: 'Benefits Platform',
    owner: 'Sam',
    department: 'HR',
    start_date: '2026-02-01',
    end_date: '2026-08-01',
    planned_start_date: '2026-02-01',
    planned_end_date: '2026-08-01',
    actual_start_date: null,
    actual_end_date: null,
    progress_percentage: 55,
    status: 'active',
    health: 'healthy',
    current_sprint: null,
    next_milestone: null,
    delayed_milestones_count: 0,
    milestones_count: 0,
    open_risks_count: 0,
    blocked_dependencies_count: 2,
    is_delayed: false,
    is_blocked: true,
    is_at_risk: false,
    milestones: [],
  },
];

function renderGantt() {
  return render(
    <I18nextProvider i18n={i18n}>
      <LocaleProvider>
        <ThemeProvider>
          <MemoryRouter>
            <PortfolioExecutiveGantt
              rows={rows}
              summary={summary}
              rangeStart={new Date('2026-01-01')}
              rangeEnd={new Date('2026-12-31')}
              onOpenDetailedGantt={vi.fn()}
            />
          </MemoryRouter>
        </ThemeProvider>
      </LocaleProvider>
    </I18nextProvider>,
  );
}

describe('PortfolioExecutiveGantt', () => {
  beforeEach(() => {
    vi.clearAllMocks();
    vi.mocked(projectService.fetchProjectHealthExplanation).mockResolvedValue({
      project_id: 'p1',
      project_name: 'Owner Portal',
      health_score: 42,
      status: 'critical',
      reasons: ['4 blocked dependencies'],
      impacts: ['Delivery slip risk'],
      recommended_actions: ['Escalate dependency owner'],
      risk_contributors: { blocked: 40, delayed: 30, risks: 20, capacity: 10 },
      sprint_health_score: 38,
      forecast_variance_days: 21,
    });
  });

  it('renders blocked projects and portfolio health KPIs', () => {
    renderGantt();
    expect(screen.getAllByText(/Blocked|محجوبة/i).length).toBeGreaterThan(0);
    expect(screen.getByText(/Portfolio Health|صحة المحفظة/i)).toBeInTheDocument();
    expect(screen.getAllByText('1').length).toBeGreaterThan(0);
  });

  it('shows portfolio summary storytelling banner', () => {
    renderGantt();
    expect(screen.getByLabelText(/Portfolio Summary|ملخص المحفظة/i)).toBeInTheDocument();
    expect(screen.getAllByText(/Delivery Confidence|ثقة التسليم/i).length).toBeGreaterThan(0);
    expect(screen.getAllByText(/82% High|82% عالية/i).length).toBeGreaterThan(0);
  });

  it('shows health drivers and forecast KPIs', () => {
    renderGantt();
    expect(screen.getByText(/Drivers:|العوامل:/i)).toBeInTheDocument();
    expect(screen.getAllByText(/Portfolio Forecast|توقع المحفظة/i).length).toBeGreaterThan(0);
    expect(screen.getAllByText(/14 Days Behind Plan|14 يوماً عن الخطة/i).length).toBeGreaterThan(0);
  });

  it('shows top attention items with priority scores', () => {
    renderGantt();
    expect(screen.getByText(/Top Attention Items|أهم عناصر التدخل/i)).toBeInTheDocument();
    expect(screen.getAllByText('Owner Portal').length).toBeGreaterThan(0);
    expect(screen.getAllByText('Benefits Platform').length).toBeGreaterThan(0);
    expect(screen.getAllByText(/Priority Score|درجة الأولوية/i).length).toBeGreaterThan(0);
  });

  it('shows executive columns and variance badges without bar labels', () => {
    renderGantt();
    expect(screen.getByLabelText(/Timeline legend|دليل الرموز/i)).toBeInTheDocument();
    expect(screen.getByText(/Variance|التباين/i)).toBeInTheDocument();
    expect(screen.getAllByText(/Progress|التقدم/i).length).toBeGreaterThan(0);
    expect(screen.getAllByText(/Health|الصحة/i).length).toBeGreaterThan(0);
    expect(screen.getAllByText(/Late|متأخر|On Schedule|في الموعد/i).length).toBeGreaterThan(0);
    expect(screen.getAllByText('40%').length).toBe(1);
    expect(screen.getAllByText('55%').length).toBe(1);
  });

  it('shows portfolio health as primary KPI with trend', () => {
    renderGantt();
    expect(screen.getByText(/Portfolio Health|صحة المحفظة/i)).toBeInTheDocument();
    expect(screen.getByText(/vs last month|مقارنة بالشهر الماضي/i)).toBeInTheDocument();
    expect(screen.getAllByText(/Healthy|سليم/i).length).toBeGreaterThan(0);
  });

  it('tracks project row click and opens health drawer', async () => {
    const user = userEvent.setup();
    renderGantt();

    const ganttRow = screen
      .getAllByTestId('portfolio-gantt-row')
      .find((row) => row.textContent?.includes('Owner Portal'));
    await user.click(ganttRow!);

    expect(productAnalytics.trackProductEvent).toHaveBeenCalledWith('project_row_opened', {
      view: 'executive',
      project_id: 'p1',
    });

    await waitFor(() => {
      expect(screen.getByText(/Project Health Summary|ملخص صحة المشروع/i)).toBeInTheDocument();
    });
    expect(projectService.fetchProjectHealthExplanation).toHaveBeenCalledWith('p1');
    expect(screen.getByText('4 blocked dependencies')).toBeInTheDocument();
  });
});
