import { render, screen } from '@testing-library/react'
import { MemoryRouter, Routes, Route } from 'react-router-dom'
import { vi, beforeEach, describe, it, expect } from 'vitest'
import { ProtectedRoute } from '../src/components/ProtectedRoute'
import * as sb from '../src/lib/supabase'
import * as authHook from '../src/hooks/useAuth'

beforeEach(() => vi.restoreAllMocks())

function renderAt(ui: React.ReactNode) {
  return render(
    <MemoryRouter initialEntries={['/admin']}>
      <Routes>
        <Route path="/login" element={<div>LOGIN PAGE</div>} />
        <Route path="/admin" element={ui as any} />
      </Routes>
    </MemoryRouter>
  )
}

describe('ProtectedRoute', () => {
  it('renders not-configured panel when Supabase not configured', () => {
    vi.spyOn(sb, 'isSupabaseConfigured').mockReturnValue(false)
    vi.spyOn(authHook, 'useAuth').mockReturnValue({ isAuthenticated: false, loading: false } as any)
    renderAt(<ProtectedRoute><div>SECRET</div></ProtectedRoute>)
    expect(screen.getByText('Authentication not configured')).toBeInTheDocument()
    expect(screen.queryByText('SECRET')).not.toBeInTheDocument()
  })

  it('redirects to /login when configured but unauthenticated', () => {
    vi.spyOn(sb, 'isSupabaseConfigured').mockReturnValue(true)
    vi.spyOn(authHook, 'useAuth').mockReturnValue({ isAuthenticated: false, loading: false } as any)
    renderAt(<ProtectedRoute><div>SECRET</div></ProtectedRoute>)
    expect(screen.getByText('LOGIN PAGE')).toBeInTheDocument()
    expect(screen.queryByText('SECRET')).not.toBeInTheDocument()
  })

  it('renders children when configured and authenticated', () => {
    vi.spyOn(sb, 'isSupabaseConfigured').mockReturnValue(true)
    vi.spyOn(authHook, 'useAuth').mockReturnValue({ isAuthenticated: true, loading: false } as any)
    renderAt(<ProtectedRoute><div>SECRET</div></ProtectedRoute>)
    expect(screen.getByText('SECRET')).toBeInTheDocument()
  })

  it('shows a loading indicator while auth is loading', () => {
    vi.spyOn(sb, 'isSupabaseConfigured').mockReturnValue(true)
    vi.spyOn(authHook, 'useAuth').mockReturnValue({ isAuthenticated: false, loading: true } as any)
    renderAt(<ProtectedRoute><div>SECRET</div></ProtectedRoute>)
    expect(screen.queryByText('SECRET')).not.toBeInTheDocument()
    expect(screen.queryByText('LOGIN PAGE')).not.toBeInTheDocument()
  })
})
