import { describe, it, expect, vi, beforeEach } from 'vitest';
import { screen, waitFor } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import { renderWithProviders } from '../../test/utils';

vi.mock('sonner', () => ({ toast: { success: vi.fn(), error: vi.fn() } }));

const setOverride = { mutate: vi.fn(), isPending: false };
const removeOverride = { mutate: vi.fn(), isPending: false };

let holidays: Array<{ uuid: string; date: number; title: string }> = [];
let overrides: Array<{ uuid: string; date: number; is_working: boolean }> = [];

vi.mock('../../hooks/useResourceCalendar', () => ({
  useHolidays: () => ({ holidays, overrides, loading: false, setOverride, removeOverride }),
}));

import NationalHolidaysCard from './NationalHolidaysCard';

const NOWRUZ = { uuid: 'h-1', date: 1774040400, title: 'نوروز' };

describe('NationalHolidaysCard', () => {
  beforeEach(() => {
    holidays = [NOWRUZ];
    overrides = [];
    vi.clearAllMocks();
  });

  it('تعطیلات رسمی سال را نشان می‌دهد', () => {
    renderWithProviders(<NationalHolidaysCard canUpdate year={1405} />);

    expect(screen.getByText(/نوروز/)).toBeInTheDocument();
    expect(screen.getByText('تعطیل')).toBeInTheDocument();
  });

  /** محیطی که آن روز کار می‌کند، تعطیلیِ سراسری را برای خودش خنثی می‌کند. */
  it('با یک کلیک روز را برای این محیط باز می‌کند', async () => {
    const user = userEvent.setup();
    renderWithProviders(<NationalHolidaysCard canUpdate year={1405} />);

    await user.click(screen.getByRole('button', { name: 'این روز باز است' }));

    expect(setOverride.mutate).toHaveBeenCalledWith({ date: NOWRUZ.date, is_working: true });
  });

  it('روزی که استثنا خورده، «باز» است و می‌شود دوباره تعطیلش کرد', async () => {
    overrides = [{ uuid: 'o-1', date: NOWRUZ.date, is_working: true }];
    const user = userEvent.setup();
    renderWithProviders(<NationalHolidaysCard canUpdate year={1405} />);

    expect(screen.getByText('باز')).toBeInTheDocument();
    await user.click(screen.getByRole('button', { name: 'تعطیل کن' }));

    expect(removeOverride.mutate).toHaveBeenCalledWith('o-1');
  });

  /** ساخت و حذفِ خودِ تعطیلی کارِ مدیر سیستم است؛ اینجا فقط استثنا زده می‌شود. */
  it('بدون مجوز ویرایش، هیچ دکمه‌ای نمی‌دهد', () => {
    renderWithProviders(<NationalHolidaysCard canUpdate={false} year={1405} />);

    expect(screen.queryByRole('button')).not.toBeInTheDocument();
    expect(screen.getByText('تنظیمات ← تعطیلات رسمی')).toHaveAttribute('href', '/admin/holidays');
  });

  it('سالِ بدون تعطیلی را صریح می‌گوید', async () => {
    holidays = [];
    renderWithProviders(<NationalHolidaysCard canUpdate year={1405} />);

    await waitFor(() => expect(screen.getByText(/تعطیلی رسمی ثبت نشده است/)).toBeInTheDocument());
  });
});
