import '@testing-library/jest-dom';
import { cleanup } from '@testing-library/react';
import { setupServer } from 'msw/node';
import { afterAll, afterEach, beforeAll, vi } from 'vitest';

import { handlers } from './mocks/handlers';

// Setup MSW server
export const server = setupServer(...handlers);

beforeAll(() => server.listen({ onUnhandledRequest: 'warn' }));
afterEach(() => {
  cleanup();
  server.resetHandlers();
});
afterAll(() => server.close());

// Mock Inertia router
vi.mock('@inertiajs/react', async () => {
  const actual = await vi.importActual('@inertiajs/react');
  const { createElement } = await import('react');
  return {
    ...actual,
    // Mock Head as a no-op to avoid Inertia context requirement in jsdom tests
    Head: () => null,
    // Mock Link as a plain anchor to avoid Inertia's URL resolution (which requires window.location to be a proper URL object)
    Link: ({
      href,
      children,
      className,
      ...rest
    }: {
      href: string;
      children: unknown;
      className?: string;
      [key: string]: unknown;
    }) =>
      createElement(
        'a',
        { href, className, ...rest },
        children as Parameters<typeof createElement>[2],
      ),
    router: {
      visit: vi.fn(),
      post: vi.fn(),
      get: vi.fn(),
      put: vi.fn(),
      patch: vi.fn(),
      delete: vi.fn(),
      reload: vi.fn(),
      on: vi.fn(() => vi.fn()),
    },
    usePage: vi.fn(() => ({
      props: {
        auth: { user: null },
        errors: {},
        flash: {},
        polling_interval_ms: 5000,
      },
    })),
  };
});

// Mock ziggy-js route helper
const mockRoutes: Record<string, string> = {
  login: '/login',
  register: '/register',
  dashboard: '/dashboard',
  'profile.edit': '/profile',
  'profile.update': '/profile',
  'profile.destroy': '/profile',
  'profile.export': '/profile/export',
  'password.request': '/forgot-password',
  'password.email': '/forgot-password',
  'password.reset': '/reset-password',
  'password.store': '/reset-password',
  'password.update': '/password',
  'password.confirm': '/confirm-password',
  'verification.notice': '/verify-email',
  'verification.send': '/email/verification-notification',
  'social.redirect': '/auth/redirect',
  'social.disconnect': '/auth/disconnect',
  logout: '/logout',
  'billing.plans': '/billing/plans',
  'billing.index': '/billing',
  'billing.subscribe': '/billing/subscribe',
  'billing.cancel': '/billing/cancel',
  'billing.resume': '/billing/resume',
  'billing.preview-swap': '/billing/preview-swap',
  'billing.swap': '/billing/swap',
  'billing.portal': '/billing/portal',
  'billing.quantity': '/billing/quantity',
  'billing.payment-method': '/billing/payment-method',
  'billing.usage-summary': '/billing/usage-summary',
  'billing.apply-retention-offer': '/billing/apply-retention-offer',
  'billing.retention-offer': '/billing/retention-offer',
  'contact-sales': '/contact-sales',
  pricing: '/pricing',
  welcome: '/',
  features: '/features',
  'free-seo-audit': '/free-seo-audit',
  'free-audit': '/free-audit',
  terms: '/terms',
  privacy: '/privacy',
  dpa: '/dpa',
  comparison: '/vs/:competitor',
  compare: '/compare',
  'use-cases.agencies': '/use-cases/agencies',
  'use-cases.bloggers': '/use-cases/bloggers',
  'use-cases.ecommerce': '/use-cases/ecommerce',
  'use-cases.consultants': '/use-cases/consultants',
  'learn.hub': '/learn/:slug',
  'blog.index': '/blog',
  'blog.feed': '/blog/feed',
  'blog.show': '/blog/:slug',
  'blog.og-image': '/og/blog/:slug.svg',
  'newsletter.subscribe': '/newsletter/subscribe',
  'newsletter.unsubscribe': '/newsletter/unsubscribe/:token',
  press: '/press',
  'case-studies': '/case-studies',
  portfolio: '/portfolio',
  'portfolio.export': '/portfolio/export',
  'portfolio.bulk-analyze': '/portfolio/bulk-analyze',
  'portfolio.bulk-report': '/portfolio/bulk-report',
  'portfolio.generate-report': '/sites/:site/portfolio/report',
  'plugin.download': '/downloads/wp-plugin',
  'onboarding.index': '/sites',
  'onboarding.complete': '/sites/:site/onboarding/complete',
  'onboarding.demo': '/sites/:site/onboarding/demo',
  'onboarding.progress': '/sites/:site/onboarding/progress',
  'sites.demo.clear': '/sites/:site/demo',
  'report-templates.index': '/report-templates',
  'report-templates.show': '/report-templates',
  'report-templates.store': '/report-templates',
  'sites.create': '/sites/create',
  'sites.roi.index': '/sites',
  'pipeline.index': '/sites/:site/pipeline',
  'sites.link-opportunities.index': '/sites/:site/link-opportunities',
  'sites.link-opportunities.update': '/sites/:site/link-opportunities/:opportunity',
  'sites.link-opportunities.build': '/sites/:site/link-opportunities/build',
  'ai-settings.index': '/settings/ai',
  'sites.schedule.edit': '/sites',
  'sites.schedule.update': '/sites',
  'sites.automation.update': '/sites',
  'notification-settings.show': '/sites/:site/notification-settings',
  'notification-settings.update': '/sites/:site/notification-settings',
  'geographic.index': '/sites',
  'geographic.detail': '/sites',
  'device.index': '/sites',
  'device.detail': '/sites',
  'snapshots.index': '/sites',
  'snapshots.rollback': '/sites/:site/snapshots/:snapshot/rollback',
  'snapshots.conflict-check': '/sites/:site/snapshots/:snapshot/conflict-check',
  'timeline.page': '/sites/:site/timeline/page',
  'timeline.query': '/sites/:site/timeline/query',
  // Admin routes
  'admin.dashboard': '/admin',
  'admin.users.index': '/admin/users',
  'admin.users.show': '/admin/users',
  'admin.users.toggle-admin': '/admin/users',
  'admin.users.toggle-active': '/admin/users',
  'admin.users.purge': '/admin/users',
  'admin.users.bulk-deactivate': '/admin/users/bulk-deactivate',
  'admin.users.impersonate': '/admin/users',
  'admin.users.send-email': '/admin/users',
  'admin.users.limits.store': '/admin/users',
  'admin.users.limits.destroy': '/admin/users',
  'admin.users.password-reset': '/admin/users',
  'admin.impersonation.stop': '/admin/impersonate/stop',
  'admin.sites.index': '/admin/sites',
  'admin.sites.show': '/admin/sites',
  'admin.sites.export': '/admin/sites/export',
  'admin.sites.restore': '/admin/sites',
  'admin.sites.update': '/admin/sites',
  'admin.sites.bulk-deactivate': '/admin/sites/bulk-deactivate',
  'admin.users.export': '/admin/users/export',
  'admin.breach-incidents.bulk-update-status': '/admin/breach-incidents/bulk-update-status',
  'admin.batch-jobs.index': '/admin/batch-jobs',
  'admin.gsc-metrics.index': '/admin/gsc-metrics',
  'admin.gsc-metrics.export': '/admin/gsc-metrics/export',
  'admin.gsc-connections.index': '/admin/gsc-connections',
  'admin.gsc-connections.show': '/admin/gsc-connections/:gscConnection',
  'admin.gsc-connections.sync': '/admin/gsc-connections/:gscConnection/sync',
  'admin.wp-connections.index': '/admin/wp-connections',
  'admin.wp-connections.show': '/admin/wp-connections/:wpConnection',
  'admin.findings.index': '/admin/findings',
  'admin.findings.show': '/admin/findings/:finding',
  'admin.cannibalization-runs.index': '/admin/cannibalization-runs',
  'admin.cannibalization-runs.retry': '/admin/cannibalization-runs/:cannibalizationRun/retry',
  'admin.topic-cluster-runs.index': '/admin/topic-cluster-runs',
  'admin.topic-cluster-runs.retry': '/admin/topic-cluster-runs/:topicClusterRun/retry',
  'admin.page-decay-runs.index': '/admin/page-decay-runs',
  'admin.page-decay-runs.retry': '/admin/page-decay-runs/:pageDecayRun/retry',
  'admin.health': '/admin/health',
  'admin.config': '/admin/config',
  'admin.audit-logs.index': '/admin/audit-logs',
  'admin.audit-logs.export': '/admin/audit-logs/export',
  'admin.audit-logs.show': '/admin/audit-logs',
  'admin.system': '/admin/system',
  'admin.system.failed-jobs': '/admin/system/failed-jobs',
  'admin.system.failed-jobs.retry': '/admin/system/failed-jobs/:uuid/retry',
  'admin.system.failed-jobs.delete': '/admin/system/failed-jobs/:uuid',
  'admin.system.flush-cache': '/admin/system/flush-cache',
  'admin.feature-flags.index': '/admin/feature-flags',
  'admin.feature-flags.update-global': '/admin/feature-flags',
  'admin.feature-flags.remove-global': '/admin/feature-flags',
  'admin.feature-flags.users': '/admin/feature-flags',
  'admin.feature-flags.add-user': '/admin/feature-flags',
  'admin.feature-flags.remove-user': '/admin/feature-flags',
  'admin.feature-flags.remove-all-users': '/admin/feature-flags',
  'admin.feature-flags.search-users': '/admin/feature-flags/search-users',
  'admin.billing.dashboard': '/admin/billing',
  'admin.billing.subscriptions': '/admin/billing/subscriptions',
  'admin.billing.show': '/admin/billing/subscriptions',
  'admin.webhooks': '/admin/webhooks',
  'admin.tokens': '/admin/tokens',
  'admin.social-auth': '/admin/social-auth',
  'admin.notifications': '/admin/notifications',
  'admin.notifications.broadcast': '/admin/notifications/broadcast',
  'admin.two-factor': '/admin/two-factor',
  'admin.lifecycle': '/admin/lifecycle',
  // Admin limit policies routes
  'admin.limit-policies.index': '/admin/limit-policies',
  'admin.limit-policies.bulk-destroy': '/admin/limit-policies/bulk',
  'admin.limit-policies.destroy-by-key': '/admin/limit-policies/key',
  'admin.analysis-runs.index': '/admin/analysis-runs',
  'admin.ai-jobs.index': '/admin/ai-jobs',
  'admin.feature-requests.index': '/admin/feature-requests',
  'admin.feature-requests.update-status': '/admin/feature-requests/:featureRequest/status',
  'admin.traffic-alerts.index': '/admin/traffic-alerts',
  'admin.traffic-alerts.export': '/admin/traffic-alerts/export',
  'admin.traffic-alerts.acknowledge': '/admin/traffic-alerts/:trafficAlert/acknowledge',
  'admin.traffic-alerts.dismiss': '/admin/traffic-alerts/:trafficAlert/dismiss',
  'admin.traffic-alerts.bulk-acknowledge': '/admin/traffic-alerts/bulk-acknowledge',
  'admin.wp-posts.export': '/admin/wp-posts/export',
  'admin.wp-posts.index': '/admin/wp-posts',
  'admin.wp-posts.show': '/admin/wp-posts/:wpPost',
  'admin.operations': '/admin/operations',
  'admin.operations.jobs.cancel': '/admin/operations/jobs/:type/:id/cancel',
  'admin.ai-keys.index': '/admin/ai-keys',
  'admin.recommendations.index': '/admin/recommendations',
  'admin.recommendations.export': '/admin/recommendations/export',
  'admin.recommendations.show': '/admin/recommendations/:recommendation',
  'admin.recommendations.bulk-status': '/admin/recommendations/bulk-status',
  'admin.ai-drafts.export': '/admin/ai-drafts/export',
  'admin.ai-drafts.index': '/admin/ai-drafts',
  'admin.ai-drafts.show': '/admin/ai-drafts/:aiDraft',
  'admin.analysis-runs.export': '/admin/analysis-runs/export',
  'admin.analysis-runs.show': '/admin/analysis-runs/:analysisRun',
  'admin.ai-jobs.export': '/admin/ai-jobs/export',
  'admin.ai-jobs.show': '/admin/ai-jobs/:aiJob',
  'admin.batch-jobs.show': '/admin/batch-jobs/:batchJob',
  'admin.webhook-endpoints.export': '/admin/webhook-endpoints/export',
  'admin.data-health': '/admin/data-health',
  'admin.content-briefs.export': '/admin/content-briefs/export',
  'admin.content-briefs.index': '/admin/content-briefs',
  'admin.content-briefs.show': '/admin/content-briefs/:contentBrief',
  'admin.content-snapshots.index': '/admin/content-snapshots',
  'admin.serp-snapshots.index': '/admin/serp-snapshots',
  'admin.serp-snapshots.show': '/admin/serp-snapshots/:serpSnapshot',
  'admin.keyword-opportunities.export': '/admin/keyword-opportunities/export',
  'admin.keyword-opportunities.index': '/admin/keyword-opportunities',
  'admin.keyword-opportunities.show': '/admin/keyword-opportunities/:keywordOpportunity',
  'admin.keyword-opportunity-runs.export': '/admin/keyword-opportunity-runs/export',
  'admin.keyword-opportunity-runs.index': '/admin/keyword-opportunity-runs',
  'admin.topic-clusters.export': '/admin/topic-clusters/export',
  'admin.topic-clusters.index': '/admin/topic-clusters',
  'admin.user-brandings.export': '/admin/user-brandings/export',
  'admin.user-brandings.index': '/admin/user-brandings',
  'admin.ai-templates.index': '/admin/ai-templates',
  'admin.ai-templates.export': '/admin/ai-templates/export',
  'admin.ai-templates.store': '/admin/ai-templates',
  'admin.ai-templates.update': '/admin/ai-templates/:aiTemplate',
  'admin.ai-templates.destroy': '/admin/ai-templates/:aiTemplate',
  'admin.report-templates.index': '/admin/report-templates',
  'admin.report-templates.export': '/admin/report-templates/export',
  'admin.report-templates.store': '/admin/report-templates',
  'admin.report-templates.update': '/admin/report-templates/:reportTemplate',
  'admin.report-templates.destroy': '/admin/report-templates/:reportTemplate',
  'admin.shared-report-links.index': '/admin/shared-report-links',
  'admin.shared-report-links.export': '/admin/shared-report-links/export',
  'admin.shared-report-links.destroy': '/admin/shared-report-links/:sharedReportLink',
  'admin.reports.index': '/admin/reports',
  'admin.seo-calendar.export': '/admin/seo-calendar/export',
  'admin.seo-calendar.index': '/admin/seo-calendar',
  'admin.site-members.destroy': '/admin/site-members/:siteMember',
  'admin.site-members.export': '/admin/site-members/export',
  'admin.site-members.index': '/admin/site-members',
  'admin.search': '/admin/search',
  'admin.impact-reports': '/admin/impact-reports',
  'admin.founder-dashboard': '/admin/founder-dashboard',
  'admin.founder-dashboard.refresh': '/admin/founder-dashboard/refresh',
  'admin.feedback-dashboard': '/admin/feedback-dashboard',
  'admin.feedback-dashboard.mark-reviewed': '/admin/feedback-dashboard/mark-reviewed',
  'admin.freshness-recommendations.index': '/admin/freshness-recommendations',
  'admin.freshness-recommendations.show':
    '/admin/freshness-recommendations/:freshnessRecommendation',
  'admin.freshness-recommendations.export': '/admin/freshness-recommendations/export',
  'admin.recommendation-roi-snapshots.index': '/admin/recommendation-roi-snapshots',
  'admin.recommendation-roi-snapshots.export': '/admin/recommendation-roi-snapshots/export',
  'admin.webhook-deliveries.index': '/admin/webhook-deliveries',
  'admin.webhook-deliveries.show': '/admin/webhook-deliveries/:webhookDelivery',
  'admin.webhook-deliveries.export': '/admin/webhook-deliveries/export',
  'admin.incoming-webhooks.index': '/admin/incoming-webhooks',
  'admin.incoming-webhooks.export': '/admin/incoming-webhooks/export',
  'admin.wp-publish-logs.index': '/admin/wp-publish-logs',
  'admin.wp-publish-logs.export': '/admin/wp-publish-logs/export',
  'admin.opportunity-feedback.index': '/admin/opportunity-feedback',
  'admin.opportunity-feedback.export': '/admin/opportunity-feedback/export',
  'admin.findings.export': '/admin/findings/export',
  'admin.nps-surveys.index': '/admin/nps-surveys',
  'admin.nps-surveys.export': '/admin/nps-surveys/export',
  'admin.subscribers.index': '/admin/subscribers',
  'admin.subscribers.export': '/admin/subscribers/export',
  'admin.subscribers.import': '/admin/subscribers/import',
  'admin.subscribers.destroy': '/admin/subscribers/:subscriber',
  'admin.testimonials.index': '/admin/testimonials',
  'admin.testimonials.export': '/admin/testimonials/export',
  'admin.testimonials.import': '/admin/testimonials/import',
  'admin.testimonials.create': '/admin/testimonials/create',
  'admin.testimonials.store': '/admin/testimonials',
  'admin.testimonials.edit': '/admin/testimonials/:testimonial/edit',
  'admin.testimonials.update': '/admin/testimonials/:testimonial',
  'admin.testimonials.destroy': '/admin/testimonials/:testimonial',
  'admin.testimonials.approve': '/admin/testimonials/:testimonial/approve',
  'admin.testimonials.reject': '/admin/testimonials/:testimonial/reject',
  // Testimonial public submission routes
  'testimonials.submit.show': '/testimonials/submit',
  'testimonials.submit.store': '/testimonials/submit',
  'testimonials.submit.thankyou': '/testimonials/thank-you',
  // AI draft publishing routes
  'ai-drafts.publish': '/sites/:site/ai-drafts/:aiDraft/publish',
  'ai-drafts.conflict-check': '/sites/:site/ai-drafts/:aiDraft/conflict-check',
  'ai-drafts.diff': '/sites/:site/ai-drafts/:aiDraft/diff',
  // Content editor routes
  'content-editor.edit': '/sites/:site/drafts/:aiDraft/edit',
  'content-editor.analyze': '/sites/:site/content/analyze',
  'content-editor.update': '/sites/:site/drafts/:aiDraft/content',
  'content-editor.serp-analyze': '/sites/:site/content/serp-analyze',
  'content-editor.score': '/sites/:site/content/score',
  'content-editor.serp-status': '/sites/:site/content/serp-status/:serpSnapshot',
  'serp-data.show': '/sites/:site/drafts/:aiDraft/serp-data',
  'settings.serp': '/settings/serp',
  'settings.serp.store': '/settings/serp',
  'settings.serp.validate': '/settings/serp/validate',
  'settings.serp.destroy': '/settings/serp',
  // Content briefs routes
  'content-briefs.index': '/sites/:site/content-briefs',
  'content-briefs.show': '/sites/:site/content-briefs/:contentBrief',
  'content-briefs.store': '/sites/:site/content-briefs',
  'content-briefs.update': '/sites/:site/content-briefs/:contentBrief',
  'content-briefs.destroy': '/sites/:site/content-briefs/:contentBrief',
  'content-briefs.export': '/sites/:site/content-briefs/:contentBrief/export',
  'content-briefs.convertToDraft': '/sites/:site/content-briefs/:contentBrief/convert-to-draft',
  // Content inventory route
  'content-inventory.index': '/sites/:site/content-inventory',
  // Batch AI routes
  'batch-ai.estimate': '/sites/:site/batch-ai/estimate',
  'batch-ai.store': '/sites/:site/batch-ai',
  'batch-ai.index': '/sites/:site/batch-ai',
  'batch-ai.show': '/sites/:site/batch-ai/:batchJob',
  // Bulk publish routes
  'bulk-publish.store': '/sites/:site/bulk-publish',
  // Recommendations routes
  'recommendations.index': '/sites/:site/recommendations',
  'recommendations.show': '/sites/:site/recommendations/:recommendation',
  'recommendations.update-status': '/sites/:site/recommendations/:recommendation/status',
  'recommendations.bulk-update-status': '/sites/:site/recommendations/bulk-status',
  'recommendations.bulkUpdateStatus': '/sites/:site/recommendations/bulk-status',
  // GSC connection routes
  'gsc.connect': '/sites/:site/gsc/connect',
  // WP connection routes
  'wp.test': '/sites/:site/wp/test',
  // Analysis routes
  'analyze.index': '/sites/:site/analyze',
  // Export routes
  'export.recommendations': '/export/sites/:site/recommendations',
  'export.users': '/export/users',
  // Branding routes
  'settings.branding': '/settings/branding',
  'settings.branding.update': '/settings/branding',
  'settings.branding.logo.upload': '/settings/branding/logo',
  'settings.branding.logo.delete': '/settings/branding/logo',
  // Calendar routes
  'calendar.index': '/sites/:site/calendar',
  'calendar.store': '/sites/:site/calendar',
  'calendar.update': '/sites/:site/calendar/:calendarEntry',
  'calendar.destroy': '/sites/:site/calendar/:calendarEntry',
  'calendar.export': '/sites/:site/calendar/export',
  // Opportunity map routes
  'opportunity-map.index': '/sites/:site/opportunity-map',
  'opportunity-map.export': '/sites/:site/opportunities/export',
  'topic-clusters.index': '/sites/:site/content-intelligence/topic-clusters',
  'freshness.index': '/sites/:site/content-intelligence/freshness',
  // Traffic alert routes
  'alerts.index': '/sites/:site/alerts',
  'alerts.show': '/sites/:site/alerts/:alert',
  'alerts.acknowledge': '/sites/:site/alerts/:alert/acknowledge',
  'alerts.dismiss': '/sites/:site/alerts/:alert/dismiss',
  // Report routes
  'sites.reports.index': '/sites/:site/reports',
  'sites.reports.create': '/sites/:site/reports/create',
  'sites.reports.store': '/sites/:site/reports',
  'sites.reports.show': '/sites/:site/reports/:report',
  'sites.reports.update': '/sites/:site/reports/:report',
  'sites.reports.destroy': '/sites/:site/reports/:report',
  'sites.reports.export': '/sites/:site/reports/:report/export',
  'sites.reports.share': '/sites/:site/reports/:report/share',
  'sites.reports.download': '/sites/:site/reports/:report/download',
  // Shared report routes
  'shared-reports.show': '/shared-reports/:token',
  'shared-reports.verify-password': '/shared-reports/:token/verify-password',
  'shared-links.destroy': '/shared-links/:sharedLink',
  // Micro-survey routes
  'micro-survey.store': '/micro-survey',
  'micro-survey.check': '/micro-survey/check',
  // Changelog dismiss route
  'user.dismiss-changelog': '/user/dismiss-changelog',
  // AI settings route
  'settings.ai': '/settings/ai',
  // Notification settings route
  'notifications.unsubscribe': '/notifications/unsubscribe',
  'notifications.unsubscribe.type': '/notifications/unsubscribe',
  // DSAR (Data Subject Access Request) routes
  'privacy.dsar.show': '/privacy/data-request',
  'privacy.dsar.store': '/privacy/data-request',
  'admin.dsar.index': '/admin/dsar',
  'admin.dsar.update': '/admin/dsar/:dsarRequest',
  // Breach Incidents routes
  'admin.breach-incidents.index': '/admin/breach-incidents',
  'admin.breach-incidents.store': '/admin/breach-incidents',
  'admin.breach-incidents.show': '/admin/breach-incidents/:breachIncident',
  'admin.breach-incidents.update': '/admin/breach-incidents/:breachIncident',
  // Referral settings routes
  'settings.referral': '/settings/referral',
  // Privacy settings routes
  'privacy-settings.show': '/settings/privacy',
  'privacy-settings.update': '/settings/privacy',
  // Bundled AI consent routes
  'ai-consent.store': '/settings/ai-consent',
  'ai-consent.revoke': '/settings/ai-consent',
  // User data export
  'export.my-data': '/export/my-data',
  // Admin DLQ (Dead Letter Queue) routes
  'admin.dlq.index': '/admin/dlq',
  'admin.dlq.show': '/admin/dlq/:deadLetterJob',
  'admin.dlq.replay': '/admin/dlq/:deadLetterJob/replay',
  'admin.dlq.bulk-replay': '/admin/dlq/bulk-replay',
  'admin.dlq.destroy': '/admin/dlq/:deadLetterJob',
  'admin.dlq.bulk-delete': '/admin/dlq',
  // Team member management routes
  'site-members.index': '/sites/:site/settings/team',
  'site-members.store': '/sites/:site/settings/team',
  'site-members.update': '/sites/:site/settings/team/:member',
  'site-members.destroy': '/sites/:site/settings/team/:member',
  'site-members.accept': '/sites/:site/invitations/:token/accept',
  // NPS survey route
  'nps.store': '/nps',
  'nps.dismiss': '/nps/dismiss',
  // Feedback
  'feedback.store': '/feedback',
  // Feature requests
  'feature-requests.index': '/feature-requests',
  'feature-requests.store': '/feature-requests',
  'feature-requests.vote': '/feature-requests/:featureRequest/vote',
  // Admin feedback resolve
  'admin.feedback.resolve': '/admin/feedback/:feedback/resolve',
  // Admin blog posts
  'admin.blog-posts.export': '/admin/blog-posts/export',
  'admin.blog-posts.bulk-destroy': '/admin/blog-posts/bulk-destroy',
  'admin.blog-posts.bulk-restore': '/admin/blog-posts/bulk-restore',
  'admin.blog-posts.index': '/admin/blog-posts',
  'admin.blog-posts.create': '/admin/blog-posts/create',
  'admin.blog-posts.store': '/admin/blog-posts',
  'admin.blog-posts.edit': '/admin/blog-posts/:post/edit',
  'admin.blog-posts.update': '/admin/blog-posts/:post',
  'admin.blog-posts.destroy': '/admin/blog-posts/:post',
  'admin.blog-posts.restore': '/admin/blog-posts/:id/restore',
  // Admin webhook endpoints
  'admin.webhook-endpoints.index': '/admin/webhook-endpoints',
  'admin.webhook-endpoints.toggle-active':
    '/admin/webhook-endpoints/:webhookEndpoint/toggle-active',
  'admin.webhook-endpoints.destroy': '/admin/webhook-endpoints/:webhookEndpoint',
  'admin.webhook-endpoints.restore': '/admin/webhook-endpoints/:id/restore',
  // Admin changelog entries
  'admin.changelog-entries.export': '/admin/changelog-entries/export',
  'admin.changelog-entries.bulk-destroy': '/admin/changelog-entries/bulk-destroy',
  'admin.changelog-entries.bulk-restore': '/admin/changelog-entries/bulk-restore',
  'admin.changelog-entries.index': '/admin/changelog-entries',
  'admin.changelog-entries.create': '/admin/changelog-entries/create',
  'admin.changelog-entries.store': '/admin/changelog-entries',
  'admin.changelog-entries.edit': '/admin/changelog-entries/:changelogEntry/edit',
  'admin.changelog-entries.update': '/admin/changelog-entries/:changelogEntry',
  'admin.changelog-entries.destroy': '/admin/changelog-entries/:changelogEntry',
  'admin.changelog-entries.restore': '/admin/changelog-entries/:id/restore',
  'admin.changelog-entries.link-feedback': '/admin/changelog-entries/:changelogEntry/link-feedback',
  // Admin bulk operations and retries
  'admin.analysis-runs.bulk-cancel': '/admin/analysis-runs/bulk-cancel',
  'admin.analysis-runs.retry': '/admin/analysis-runs/:analysisRun/retry',
  'admin.ai-jobs.bulk-cancel': '/admin/ai-jobs/bulk-cancel',
  'admin.feature-requests.bulk-update-status': '/admin/feature-requests/bulk-update-status',
  'admin.dsar.export': '/admin/dsar/export',
  'admin.dsar.bulk-update-status': '/admin/dsar/bulk-update-status',
  'admin.breach-incidents.export': '/admin/breach-incidents/export',
  'admin.billing.subscriptions.export': '/admin/billing/subscriptions/export',
  'admin.impact-reports.export': '/admin/impact-reports/export',
  // Admin cache management
  'admin.cache.index': '/admin/cache',
  'admin.cache.flush': '/admin/cache/flush',
  'admin.cache.flush-all': '/admin/cache/flush-all',
  // Admin scheduled tasks
  'admin.scheduled-tasks.index': '/admin/scheduled-tasks',
  // Admin sessions
  'admin.sessions.index': '/admin/sessions',
  'admin.sessions.destroy': '/admin/sessions/:sessionId',
  // Changelog
  'changelog.index': '/changelog',
  // Roadmap
  roadmap: '/roadmap',
  'roadmap.vote': '/roadmap/:featureRequest/vote',
  // Design system showcase (local only)
  'design-system.showcase': '/design-system',
};

const routeFn = (name: string, params?: Record<string, unknown> | string | number): string => {
  const baseRoute = mockRoutes[name] || `/${name.replace(/\./g, '/')}`;

  if (typeof params === 'string' || typeof params === 'number') {
    // Handle blog.show route
    if (name === 'blog.show') {
      return `/blog/${params}`;
    }
    // Handle specific schedule routes
    if (name === 'sites.schedule.edit') {
      return `${baseRoute}/${params}/schedule/edit`;
    }
    if (name === 'sites.schedule.update') {
      return `${baseRoute}/${params}/schedule`;
    }
    if (name === 'sites.automation.update') {
      return `${baseRoute}/${params}/automation`;
    }
    // Handle geographic dashboard route
    if (name === 'geographic.index') {
      return `${baseRoute}/${params}/geographic`;
    }
    // Handle device dashboard route
    if (name === 'device.index') {
      return `${baseRoute}/${params}/device`;
    }
    // Handle snapshots route (with site ID only - for backward compatibility)
    if (name === 'snapshots.index') {
      return `${baseRoute}/${params}/snapshots`;
    }
    // Handle calendar index route
    if (name === 'calendar.index') {
      return `/sites/${params}/calendar`;
    }
    // Handle calendar export route
    if (name === 'calendar.export') {
      return `/sites/${params}/calendar/export`;
    }
    // Handle recommendations index route
    if (name === 'recommendations.index') {
      return `/sites/${params}/recommendations`;
    }
    if (
      name === 'recommendations.bulk-update-status' ||
      name === 'recommendations.bulkUpdateStatus'
    ) {
      return `/sites/${params}/recommendations/bulk-status`;
    }
    // Handle GSC connect route
    if (name === 'gsc.connect') {
      const siteId =
        typeof params === 'object' && params !== null
          ? (params as Record<string, unknown>).site
          : params;
      return `/sites/${siteId}/gsc/connect`;
    }
    // Handle analysis index route
    if (name === 'analyze.index') {
      const siteId =
        typeof params === 'object' && params !== null
          ? (params as Record<string, unknown>).site
          : params;
      return `/sites/${siteId}/analyze`;
    }
    // Handle onboarding index route
    if (name === 'onboarding.index') {
      return `/sites/${params}/onboarding`;
    }
    // Handle sites.roi.index route
    if (name === 'sites.roi.index') {
      return `/sites/${params}/roi`;
    }
    // Handle pipeline.index route
    if (name === 'pipeline.index') {
      return `/sites/${params}/pipeline`;
    }
    // Handle batch-ai routes
    if (name === 'batch-ai.estimate' || name === 'batch-ai.store' || name === 'batch-ai.index') {
      return `/sites/${params}/batch-ai${name === 'batch-ai.estimate' ? '/estimate' : ''}`;
    }
    if (name === 'bulk-publish.store') {
      return `/sites/${params}/bulk-publish`;
    }
    if (
      name === 'recommendations.bulk-update-status' ||
      name === 'recommendations.bulkUpdateStatus'
    ) {
      return `/sites/${params}/recommendations/bulk-status`;
    }
    return `${baseRoute}/${params}`;
  }

  // Handle snapshots.index with [siteId, wpPostId]
  if (Array.isArray(params) && params.length === 2 && name === 'snapshots.index') {
    return `/sites/${params[0]}/snapshots/${params[1]}`;
  }

  // Handle alerts routes with [siteId, alertId]
  if (
    Array.isArray(params) &&
    params.length === 2 &&
    (name === 'alerts.show' || name === 'alerts.acknowledge' || name === 'alerts.dismiss')
  ) {
    const action = name === 'alerts.show' ? '' : `/${name.split('.')[1]}`;
    return `/sites/${params[0]}/alerts/${params[1]}${action}`;
  }

  if (params && typeof params === 'object') {
    // Handle comparison route with competitor param
    if (name === 'comparison' && 'competitor' in params) {
      return `/vs/${params.competitor}`;
    }
    // Handle geographic detail route
    if (name === 'geographic.detail' && 'site' in params && 'country' in params) {
      return `${baseRoute}/${params.site}/geographic/${params.country}`;
    }
    // Handle device detail route
    if (name === 'device.detail' && 'site' in params && 'device' in params) {
      return `${baseRoute}/${params.site}/device/${params.device}`;
    }
    // Handle calendar routes
    if (name === 'calendar.index' && 'site' in params) {
      return `/sites/${params.site}/calendar`;
    }
    if (name === 'calendar.store' && 'site' in params) {
      return `/sites/${params.site}/calendar`;
    }
    if (name === 'calendar.update' && 'site' in params && 'calendarEntry' in params) {
      return `/sites/${params.site}/calendar/${params.calendarEntry}`;
    }
    if (name === 'calendar.destroy' && 'site' in params && 'calendarEntry' in params) {
      return `/sites/${params.site}/calendar/${params.calendarEntry}`;
    }
    if (name === 'calendar.export' && 'site' in params) {
      return `/sites/${params.site}/calendar/export`;
    }
  }

  if (params && name === 'social.redirect' && params.provider) {
    return `/auth/${params.provider}/redirect`;
  }
  if (params && name === 'social.disconnect' && params.provider) {
    return `/auth/${params.provider}/disconnect`;
  }

  // Handle routes with array parameters (e.g., [siteId, draftId])
  if (Array.isArray(params) && params.length === 2) {
    if (
      name === 'ai-drafts.publish' ||
      name === 'ai-drafts.conflict-check' ||
      name === 'ai-drafts.diff' ||
      name === 'ai-drafts.rate'
    ) {
      return `/sites/${params[0]}/ai-drafts/${params[1]}/${name.split('.')[1].replace('-check', '')}`;
    }
    if (name === 'snapshots.rollback') {
      return `/sites/${params[0]}/snapshots/${params[1]}/rollback`;
    }
    if (name === 'snapshots.conflict-check') {
      return `/sites/${params[0]}/snapshots/${params[1]}/conflict-check`;
    }
    if (name === 'content-editor.edit') {
      return `/sites/${params[0]}/drafts/${params[1]}/edit`;
    }
    if (name === 'batch-ai.show') {
      return `/sites/${params[0]}/batch-ai/${params[1]}`;
    }
  }

  // Handle content-briefs routes with object parameters
  if (params && typeof params === 'object' && !Array.isArray(params)) {
    if ((name === 'content-briefs.index' || name === 'content-briefs.store') && 'site' in params) {
      return `/sites/${params.site}/content-briefs`;
    }
    if (name === 'content-briefs.show' && 'site' in params && 'contentBrief' in params) {
      return `/sites/${params.site}/content-briefs/${params.contentBrief}`;
    }
    if (
      (name === 'content-briefs.update' || name === 'content-briefs.destroy') &&
      'site' in params &&
      'contentBrief' in params
    ) {
      return `/sites/${params.site}/content-briefs/${params.contentBrief}`;
    }
    if (name === 'content-briefs.export' && 'site' in params && 'contentBrief' in params) {
      return `/sites/${params.site}/content-briefs/${params.contentBrief}/export`;
    }
    if (name === 'content-briefs.convertToDraft' && 'site' in params && 'contentBrief' in params) {
      return `/sites/${params.site}/content-briefs/${params.contentBrief}/convert-to-draft`;
    }

    // Handle reports routes with object parameters
    if ((name === 'sites.reports.index' || name === 'sites.reports.store') && 'site' in params) {
      return `/sites/${params.site}/reports`;
    }
    if (name === 'sites.reports.create' && 'site' in params) {
      return `/sites/${params.site}/reports/create`;
    }
    if (name === 'sites.reports.show' && 'site' in params && 'report' in params) {
      return `/sites/${params.site}/reports/${params.report}`;
    }
    if (
      (name === 'sites.reports.update' || name === 'sites.reports.destroy') &&
      'site' in params &&
      'report' in params
    ) {
      return `/sites/${params.site}/reports/${params.report}`;
    }
    if (name === 'sites.reports.export' && 'site' in params && 'report' in params) {
      return `/sites/${params.site}/reports/${params.report}/export`;
    }
    if (name === 'sites.reports.share' && 'site' in params && 'report' in params) {
      return `/sites/${params.site}/reports/${params.report}/share`;
    }
    if (name === 'sites.reports.download' && 'site' in params && 'report' in params) {
      return `/sites/${params.site}/reports/${params.report}/download`;
    }

    // Handle alerts routes with object parameters
    if (name === 'alerts.show' && 'site' in params && 'alert' in params) {
      return `/sites/${params.site}/alerts/${params.alert}`;
    }
    if (
      (name === 'alerts.acknowledge' || name === 'alerts.dismiss') &&
      'site' in params &&
      'alert' in params
    ) {
      return `/sites/${params.site}/alerts/${params.alert}/${name === 'alerts.acknowledge' ? 'acknowledge' : 'dismiss'}`;
    }
  }

  // Handle batch-ai routes with single site parameter
  if (typeof params === 'number' || typeof params === 'string') {
    if (name === 'batch-ai.estimate' || name === 'batch-ai.store' || name === 'batch-ai.index') {
      return `/sites/${params}/batch-ai${name === 'batch-ai.estimate' ? '/estimate' : ''}`;
    }
    // Handle bulk publish routes
    if (name === 'bulk-publish.store') {
      return `/sites/${params}/bulk-publish`;
    }
    // Handle recommendations routes
    if (name === 'recommendations.index') {
      return `/sites/${params}/recommendations`;
    }
    // Handle reports routes
    if (name === 'sites.reports.index' || name === 'sites.reports.store') {
      return `/sites/${params}/reports`;
    }
    if (name === 'sites.reports.create') {
      return `/sites/${params}/reports/create`;
    }
    // Handle analysis routes
    if (name === 'analyze.index') {
      const siteId =
        typeof params === 'object' && params !== null
          ? (params as Record<string, unknown>).site
          : params;
      return `/sites/${siteId}/analyze`;
    }
  }

  // Handle admin routes with parameters
  if (params && typeof params === 'object') {
    // User parameter routes
    if (
      (name === 'admin.users.show' ||
        name === 'admin.users.toggle-admin' ||
        name === 'admin.users.toggle-active' ||
        name === 'admin.users.impersonate') &&
      'user' in params
    ) {
      return `${baseRoute}/${params.user}`;
    }

    // Feature flag routes with flag parameter
    if (
      (name === 'admin.feature-flags.update-global' ||
        name === 'admin.feature-flags.remove-global' ||
        name === 'admin.feature-flags.users' ||
        name === 'admin.feature-flags.add-user' ||
        name === 'admin.feature-flags.remove-all-users') &&
      'flag' in params
    ) {
      return `${baseRoute}/${params.flag}`;
    }

    // Feature flag route with both flag and user
    if (name === 'admin.feature-flags.remove-user' && 'flag' in params && 'user' in params) {
      return `${baseRoute}/${params.flag}/users/${params.user}`;
    }

    // Recommendation show route
    if (name === 'recommendations.show' && 'site' in params && 'recommendation' in params) {
      return `/sites/${params.site}/recommendations/${params.recommendation}`;
    }

    // Audit log show route
    if (name === 'admin.audit-logs.show' && 'auditLog' in params) {
      return `${baseRoute}/${params.auditLog}`;
    }

    // Billing subscription show route
    if (name === 'admin.billing.show' && 'subscription' in params) {
      return `${baseRoute}/${params.subscription}`;
    }

    // GSC connect route with object params
    if (name === 'gsc.connect' && 'site' in params) {
      return `/sites/${params.site}/gsc/connect`;
    }

    // Opportunity map export route
    if (name === 'opportunity-map.export' && 'site' in params) {
      const queryParams = new URLSearchParams();
      if ('type' in params && params.type) queryParams.set('type', String(params.type));
      if ('sort' in params && params.sort) queryParams.set('sort', String(params.sort));
      if ('min_confidence' in params && params.min_confidence)
        queryParams.set('min_confidence', String(params.min_confidence));
      if ('min_impact' in params && params.min_impact)
        queryParams.set('min_impact', String(params.min_impact));

      const queryString = queryParams.toString();
      return `/sites/${params.site}/opportunities/export${queryString ? `?${queryString}` : ''}`;
    }
  }

  return baseRoute;
};

// Make route globally available
(globalThis as unknown as { route: typeof routeFn }).route = routeFn;

// Mock window.location
Object.defineProperty(window, 'location', {
  value: {
    href: 'http://localhost',
    pathname: '/',
    search: '',
    hash: '',
    origin: 'http://localhost',
    assign: vi.fn(),
    replace: vi.fn(),
    reload: vi.fn(),
  },
  writable: true,
});

// Mock matchMedia
Object.defineProperty(window, 'matchMedia', {
  writable: true,
  value: vi.fn().mockImplementation((query: string) => ({
    matches: false,
    media: query,
    onchange: null,
    addListener: vi.fn(),
    removeListener: vi.fn(),
    addEventListener: vi.fn(),
    removeEventListener: vi.fn(),
    dispatchEvent: vi.fn(),
  })),
});

// Mock ResizeObserver
globalThis.ResizeObserver = class ResizeObserver {
  observe = vi.fn();
  unobserve = vi.fn();
  disconnect = vi.fn();
} as unknown as typeof globalThis.ResizeObserver;

// Mock IntersectionObserver
globalThis.IntersectionObserver = class IntersectionObserver {
  observe = vi.fn();
  unobserve = vi.fn();
  disconnect = vi.fn();
} as unknown as typeof globalThis.IntersectionObserver;

// Mock pointer capture APIs (used by Radix UI)
Element.prototype.hasPointerCapture = vi.fn(() => false);
Element.prototype.setPointerCapture = vi.fn();
Element.prototype.releasePointerCapture = vi.fn();

// Mock scrollIntoView (used by Radix UI)
Element.prototype.scrollIntoView = vi.fn();
