import { NextResponse } from "next/server";
import { db } from "@/db";
import { verifySession } from "@/lib/auth";
import {
  appointments,
  patients,
  inboxMessages,
  alerts,
} from "@/db/schema";
import { eq, and, sql } from "drizzle-orm";

export async function GET() {
  const session = await verifySession();
  if (!session) {
    return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
  }

  const providerId = session.providerId;

  // Get today's appointments with patient data
  const todayAppointments = await db
    .select({
      id: appointments.id,
      scheduledAt: appointments.scheduledAt,
      duration: appointments.duration,
      visitType: appointments.visitType,
      chiefComplaint: appointments.chiefComplaint,
      status: appointments.status,
      noShowRisk: appointments.noShowRisk,
      isTelehealth: appointments.isTelehealth,
      patientId: patients.id,
      patientFirstName: patients.firstName,
      patientLastName: patients.lastName,
      patientMrn: patients.mrn,
      patientDob: patients.dateOfBirth,
      patientGender: patients.gender,
      patientAppStatus: patients.appStatus,
    })
    .from(appointments)
    .innerJoin(patients, eq(appointments.patientId, patients.id))
    .where(eq(appointments.providerId, providerId))
    .orderBy(appointments.scheduledAt);

  // Get inbox messages
  const inbox = await db
    .select()
    .from(inboxMessages)
    .where(
      and(
        eq(inboxMessages.providerId, providerId),
        eq(inboxMessages.isResolved, false)
      )
    )
    .orderBy(inboxMessages.createdAt);

  // Get alerts
  const providerAlerts = await db
    .select({
      id: alerts.id,
      category: alerts.category,
      title: alerts.title,
      description: alerts.description,
      severity: alerts.severity,
      patientId: alerts.patientId,
      patientFirstName: patients.firstName,
      patientLastName: patients.lastName,
      createdAt: alerts.createdAt,
    })
    .from(alerts)
    .leftJoin(patients, eq(alerts.patientId, patients.id))
    .where(
      and(
        eq(alerts.providerId, providerId),
        eq(alerts.isResolved, false)
      )
    )
    .orderBy(alerts.createdAt);

  // Panel stats
  const totalPatients = await db
    .select({ count: sql<number>`count(*)` })
    .from(patients)
    .where(eq(patients.pcpId, providerId));

  return NextResponse.json({
    appointments: todayAppointments,
    inbox,
    alerts: providerAlerts,
    panelStats: {
      totalPatients: Number(totalPatients[0]?.count ?? 0),
      careGaps: 12,
      controlledChronic: 68,
      appEngaged: 74,
      rpmActive: 45,
    },
  });
}
