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

vi.mock('../lib/api', () => ({
  api: { get: vi.fn(), post: vi.fn(), patch: vi.fn(), put: vi.fn(), delete: vi.fn() },
  ApiError: class extends Error {},
}));

import { api } from '../lib/api';
import { useAuthStore } from '../stores/authStore';
import MyFinancialPage from './MyFinancialPage';

const get = api.get as ReturnType<typeof vi.fn>;
const patch = api.patch as ReturnType<typeof vi.fn>;

const assigned = {
  uuid: 'bank-assigned',
  bank_name: 'ملی',
  card_number: '6037',
  account_number: '111',
  shaba_number: null,
  is_active: true,
  created_at: 0,
  entity_type: 'clinic' as const,
};

const unassigned = { ...assigned, uuid: 'bank-orphan', bank_name: 'ملت', entity_type: null };

beforeEach(() => {
  get.mockReset();
  patch.mockReset();
  useAuthStore.setState({
    primaryRole: 'clinic',
    context: { type: 'clinic', db_uuid: 'c1', name: 'کلینیک مرکزی', role: 'clinic' },
  } as any);
  get.mockImplementation((url: string) =>
    Promise.resolve({ success: true, data: url.includes('bank-accounts') ? [assigned, unassigned] : [] }),
  );
  patch.mockResolvedValue({ success: true, data: { ...unassigned, entity_type: 'clinic' } });
});

/**
 * کارت‌ها از فاز ۶ به محیط تعلق دارند نه به کاربر. کاربرِ چندمحیطی باید ببیند
 * کارت‌های جلوی چشمش مالِ کدام محیط‌اند، وگرنه با تعویض محیط فکر می‌کند گمشان کرده.
 */
describe('MyFinancialPage — محیط روش‌های پرداخت', () => {
  it('نام محیط فعال را در سرتیتر می‌آورد', async () => {
    renderWithProviders(<MyFinancialPage />);

    expect(await screen.findByText(/روش‌های پرداخت «کلینیک مرکزی»/)).toBeInTheDocument();
  });

  it('کارت محیط‌دار را با نام محیط و کارت بی‌محیط را با نشانهٔ «تعیین‌نشده» نشان می‌دهد', async () => {
    renderWithProviders(<MyFinancialPage />);

    expect(await screen.findByText('محیط تعیین‌نشده')).toBeInTheDocument();
    // نام محیط هم در سرتیتر می‌آید هم در ستون محیطِ کارتِ محیط‌دار
    expect(screen.getAllByText(/کلینیک مرکزی/).length).toBeGreaterThan(1);
  });

  it('کارت بی‌محیط به‌جای «ویرایش» دکمهٔ انتساب می‌گیرد و آن را به محیط فعال می‌چسباند', async () => {
    renderWithProviders(<MyFinancialPage />);

    const assign = await screen.findByRole('button', { name: /انتساب به کلینیک مرکزی/ });
    fireEvent.click(assign);

    await waitFor(() =>
      expect(patch).toHaveBeenCalledWith(
        '/api/v1/my/payment-methods/bank-accounts/bank-orphan/environment',
        {},
      ),
    );
  });

  it('کارت محیط‌دار همچنان دکمهٔ ویرایش دارد', async () => {
    renderWithProviders(<MyFinancialPage />);

    expect(await screen.findAllByRole('button', { name: /ویرایش/ })).toHaveLength(1);
  });
});
