import { expect, test, type Page } from '@playwright/test';
import { startTestServer } from './test-server.js';

const password = 'E2E-Strong-Password-123!';
let stopServer: (() => Promise<void>) | undefined;

test.beforeAll(async () => { stopServer = await startTestServer(); });
test.afterAll(async () => { await stopServer?.(); });

async function login(page: Page, username: string) {
  await page.goto('/login');
  await page.locator('input[name="username"]').fill(username);
  await page.locator('input[name="password"]').fill(password);
  await page.getByRole('button', { name: 'ورود امن' }).click();
  await expect(page).toHaveURL(/:\/\/[^/]+\/$/);
}

test('گردش حیاتی مدیر کل، مدیر تأمین و انباردار', async ({ page, context }) => {
  const invoiceNumber = `E2E-${Date.now()}`;

  await login(page, 'e2e-admin');
  await page.goto('/invoices/create');
  await page.locator('input[name="invoiceNumber"]').fill(invoiceNumber);
  await page.locator('select[name="requesterId"]').selectOption({ index: 1 });
  await page.locator('input[name="customerName"]').fill('مشتری آزمون خودکار');
  await page.getByRole('button', { name: 'ثبت فاکتور دستی' }).click();
  await expect(page).toHaveURL(/\/invoices\/[0-9a-f-]+$/);
  const invoiceUrl = page.url();
  await expect(page.getByText(invoiceNumber, { exact: true })).toBeVisible();

  await context.clearCookies();
  await login(page, 'e2e-supply');
  await page.goto(invoiceUrl);
  await expect(page.locator('input[name="requesterId"]')).not.toHaveValue('');
  await expect(page.locator('input[x-model="query"]')).not.toHaveValue('');
  await page.locator('select[name="warehouseId"]').selectOption({ index: 1 });
  page.once('dialog', (dialog) => dialog.accept());
  await page.getByRole('button', { name: 'تأیید و ارسال به انبار' }).click();
  await expect(page.getByText('در انتظار تحویل', { exact: true })).toBeVisible();

  await context.clearCookies();
  await login(page, 'e2e-warehouse');
  await page.goto('/warehouse');
  const row = page.getByRole('row').filter({ hasText: invoiceNumber });
  await expect(row).toBeVisible();
  await row.getByRole('link', { name: 'بازکردن' }).click();
  page.once('dialog', (dialog) => dialog.accept());
  await page.getByRole('button', { name: 'تحویل کالا' }).click();
  await expect(page).toHaveURL(/\/warehouse$/);
  await expect(page.getByRole('row').filter({ hasText: invoiceNumber })).toHaveCount(0);

  await context.clearCookies();
  await login(page, 'e2e-admin');
  await page.goto(invoiceUrl);
  await expect(page.locator('li').filter({ hasText: 'تحویل کالا' })).toBeVisible();
});
