import { describe, it, expect, vi, beforeEach } from 'vitest';
import { screen } 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 create = { mutate: vi.fn(), isPending: false };
const update = { mutate: vi.fn(), isPending: false };
const remove = { mutate: vi.fn(), isPending: false };

let holidays: Array<{ uuid: string; date: number; jalali_date: string; jalali_year: number; title: string }> = [];

vi.mock('../hooks/useNationalHolidays', () => ({
  useNationalHolidays: () => ({ holidays, loading: false, create, update, remove }),
}));

import NationalHolidaysPage from './NationalHolidaysPage';

// ۱۴۰۵-۰۱-۱۳ ⇒ ۲۰۲۶-۰۴-۰۲
const NOWRUZ13 = {
  uuid: 'h-1',
  date: Math.floor(new Date(2026, 3, 2).getTime() / 1000),
  jalali_date: '1405-01-13',
  jalali_year: 1405,
  title: 'سیزده‌بدر',
};

describe('NationalHolidaysPage', () => {
  beforeEach(() => {
    holidays = [NOWRUZ13];
    vi.clearAllMocks();
  });

  it('تعطیلات سال را فهرست می‌کند', () => {
    renderWithProviders(<NationalHolidaysPage />);

    expect(screen.getByText('سیزده‌بدر')).toBeInTheDocument();
  });

  /** تاریخ کلید یکتاست؛ ویرایش فقط عنوان را عوض می‌کند. */
  it('ویرایش، تاریخ را قفل و فقط عنوان را می‌فرستد', async () => {
    const user = userEvent.setup();
    renderWithProviders(<NationalHolidaysPage />);

    await user.click(screen.getByRole('button', { name: 'ویرایش' }));
    expect(screen.getByText(/تاریخ تغییر نمی‌کند/)).toBeInTheDocument();

    const title = screen.getByLabelText('مناسبت');
    await user.clear(title);
    await user.type(title, 'روز طبیعت');
    await user.click(screen.getByRole('button', { name: 'ذخیره' }));

    expect(update.mutate).toHaveBeenCalledWith(
      { uuid: 'h-1', title: 'روز طبیعت' },
      expect.anything(),
    );
  });

  it('بدون تاریخ، دکمهٔ ذخیره غیرفعال است', async () => {
    const user = userEvent.setup();
    renderWithProviders(<NationalHolidaysPage />);

    await user.click(screen.getByRole('button', { name: /افزودن تعطیلی/ }));
    await user.type(screen.getByLabelText('مناسبت'), 'مناسبت تازه');

    expect(screen.getByRole('button', { name: 'ذخیره' })).toBeDisabled();
  });

  it('حذف، هشدارِ دامنهٔ اثر را می‌دهد', async () => {
    const user = userEvent.setup();
    renderWithProviders(<NationalHolidaysPage />);

    await user.click(screen.getByRole('button', { name: 'حذف' }));

    expect(screen.getByText(/از تقویم همهٔ کلینیک‌ها برداشته می‌شود/)).toBeInTheDocument();
  });

  it('سالِ خالی را صریح می‌گوید', () => {
    holidays = [];
    renderWithProviders(<NationalHolidaysPage />);

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

  /** سال در URL می‌نشیند تا «بازگشت» و رفرش همان سال را بدهند. */
  it('سال را از URL می‌خواند', () => {
    renderWithProviders(<NationalHolidaysPage />, { route: '/admin/national-holidays?year=1403' });

    expect(screen.getByText('سال ۱۴۰۳')).toBeInTheDocument();
  });
});
