import { http, HttpResponse } from 'msw'
import { test, expect } from './msw-setup'

const cancelledEventWithReason = {
  eventToken: 'a1b2c3d4-e5f6-7890-abcd-ef1234567890',
  title: 'Summer BBQ',
  description: 'Bring your own drinks!',
  dateTime: '2026-03-15T20:00:00+01:00',
  timezone: 'Europe/Berlin',
  location: 'Central Park, NYC',
  attendeeCount: 12,
  cancelled: true,
  cancellationReason: 'Venue no longer available',
}

const cancelledEventWithoutReason = {
  ...cancelledEventWithReason,
  cancellationReason: null,
}

test.describe('US2: Visitor sees cancelled event with reason', () => {
  test('visitor sees red banner with cancellation reason on cancelled event', async ({
    page,
    network,
  }) => {
    network.use(
      http.get('*/api/events/:token', () => HttpResponse.json(cancelledEventWithReason)),
    )

    await page.goto(`/events/${cancelledEventWithReason.eventToken}`)

    await expect(page.getByText(/This event has been cancelled/i)).toBeVisible()
    await expect(page.getByText('Venue no longer available')).toBeVisible()
  })
})

test.describe('US2: Visitor sees cancelled event without reason', () => {
  test('visitor sees red banner without reason when no reason was provided', async ({
    page,
    network,
  }) => {
    network.use(
      http.get('*/api/events/:token', () => HttpResponse.json(cancelledEventWithoutReason)),
    )

    await page.goto(`/events/${cancelledEventWithoutReason.eventToken}`)

    await expect(page.getByText(/This event has been cancelled/i)).toBeVisible()
    // No reason text shown
    await expect(page.getByText('Venue no longer available')).not.toBeVisible()
  })
})

test.describe('US2: RSVP buttons hidden on cancelled event', () => {
  test('RSVP buttons hidden on cancelled event, other details remain visible', async ({
    page,
    network,
  }) => {
    network.use(
      http.get('*/api/events/:token', () => HttpResponse.json(cancelledEventWithReason)),
    )

    await page.goto(`/events/${cancelledEventWithReason.eventToken}`)

    // Event details are still visible
    await expect(page.getByRole('heading', { name: 'Summer BBQ' })).toBeVisible()
    await expect(page.getByText('Bring your own drinks!')).toBeVisible()
    await expect(page.getByText('Central Park, NYC')).toBeVisible()
    await expect(page.getByText('12 going')).toBeVisible()

    // RSVP bar is NOT visible
    await expect(page.getByRole('button', { name: "I'm attending" })).not.toBeVisible()
  })
})
