import { useEffect, type ReactNode } from 'react'
import { HeadContent, Outlet, Scripts, createRootRouteWithContext, useRouter } from '@tanstack/react-router'
import { QueryClientProvider } from '@tanstack/react-query'
import { Toaster } from 'sonner'
import type { RouterContext } from '@/router'
import { supabase } from '@/integrations/supabase/client'
import { RouteError, RouteNotFound } from '@/lib/route-ui'
import styles from '@/styles.css?url'

export const Route = createRootRouteWithContext<RouterContext>()({
  head: () => ({
    meta: [
      { charSet: 'utf-8' },
      { name: 'viewport', content: 'width=device-width, initial-scale=1' },
      { title: 'Central de Tarefas IA' },
      { name: 'description', content: 'Organize tarefas, prioridades e produtividade em um só lugar.' },
      { property: 'og:type', content: 'website' },
      { name: 'twitter:card', content: 'summary' },
    ],
    links: [{ rel:'stylesheet', href:styles }],
  }),
  component: RootComponent,
  errorComponent: ({error,reset}) => <RouteError error={error} reset={reset}/>,
  notFoundComponent: RouteNotFound,
})

function RootComponent() {
  const { queryClient } = Route.useRouteContext()
  const router = useRouter()
  useEffect(() => {
    const { data: { subscription } } = supabase.auth.onAuthStateChange((event) => {
      if (event === 'SIGNED_IN' || event === 'USER_UPDATED') {
        void router.invalidate()
        void queryClient.invalidateQueries()
      } else if (event === 'SIGNED_OUT') {
        void router.invalidate()
      }
    })
    return () => subscription.unsubscribe()
  }, [queryClient, router])
  return <QueryClientProvider client={queryClient}><RootDocument><Outlet/></RootDocument></QueryClientProvider>
}

function RootDocument({ children }: { children: ReactNode }) {
  return <html lang="pt-BR" suppressHydrationWarning><head><script dangerouslySetInnerHTML={{__html:`try{const t=localStorage.getItem('theme');if(t==='dark')document.documentElement.classList.add('dark')}catch{}`}}/><HeadContent/></head><body>{children}<Toaster richColors position="top-right"/><Scripts/></body></html>
}
