import * as React from 'react'
import { render } from '@testing-library/react'
import '@testing-library/jest-dom'
import { CCalendar } from '../CCalendar'
import './setup'

describe('CCalendar', () => {
  it('loads and displays CCalendar component', () => {
    const { container } = render(<CCalendar />)
    expect(container).toMatchSnapshot()
  })

  it('renders with default props', () => {
    const { container } = render(<CCalendar />)
    expect(container.querySelector('.calendars')).toBeInTheDocument()
  })

  it('handles date string props correctly', () => {
    const { container } = render(<CCalendar calendarDate="2/16/2022" />)
    expect(container.querySelector('.calendars')).toBeInTheDocument()
  })

  it('handles Date object props correctly', () => {
    const testDate = new Date(2022, 1, 16)
    const { container } = render(<CCalendar calendarDate={testDate} />)
    expect(container.querySelector('.calendars')).toBeInTheDocument()
  })

  it('handles invalid dates gracefully', () => {
    const { container } = render(<CCalendar calendarDate="invalid-date" />)
    expect(container.querySelector('.calendars')).toBeInTheDocument()
  })

  it('handles null/undefined dates gracefully', () => {
    const { container } = render(<CCalendar calendarDate={null} />)
    expect(container.querySelector('.calendars')).toBeInTheDocument()
  })

  it('supports range selection', () => {
    const { container } = render(
      <CCalendar
        range
        startDate="2/16/2022"
        endDate="2/20/2022"
      />
    )
    expect(container.querySelector('.calendars')).toBeInTheDocument()
  })

  it('supports disabled dates', () => {
    const disabledDates = [new Date(2022, 1, 16), new Date(2022, 1, 17)]
    const { container } = render(<CCalendar disabledDates={disabledDates} />)
    expect(container.querySelector('.calendars')).toBeInTheDocument()
  })

  it('supports min/max date constraints', () => {
    const { container } = render(
      <CCalendar
        minDate="1/1/2022"
        maxDate="12/31/2022"
      />
    )
    expect(container.querySelector('.calendars')).toBeInTheDocument()
  })

  it('supports different selection types', () => {
    const selectionTypes = ['day', 'week', 'month', 'year'] as const

    selectionTypes.forEach(type => {
      const { container } = render(<CCalendar selectionType={type} />)
      expect(container.querySelector('.calendars')).toBeInTheDocument()
    })
  })

  it('supports different locales', () => {
    const locales = ['en-US', 'pl-PL', 'de-DE', 'fr-FR']

    locales.forEach(locale => {
      const { container } = render(<CCalendar locale={locale} />)
      expect(container.querySelector('.calendars')).toBeInTheDocument()
    })
  })

  it('handles prop updates correctly', () => {
    const { container, rerender } = render(<CCalendar calendarDate="2/16/2022" />)
    expect(container.querySelector('.calendars')).toBeInTheDocument()

    rerender(<CCalendar calendarDate="3/16/2022" />)
    expect(container.querySelector('.calendars')).toBeInTheDocument()
  })
})

// Additional regression tests for the timezone fix
describe('CCalendar Timezone Fix Regression Tests', () => {
  it('correctly parses dates without timezone shifting', () => {
    const { container } = render(<CCalendar calendarDate="2/16/2022" />)
    expect(container.querySelector('.calendars')).toBeInTheDocument()
  })

  it('maintains correct dates across different timezones', () => {
    const testDates = ['1/1/2022', '6/15/2022', '12/31/2022']

    testDates.forEach(dateString => {
      const { container } = render(<CCalendar calendarDate={dateString} />)
      expect(container.querySelector('.calendars')).toBeInTheDocument()
    })
  })

  it('handles leap year dates correctly', () => {
    const { container } = render(<CCalendar calendarDate="2/29/2024" />)
    expect(container.querySelector('.calendars')).toBeInTheDocument()
  })

  it('handles DST transition dates correctly', () => {
    const dstDates = ['3/11/2023', '3/12/2023', '11/4/2023', '11/5/2023']

    dstDates.forEach(dateString => {
      const { container } = render(<CCalendar calendarDate={dateString} />)
      expect(container.querySelector('.calendars')).toBeInTheDocument()
    })
  })
})
