import { Activity, TrendingDown, TrendingUp, Users, Zap } from 'lucide-react';


import { Head, Link } from '@inertiajs/react';

import { AdminStatsGrid, type StatCard } from '@/Components/admin/AdminStatsGrid';
import { ChartErrorBoundary } from '@/Components/admin/ChartErrorBoundary';
import PageHeader from '@/Components/layout/PageHeader';
import { Badge } from '@/Components/ui/badge';
import {
  Breadcrumb,
  BreadcrumbItem,
  BreadcrumbLink,
  BreadcrumbList,
  BreadcrumbPage,
  BreadcrumbSeparator,
} from '@/Components/ui/breadcrumb';
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/Components/ui/card';
import {
  Table,
  TableBody,
  TableCell,
  TableHead,
  TableHeader,
  TableRow,
} from '@/Components/ui/table';
import AdminLayout from '@/Layouts/AdminLayout';
import { formatNumber } from '@/lib/format';

interface ActivationStats {
  total_users: number;
  activated_count: number;
  activation_rate: number;
  deep_activated_count: number;
  deep_activation_rate: number;
  avg_days_to_activation: number | null;
}

interface OnboardingFunnelStep {
  step: string;
  label: string;
  count: number;
  rate: number;
}

interface RetentionStats {
  week_1_retention: number;
  week_4_retention: number;
  month_3_retention: number;
  avg_analysis_streak: number;
  users_with_streak_4plus: number;
}

interface ChurnTier {
  tier: string;
  count: number;
  percentage: number;
}

interface WeeklyAnalysis {
  week: string;
  count: number;
}

interface Props {
  activation_stats: ActivationStats;
  onboarding_funnel: OnboardingFunnelStep[];
  retention_stats: RetentionStats;
  churn_tiers: ChurnTier[];
  weekly_analyses: WeeklyAnalysis[];
  retention_thresholds: { good: number; warning: number };
}

function tierBadgeVariant(tier: string): 'destructive' | 'secondary' | 'outline' | 'default' {
  switch (tier) {
    case 'critical':
      return 'destructive';
    case 'at_risk':
      return 'destructive';
    case 'warning':
      return 'secondary';
    case 'healthy':
      return 'default';
    default:
      return 'outline';
  }
}

export default function LifecycleAnalytics({
  activation_stats,
  onboarding_funnel,
  retention_stats,
  churn_tiers,
  weekly_analyses,
  retention_thresholds,
}: Props) {
  return (
    <AdminLayout>
      <Head title="Lifecycle Analytics" />

      <div className="container py-6 space-y-6">
        <Breadcrumb>
          <BreadcrumbList>
            <BreadcrumbItem>
              <BreadcrumbLink asChild>
                <Link href="/admin">Admin</Link>
              </BreadcrumbLink>
            </BreadcrumbItem>
            <BreadcrumbSeparator />
            <BreadcrumbItem>
              <BreadcrumbPage>Lifecycle Analytics</BreadcrumbPage>
            </BreadcrumbItem>
          </BreadcrumbList>
        </Breadcrumb>

        <PageHeader
          title="Lifecycle Analytics"
          description="Activation, retention, and churn metrics across the user lifecycle."
        />

        {/* Activation Stats */}
        <AdminStatsGrid
          stats={
            [
              { title: 'Total Users', value: activation_stats.total_users, icon: Users },
              {
                title: 'Activated',
                value: activation_stats.activated_count,
                icon: Zap,
                description: `${activation_stats.activation_rate.toFixed(1)}%`,
              },
              {
                title: 'Deep Activated',
                value: activation_stats.deep_activated_count,
                icon: TrendingUp,
                description: `${activation_stats.deep_activation_rate.toFixed(1)}%`,
              },
              {
                title: 'Avg Days to Activate',
                value: activation_stats.avg_days_to_activation ?? 0,
                icon: Activity,
                format: (n: number) => (n === 0 ? '—' : n.toFixed(1)),
              },
              {
                title: 'Avg Streak',
                value: retention_stats.avg_analysis_streak ?? 0,
                icon: Activity,
                format: (n: number) => n.toFixed(1),
                description: `${retention_stats.users_with_streak_4plus} at 4+ weeks`,
              },
            ] satisfies StatCard[]
          }
          columns="grid-cols-2 md:grid-cols-3 lg:grid-cols-5"
        />

        {/* Onboarding Funnel + Retention Side by Side */}
        <div className="grid grid-cols-1 gap-6 lg:grid-cols-2">
          {/* Onboarding Funnel */}
          <Card>
            <CardHeader>
              <CardTitle>Onboarding Funnel</CardTitle>
              <CardDescription>Step-by-step completion rates for new users</CardDescription>
            </CardHeader>
            <CardContent>
              <ChartErrorBoundary label="Onboarding Funnel unavailable">
                <Table>
                  <TableHeader>
                    <TableRow>
                      <TableHead>Step</TableHead>
                      <TableHead className="text-right">Users</TableHead>
                      <TableHead className="text-right">Rate</TableHead>
                    </TableRow>
                  </TableHeader>
                  <TableBody>
                    {onboarding_funnel.map((step) => (
                      <TableRow key={step.step}>
                        <TableCell className="font-medium">{step.label}</TableCell>
                        <TableCell className="text-right">{formatNumber(step.count)}</TableCell>
                        <TableCell className="text-right">
                          <span
                            className={
                              step.rate >= retention_thresholds.good
                                ? 'text-success'
                                : step.rate >= retention_thresholds.warning
                                  ? 'text-warning'
                                  : 'text-destructive'
                            }
                          >
                            {step.rate.toFixed(1)}%
                          </span>
                        </TableCell>
                      </TableRow>
                    ))}
                  </TableBody>
                </Table>
              </ChartErrorBoundary>
            </CardContent>
          </Card>

          {/* Retention + Churn */}
          <div className="space-y-6">
            <Card>
              <CardHeader>
                <CardTitle>Retention</CardTitle>
                <CardDescription>User retention at key time intervals</CardDescription>
              </CardHeader>
              <CardContent>
                <ChartErrorBoundary label="Retention data unavailable">
                  <div className="grid grid-cols-3 gap-4">
                    <div className="text-center">
                      <p className="text-muted-foreground text-sm">Week 1</p>
                      <p className="text-xl font-bold">
                        {retention_stats.week_1_retention.toFixed(1)}%
                      </p>
                    </div>
                    <div className="text-center">
                      <p className="text-muted-foreground text-sm">Week 4</p>
                      <p className="text-xl font-bold">
                        {retention_stats.week_4_retention.toFixed(1)}%
                      </p>
                    </div>
                    <div className="text-center">
                      <p className="text-muted-foreground text-sm">Month 3</p>
                      <p className="text-xl font-bold">
                        {retention_stats.month_3_retention.toFixed(1)}%
                      </p>
                    </div>
                  </div>
                </ChartErrorBoundary>
              </CardContent>
            </Card>

            <Card>
              <CardHeader>
                <CardTitle className="flex items-center gap-2">
                  <TrendingDown className="h-4 w-4 text-destructive" /> Churn Risk Tiers
                </CardTitle>
                <CardDescription>Distribution of users by churn risk score</CardDescription>
              </CardHeader>
              <CardContent>
                <ChartErrorBoundary label="Churn Risk Tiers unavailable">
                  <Table>
                    <TableHeader>
                      <TableRow>
                        <TableHead>Tier</TableHead>
                        <TableHead className="text-right">Users</TableHead>
                        <TableHead className="text-right">%</TableHead>
                      </TableRow>
                    </TableHeader>
                    <TableBody>
                      {churn_tiers.map((tier) => (
                        <TableRow key={tier.tier}>
                          <TableCell>
                            <Badge variant={tierBadgeVariant(tier.tier)}>
                              {tier.tier.replace('_', ' ')}
                            </Badge>
                          </TableCell>
                          <TableCell className="text-right">
                            {formatNumber(tier.count)}
                          </TableCell>
                          <TableCell className="text-right">
                            {tier.percentage.toFixed(1)}%
                          </TableCell>
                        </TableRow>
                      ))}
                    </TableBody>
                  </Table>
                </ChartErrorBoundary>
              </CardContent>
            </Card>
          </div>
        </div>

        {/* Weekly Analysis Activity */}
        <Card>
          <CardHeader>
            <CardTitle>Weekly Analysis Activity</CardTitle>
            <CardDescription>Number of completed analyses per week (last 12 weeks)</CardDescription>
          </CardHeader>
          <CardContent>
            {weekly_analyses.length === 0 ? (
              <p className="text-muted-foreground text-sm">No analysis data available.</p>
            ) : (
              <ChartErrorBoundary label="Weekly Analysis data unavailable">
                <Table>
                  <TableHeader>
                    <TableRow>
                      <TableHead>Week</TableHead>
                      <TableHead className="text-right">Completed Analyses</TableHead>
                    </TableRow>
                  </TableHeader>
                  <TableBody>
                    {weekly_analyses.map((row) => (
                      <TableRow key={row.week}>
                        <TableCell>{row.week}</TableCell>
                        <TableCell className="text-right">{formatNumber(row.count)}</TableCell>
                      </TableRow>
                    ))}
                  </TableBody>
                </Table>
              </ChartErrorBoundary>
            )}
          </CardContent>
        </Card>
      </div>
    </AdminLayout>
  );
}
