import { CheckCircle2, ExternalLink, X } from 'lucide-react';

import { useEffect, useState } from 'react';

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


import SiteNav from '@/Components/Navigation/SiteNav';
import { Badge } from '@/Components/ui/badge';
import {
  Breadcrumb,
  BreadcrumbItem,
  BreadcrumbLink,
  BreadcrumbList,
  BreadcrumbPage,
  BreadcrumbSeparator,
} from '@/Components/ui/breadcrumb';
import { Button } from '@/Components/ui/button';
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/Components/ui/card';
import DashboardLayout from '@/Layouts/DashboardLayout';
import { trackProductEvent } from '@/lib/analytics';
import {
  TRAFFIC_ALERT_ACKNOWLEDGED,
  TRAFFIC_ALERT_DETAIL_VIEWED,
  TRAFFIC_ALERT_DISMISSED,
} from '@/lib/event-catalog';
import { formatDateOnly, formatDateTime, formatNumber } from '@/lib/format';
import { ALERT_STATUS_LABELS as STATUS_LABELS } from '@/lib/status';
import { cn } from '@/lib/utils';
import type { TrafficAlert, SiteBasic } from '@/types';

interface TrafficAlertShowPageProps {
  site: SiteBasic;
  alert: TrafficAlert;
}

const SEVERITY_LABELS: Record<string, string> = {
  critical: 'Critical',
  warning: 'Warning',
  info: 'Info',
};

const SEVERITY_DESCRIPTIONS: Record<string, string> = {
  critical:
    'Traffic dropped significantly and requires immediate attention. Check for technical issues, algorithmic updates, or recent content changes.',
  warning:
    'A notable trend was detected. Monitor closely over the next 7 days before taking action.',
  info: 'An unusual pattern was detected but is within normal variance. No action needed unless the trend continues.',
};

const ANOMALY_TYPE_LABELS: Record<string, string> = {
  sudden_drop: 'Sudden Drop',
  sustained_decline: 'Sustained Decline',
  unusual_spike: 'Unusual Spike',
};


function getSeverityBadgeVariant(severity: string): 'default' | 'destructive' | 'secondary' {
  switch (severity) {
    case 'critical':
      return 'destructive';
    case 'warning':
      return 'default';
    case 'info':
      return 'secondary';
    default:
      return 'default';
  }
}

function formatDelta(delta: number): string {
  const sign = delta > 0 ? '+' : '';
  return `${sign}${delta.toFixed(1)}%`;
}


export default function TrafficAlertShow({ site, alert }: TrafficAlertShowPageProps) {
  const [isAcknowledging, setIsAcknowledging] = useState(false);
  const [isDismissing, setIsDismissing] = useState(false);

  useEffect(() => {
    trackProductEvent(TRAFFIC_ALERT_DETAIL_VIEWED, {
      site_id: String(site.id),
      severity: alert.severity,
      anomaly_type: alert.anomaly_type,
    });
  }, [site.id, alert.id, alert.severity, alert.anomaly_type]);

  const handleAcknowledge = () => {
    if (isAcknowledging) return;

    trackProductEvent(TRAFFIC_ALERT_ACKNOWLEDGED, {
      site_id: String(site.id),
      alert_id: String(alert.id),
      severity: alert.severity,
    });

    setIsAcknowledging(true);

    router.post(
      route('alerts.acknowledge', [site.id, alert.id]),
      {},
      {
        preserveState: false,
        preserveScroll: true,
        onFinish: () => setIsAcknowledging(false),
      },
    );
  };

  const handleDismiss = () => {
    if (isDismissing) return;

    trackProductEvent(TRAFFIC_ALERT_DISMISSED, {
      site_id: String(site.id),
      alert_id: String(alert.id),
      severity: alert.severity,
    });

    setIsDismissing(true);

    router.post(
      route('alerts.dismiss', [site.id, alert.id]),
      {},
      {
        preserveState: false,
        preserveScroll: true,
        onFinish: () => setIsDismissing(false),
      },
    );
  };

  const canAcknowledge = alert.status === 'unacknowledged' || alert.status === 'dismissed';
  const canDismiss = alert.status === 'unacknowledged' || alert.status === 'acknowledged';

  return (
    <>
      <Head title={`${site.name} - Traffic Alert`} />

      <div className="container py-6">
        <SiteNav
          siteId={site.id}
          canAnalyze
          canRecommend
          canCannibalization
          canOpportunityMap
          canGeographic
          canDevice
        />

        <nav className="mb-4">
          <Breadcrumb>
            <BreadcrumbList>
              <BreadcrumbItem>
                <BreadcrumbLink asChild>
                  <Link href={route('alerts.index', site.id)}>Traffic Alerts</Link>
                </BreadcrumbLink>
              </BreadcrumbItem>
              <BreadcrumbSeparator />
              <BreadcrumbItem>
                <BreadcrumbPage className="capitalize">
                  {alert.anomaly_type.replace(/_/g, ' ')}
                </BreadcrumbPage>
              </BreadcrumbItem>
            </BreadcrumbList>
          </Breadcrumb>
        </nav>

        <div className="flex items-center gap-3 mb-6">
          <Button variant="outline" size="sm" asChild>
            <Link href={route('alerts.index', site.id)}>&larr; Back to Traffic Alerts</Link>
          </Button>
        </div>

        <div className="flex items-center gap-3 mb-1">
          <h1 className="text-2xl font-bold tracking-tight">Traffic Alert</h1>
          <Badge variant={getSeverityBadgeVariant(alert.severity)}>
            {SEVERITY_LABELS[alert.severity]}
          </Badge>
          <Badge variant="outline">{ANOMALY_TYPE_LABELS[alert.anomaly_type]}</Badge>
          <Badge variant={alert.status === 'unacknowledged' ? 'default' : 'secondary'}>
            {STATUS_LABELS[alert.status]}
          </Badge>
        </div>
        {SEVERITY_DESCRIPTIONS[alert.severity] && (
          <p className="text-sm text-muted-foreground mt-1">
            {SEVERITY_DESCRIPTIONS[alert.severity]}
          </p>
        )}
        <p className="text-sm text-muted-foreground mb-6">
          Detected on {formatDateOnly(alert.created_at, 'Unknown')}
        </p>

        {/* Alert Overview */}
        <Card
          className={cn(
            'mb-6',
            alert.severity === 'critical' && 'border-destructive/20 bg-destructive/5',
            alert.severity === 'warning' && 'border-warning/20 bg-warning/5',
          )}
        >
          <CardHeader>
            <CardTitle>Alert Overview</CardTitle>
            <CardDescription>Traffic anomaly detected for this page</CardDescription>
          </CardHeader>
          <CardContent>
            <div className="space-y-4">
              <div>
                <dt className="text-sm text-muted-foreground mb-1">Page URL</dt>
                <dd>
                  <a
                    href={alert.page_url}
                    target="_blank"
                    rel="noopener noreferrer"
                    className="text-sm font-medium hover:underline break-all inline-flex items-center gap-1"
                  >
                    {alert.page_url}
                    <ExternalLink className="h-3 w-3" />
                  </a>
                </dd>
              </div>

              <div className="grid grid-cols-2 md:grid-cols-4 gap-4">
                <div>
                  <dt className="text-sm text-muted-foreground mb-1">Anomaly Type</dt>
                  <dd className="text-sm font-medium">{ANOMALY_TYPE_LABELS[alert.anomaly_type]}</dd>
                </div>
                <div>
                  <dt className="text-sm text-muted-foreground mb-1">Severity</dt>
                  <dd className="text-sm font-medium">{SEVERITY_LABELS[alert.severity]}</dd>
                </div>
                <div>
                  <dt className="text-sm text-muted-foreground mb-1">Status</dt>
                  <dd className="text-sm font-medium">{STATUS_LABELS[alert.status]}</dd>
                </div>
                <div>
                  <dt className="text-sm text-muted-foreground mb-1">Detected</dt>
                  <dd className="text-sm font-medium">
                    {formatDateOnly(alert.created_at, 'Unknown')}
                  </dd>
                </div>
              </div>
            </div>
          </CardContent>
        </Card>

        {/* Traffic Metrics */}
        <Card className="mb-6">
          <CardHeader>
            <CardTitle>Traffic Metrics</CardTitle>
            <CardDescription>Before and after comparison</CardDescription>
          </CardHeader>
          <CardContent>
            <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4">
              {/* Clicks */}
              <div className="rounded-lg border bg-card p-4">
                <div className="text-sm text-muted-foreground mb-1">Clicks</div>
                <div className="text-2xl font-bold">
                  {formatNumber(alert.metrics.clicks_before)} →{' '}
                  {formatNumber(alert.metrics.clicks_after)}
                </div>
                <div
                  className={cn(
                    'text-sm font-semibold mt-1',
                    alert.metrics.delta_percent < 0 ? 'text-destructive' : 'text-success',
                  )}
                >
                  {formatDelta(alert.metrics.delta_percent)}
                </div>
              </div>

              {/* Impressions */}
              {alert.metrics.impressions_before !== undefined &&
                alert.metrics.impressions_after !== undefined && (
                  <div className="rounded-lg border bg-card p-4">
                    <div className="text-sm text-muted-foreground mb-1">Impressions</div>
                    <div className="text-2xl font-bold">
                      {formatNumber(alert.metrics.impressions_before)} →{' '}
                      {formatNumber(alert.metrics.impressions_after)}
                    </div>
                  </div>
                )}

              {/* CTR */}
              {alert.metrics.ctr_before !== undefined && alert.metrics.ctr_after !== undefined && (
                <div className="rounded-lg border bg-card p-4">
                  <div className="text-sm text-muted-foreground mb-1">CTR</div>
                  <div className="text-2xl font-bold">
                    {alert.metrics.ctr_before.toFixed(2)}% → {alert.metrics.ctr_after.toFixed(2)}%
                  </div>
                </div>
              )}

              {/* Position */}
              {alert.metrics.position_before !== undefined &&
                alert.metrics.position_after !== undefined && (
                  <div className="rounded-lg border bg-card p-4">
                    <div className="text-sm text-muted-foreground mb-1">Position</div>
                    <div className="text-2xl font-bold">
                      {alert.metrics.position_before.toFixed(1)} →{' '}
                      {alert.metrics.position_after.toFixed(1)}
                    </div>
                  </div>
                )}
            </div>
          </CardContent>
        </Card>

        {/* Actions */}
        <div className="flex flex-wrap gap-3">
          {canAcknowledge && (
            <Button onClick={handleAcknowledge} disabled={isAcknowledging} size="lg">
              <CheckCircle2 className="h-4 w-4 mr-2" />
              {isAcknowledging ? 'Acknowledging...' : 'Acknowledge Alert'}
            </Button>
          )}

          {canDismiss && (
            <Button onClick={handleDismiss} disabled={isDismissing} variant="outline" size="lg">
              <X className="h-4 w-4 mr-2" />
              {isDismissing ? 'Dismissing...' : 'Dismiss Alert'}
            </Button>
          )}

          {alert.analysis_run_id && (
            <Button variant="outline" size="lg" asChild>
              <Link href={route('analyze.index', site.id)}>Investigate in Analysis</Link>
            </Button>
          )}
        </div>

        {/* Acknowledgment/Dismissal Info */}
        {(alert.acknowledged_at || alert.dismissed_at) && (
          <Card className="mt-6">
            <CardContent className="pt-6">
              <div className="space-y-2">
                {alert.acknowledged_at && (
                  <div className="text-sm">
                    <span className="text-muted-foreground">Acknowledged: </span>
                    <span className="font-medium">{formatDateTime(alert.acknowledged_at)}</span>
                  </div>
                )}
                {alert.dismissed_at && (
                  <div className="text-sm">
                    <span className="text-muted-foreground">Dismissed: </span>
                    <span className="font-medium">{formatDateTime(alert.dismissed_at)}</span>
                  </div>
                )}
              </div>
            </CardContent>
          </Card>
        )}
      </div>
    </>
  );
}

TrafficAlertShow.layout = (page: React.ReactNode) => <DashboardLayout children={page} />;
