import { describe, it, expect, vi, beforeEach } from 'vitest'
import { render, screen, fireEvent, waitFor } from '@testing-library/react'
import { I18nProvider } from '../i18n'
import { D2SignInPage } from './D2SignInPage'
import * as api from '../api/identity'

vi.mock('../api/identity')

const renderPage = (onNav = () => {}) =>
  render(<I18nProvider initial="en"><D2SignInPage onNav={onNav} /></I18nProvider>)

describe('D2SignInPage', () => {
  beforeEach(() => vi.resetAllMocks())

  it('offers passkey sign-in and no password field', () => {
    renderPage()
    expect(screen.getByRole('button', { name: 'Sign in with passkey' })).toBeInTheDocument()
    expect(document.querySelector('input[type="password"]')).toBeNull()
  })

  it('signs in with a discoverable passkey and navigates to the account', async () => {
    const onNav = vi.fn()
    vi.mocked(api.signIn).mockResolvedValue({
      account: {
        id: 'a1', public_handle: 'ali', display_alias: 'Ali', role: 'customer',
        status: 'active', preferred_language: 'en',
      },
      csrf_token: 'csrf',
    })
    renderPage(onNav)
    fireEvent.click(screen.getByRole('button', { name: 'Sign in with passkey' }))
    await waitFor(() => expect(api.signIn).toHaveBeenCalledWith(undefined))
    await waitFor(() => expect(onNav).toHaveBeenCalledWith('id/account'))
  })

  it('reveals a handle-assisted fallback and passes the handle', async () => {
    vi.mocked(api.signIn).mockResolvedValue({
      account: {
        id: 'a1', public_handle: 'ali', display_alias: 'Ali', role: 'customer',
        status: 'active', preferred_language: 'en',
      },
      csrf_token: 'csrf',
    })
    renderPage()
    fireEvent.click(screen.getByRole('button', { name: 'Sign in with a handle instead' }))
    fireEvent.change(await screen.findByLabelText('Public handle'), { target: { value: 'ali' } })
    fireEvent.click(screen.getByRole('button', { name: 'Sign in with handle' }))
    await waitFor(() => expect(api.signIn).toHaveBeenCalledWith('ali'))
  })
})
