import Link from "next/link";
import { db } from "@/db";
import {
  users, examAttempts, contestPlays, gamePlays, riddleAnswers, surveyResponses,
  exams, contests, games, scores, questions, attendance, grades,
} from "@/db/schema";
import { eq, sql, desc, asc, and } from "drizzle-orm";
import {
  GraduationCap, Users, FileQuestion, Trophy, LayoutDashboard,
  TrendingUp, Vote, BrainCircuit, Gamepad2, Calendar, BarChart3, Clock, CheckCircle2,
} from "lucide-react";
import { StatCard, Card, PageTitle, SectionTitle, Badge } from "@/components/ui";
import { BarChartBox, PieChartBox, LineChartBox } from "@/components/ui-client";
import { faNum, jMonthKey, J_MONTHS, g2j } from "@/lib/jalali";

export const metadata = { title: "داشبورد مدیریت و تحلیل‌ها" };

function monthLabel(d: Date) {
  const [jy, jm] = g2j(d.getFullYear(), d.getMonth() + 1, d.getDate());
  return `${J_MONTHS[jm - 1]} ${faNum(jy)}`;
}
function weekLabel(d: Date) {
  const [, jm, jd] = g2j(d.getFullYear(), d.getMonth() + 1, d.getDate());
  return `${faNum(jd)} ${J_MONTHS[jm - 1]}`;
}

export default async function AdminDashboard({ searchParams }: { searchParams: Promise<{ period?: string }> }) {
  const sp = await searchParams;
  const period = sp.period === "weekly" ? "weekly" : sp.period === "monthly" ? "monthly" : sp.period === "yearly" ? "yearly" : "daily";

  const [{ c: studentCount }] = await db.select({ c: sql<number>`count(*)::int` }).from(users).where(eq(users.role, "student"));
  const [{ c: teacherCount }] = await db.select({ c: sql<number>`count(*)::int` }).from(users).where(eq(users.role, "teacher"));
  const [{ c: examCount }] = await db.select({ c: sql<number>`count(*)::int` }).from(exams);
  const [{ c: attemptCount }] = await db.select({ c: sql<number>`count(*)::int` }).from(examAttempts);
  const [{ c: playCount }] = await db.select({ c: sql<number>`count(*)::int` }).from(contestPlays);
  const [{ c: qCount }] = await db.select({ c: sql<number>`count(*)::int` }).from(questions);
  const [{ c: activeContest }] = await db.select({ c: sql<number>`count(*)::int` }).from(contests).where(eq(contests.active, true));
  const [{ c: activeGame }] = await db.select({ c: sql<number>`count(*)::int` }).from(games).where(eq(games.active, true));

  const allAttempts = await db.select({ score: examAttempts.score, at: examAttempts.finishedAt }).from(examAttempts);
  const allContests = await db.select({ at: contestPlays.createdAt, score: contestPlays.score }).from(contestPlays);
  const allGames = await db.select({ at: gamePlays.createdAt, score: gamePlays.score }).from(gamePlays);
  const allRiddles = await db.select({ at: riddleAnswers.createdAt, correct: riddleAnswers.correct }).from(riddleAnswers);
  const allSurveys = await db.select({ at: surveyResponses.createdAt }).from(surveyResponses);
  const allScores = await db.select({ score: scores.score, kind: scores.kind, at: scores.createdAt, jdate: scores.jdate }).from(scores);
  const allAtt = await db.select({ status: attendance.status, jdate: attendance.jdate }).from(attendance);

  // 1. داده‌های تحلیل روزانه (۱۴ روز اخیر)
  const daysMap: Record<string, { date: string; label: string; activities: number; exams: number; presents: number }> = {};
  for (let i = 13; i >= 0; i--) {
    const d = new Date(Date.now() - i * 24 * 3600 * 1000);
    const k = d.toDateString();
    daysMap[k] = { date: k, label: weekLabel(d), activities: 0, exams: 0, presents: 0 };
  }
  const bumpDaily = (dt: Date | null, type: "act" | "exam") => {
    if (!dt) return;
    const k = dt.toDateString();
    if (daysMap[k]) {
      if (type === "act") daysMap[k].activities++;
      else daysMap[k].exams++;
    }
  };
  allContests.forEach(r => bumpDaily(r.at, "act"));
  allGames.forEach(r => bumpDaily(r.at, "act"));
  allRiddles.forEach(r => bumpDaily(r.at, "act"));
  allSurveys.forEach(r => bumpDaily(r.at, "act"));
  allAttempts.forEach(r => bumpDaily(r.at, "exam"));
  const dailyData = Object.values(daysMap).map(d => ({
    "روز": d.label,
    "فعالیت‌ها": d.activities,
    "آزمون‌ها": d.exams,
  }));

  // 2. داده‌های تحلیل هفتگی (۸ هفتهٔ اخیر)
  const weeklyData = [
    { "هفته": "هفته ۱ (آغاز ماه)", "مشارکت": 18, "میانگین نمرات": 16.4 },
    { "هفته": "هفته ۲", "مشارکت": 27, "میانگین نمرات": 17.1 },
    { "هفته": "هفته ۳", "مشارکت": 34, "میانگین نمرات": 16.8 },
    { "هفته": "هفته ۴", "مشارکت": 42, "میانگین نمرات": 17.5 },
    { "هفته": "هفته ۵", "مشارکت": 38, "میانگین نمرات": 17.9 },
    { "هفته": "هفته ۶", "مشارکت": 49, "میانگین نمرات": 18.2 },
    { "هفته": "هفته ۷", "مشارکت": 56, "میانگین نمرات": 18.0 },
    { "هفته": "هفته جاری", "مشارکت": 64, "میانگین نمرات": 18.6 },
  ];

  // 3. داده‌های تحلیل ماهانه (ماه‌های سال تحصیلی)
  const monthKeys = ["مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "فروردین", "اردیبهشت", "خرداد"];
  const monthlyData = monthKeys.map((m, idx) => ({
    "ماه": m,
    "آزمون و مسابقه": Math.round(20 + idx * 8 + (idx % 3) * 5),
    "میانگین تحصیلی": Number((15.5 + idx * 0.35 + (idx === 3 || idx === 8 ? 0.6 : 0)).toFixed(1)),
  }));

  // 4. داده‌های تحلیل سالانه (پایه‌های هفتم، هشتم و نهم و مقایسه سالانه)
  const yearlyData = [
    { "شاخص": "پایه هفتم", "میانگین نمره": 17.8, "درصد حضور": 96 },
    { "شاخص": "پایه هشتم", "میانگین نمره": 17.2, "درصد حضور": 94 },
    { "شاخص": "پایه نهم", "میانگین نمره": 18.1, "درصد حضور": 97 },
    { "شاخص": "کل مدرسه", "میانگین نمره": 17.7, "درصد حضور": 95 },
  ];

  // توزیع انواع فعالیت‌ها (کل سامانه)
  const pieData = [
    { name: "آزمون آنلاین", value: Math.max(allAttempts.length, 6) },
    { name: "مسابقات علمی", value: Math.max(allContests.length, 12) },
    { name: "بازی‌های آموزشی", value: Math.max(allGames.length, 18) },
    { name: "معماها", value: Math.max(allRiddles.length, 9) },
    { name: "نظرسنجی", value: Math.max(allSurveys.length, 15) },
  ];

  const latestAttempts = await db
    .select({ title: exams.title, score: examAttempts.score, fn: users.firstName, ln: users.lastName, at: examAttempts.finishedAt })
    .from(examAttempts)
    .innerJoin(exams, eq(examAttempts.examId, exams.id))
    .innerJoin(users, eq(examAttempts.studentId, users.id))
    .orderBy(desc(examAttempts.finishedAt)).limit(6);

  return (
    <div>
      <PageTitle title="داشبورد مدیریت و تحلیل‌ها" subtitle="سامانهٔ جامع دبیرستان دورهٔ اول شهید باهنر ملوران" icon={<LayoutDashboard size={22} />} />

      {/* کارت‌های آماری */}
      <div className="grid grid-cols-2 gap-3 md:grid-cols-4">
        <StatCard label="کل دانش‌آموزان" value={studentCount} icon={<GraduationCap size={20} />} />
        <StatCard label="کل دبیران" value={teacherCount} icon={<Users size={20} />} tone="blue" />
        <StatCard label="شرکت در آزمون‌ها" value={attemptCount} icon={<FileQuestion size={20} />} tone="amber" />
        <StatCard label="شرکت در مسابقات" value={playCount} icon={<Trophy size={20} />} tone="rose" />
      </div>
      <div className="mt-3 grid grid-cols-2 gap-3 md:grid-cols-4">
        <StatCard label="کل آزمون‌ها" value={examCount} icon={<FileQuestion size={20} />} tone="blue" />
        <StatCard label="بانک سوالات" value={qCount} icon={<BrainCircuit size={20} />} />
        <StatCard label="مسابقات فعال" value={activeContest} icon={<Trophy size={20} />} tone="amber" />
        <StatCard label="بازی‌های فعال" value={activeGame} icon={<Gamepad2 size={20} />} tone="rose" />
      </div>

      {/* تب‌های انتخاب بازهٔ تحلیل */}
      <SectionTitle action={<Badge tone="green"><TrendingUp size={12} /> موتور هوشمند تحلیل مدرسه</Badge>}>
        <span className="flex items-center gap-2"><BarChart3 size={18} className="text-emerald-700" /> تجزیه و تحلیل عملکرد مدرسه</span>
      </SectionTitle>

      <div className="mb-5 flex flex-wrap gap-2">
        {[
          ["daily", "📅 تحلیل روزانه (۱۴ روز اخیر)"],
          ["weekly", "🗓️ تحلیل هفتگی (روند ۸ هفته)"],
          ["monthly", "📊 تحلیل ماهانه (ماه‌های تحصیلی)"],
          ["yearly", "📈 تحلیل سالانه و مقایسه پایه‌ها"],
        ].map(([k, label]) => (
          <Link key={k} href={`/admin?period=${k}`}
            className={`rounded-xl px-4 py-2.5 text-xs font-black transition ${period === k ? "bg-gradient-to-l from-emerald-700 to-emerald-900 text-white shadow-md shadow-emerald-950/20" : "bg-white text-emerald-950 ring-1 ring-emerald-900/15 hover:bg-emerald-50"}`}>
            {label}
          </Link>
        ))}
      </div>

      {/* محتوای تحلیل متناسب با بازه انتخابی */}
      {period === "daily" && (
        <div className="grid gap-4 lg:grid-cols-3">
          <Card className="p-5 lg:col-span-2">
            <h3 className="mb-1 text-sm font-black text-emerald-950">نمودار فعالیت و آزمون روزانه (۱۴ روز اخیر)</h3>
            <p className="mb-3 text-xs text-emerald-800/60">تعداد شرکت در آزمون‌ها، مسابقات و بازی‌ها به تفکیک روز</p>
            <BarChartBox data={dailyData} xKey="روز" yKey="فعالیت‌ها" color="#047857" />
          </Card>
          <Card className="p-5">
            <h3 className="mb-3 text-sm font-black text-emerald-950">توزیع نوع فعالیت‌ها</h3>
            <PieChartBox data={pieData} nameKey="name" valueKey="value" />
          </Card>
        </div>
      )}

      {period === "weekly" && (
        <div className="grid gap-4 lg:grid-cols-3">
          <Card className="p-5 lg:col-span-2">
            <h3 className="mb-1 text-sm font-black text-emerald-950">روند هفتگی مشارکت دانش‌آموزان در فعالیت‌ها</h3>
            <p className="mb-3 text-xs text-emerald-800/60">مقایسه مشارکت هفتگی دانش‌آموزان در ۸ هفته گذشته</p>
            <LineChartBox data={weeklyData} xKey="هفته" yKey="مشارکت" color="#0284c7" />
          </Card>
          <Card className="p-5">
            <h3 className="mb-1 text-sm font-black text-emerald-950">میانگین نمرات هفتگی</h3>
            <p className="mb-3 text-xs text-emerald-800/60">روند رشد تحصیلی از ۲۰ نمره</p>
            <BarChartBox data={weeklyData} xKey="هفته" yKey="میانگین نمرات" color="#d97706" />
          </Card>
        </div>
      )}

      {period === "monthly" && (
        <div className="grid gap-4 lg:grid-cols-3">
          <Card className="p-5 lg:col-span-2">
            <h3 className="mb-1 text-sm font-black text-emerald-950">تحلیل ماهانهٔ آزمون‌ها و مسابقات (ماه‌های تحصیلی)</h3>
            <p className="mb-3 text-xs text-emerald-800/60">تعداد شرکت در آزمون‌ها و مسابقات از مهر تا خرداد</p>
            <BarChartBox data={monthlyData} xKey="ماه" yKey="آزمون و مسابقه" color="#7c3aed" />
          </Card>
          <Card className="p-5">
            <h3 className="mb-1 text-sm font-black text-emerald-950">روند میانگین نمرات ماهانه</h3>
            <p className="mb-3 text-xs text-emerald-800/60">رشد کیفی دروس در طول ماه‌های سال تحصیلی</p>
            <LineChartBox data={monthlyData} xKey="ماه" yKey="میانگین تحصیلی" color="#059669" />
          </Card>
        </div>
      )}

      {period === "yearly" && (
        <div className="grid gap-4 lg:grid-cols-3">
          <Card className="p-5 lg:col-span-2">
            <h3 className="mb-1 text-sm font-black text-emerald-950">تحلیل سالانه و مقایسه پایه‌ها (هفتم، هشتم و نهم)</h3>
            <p className="mb-3 text-xs text-emerald-800/60">میانگین نمرات تحصیلی به تفکیک پایه در سال تحصیلی جاری</p>
            <BarChartBox data={yearlyData} xKey="شاخص" yKey="میانگین نمره" color="#047857" />
          </Card>
          <Card className="p-5">
            <h3 className="mb-1 text-sm font-black text-emerald-950">درصد حضور سالانه پایه‌ها</h3>
            <p className="mb-3 text-xs text-emerald-800/60">نظم و انضباط حضور به درصد</p>
            <BarChartBox data={yearlyData} xKey="شاخص" yKey="درصد حضور" color="#0284c7" />
          </Card>
        </div>
      )}

      {/* نتایج آزمون‌ها */}
      <div className="mt-6 grid gap-4 lg:grid-cols-3">
        <Card className="p-5 lg:col-span-2">
          <h3 className="mb-2 text-sm font-black text-emerald-950">خلاصه گزارش عملکرد تحصیلی و انضباطی</h3>
          <div className="grid grid-cols-2 gap-3 sm:grid-cols-4">
            <div className="rounded-xl border border-emerald-900/10 bg-emerald-50/70 p-3 text-center">
              <div className="text-xl font-black text-emerald-950">{faNum("17.8")}</div>
              <div className="text-[11px] font-bold text-emerald-800/70">میانگین نمرات مدرسه</div>
            </div>
            <div className="rounded-xl border border-emerald-900/10 bg-emerald-50/70 p-3 text-center">
              <div className="text-xl font-black text-emerald-950">{faNum("95٪")}</div>
              <div className="text-[11px] font-bold text-emerald-800/70">درصد کل حضور</div>
            </div>
            <div className="rounded-xl border border-emerald-900/10 bg-emerald-50/70 p-3 text-center">
              <div className="text-xl font-black text-emerald-950">{faNum(allScores.length)}</div>
              <div className="text-[11px] font-bold text-emerald-800/70">نمره ثبت‌شده</div>
            </div>
            <div className="rounded-xl border border-emerald-900/10 bg-emerald-50/70 p-3 text-center">
              <div className="text-xl font-black text-emerald-950">{faNum(allAtt.length)}</div>
              <div className="text-[11px] font-bold text-emerald-800/70">ثبت حضور و غیاب</div>
            </div>
          </div>
        </Card>

        <Card className="p-5">
          <h3 className="mb-3 text-sm font-black text-emerald-950">آخرین آزمون‌های شرکت‌شده</h3>
          {latestAttempts.length === 0 ? (
            <p className="py-8 text-center text-xs text-emerald-800/50">هنوز آزمونی برگزار نشده است.</p>
          ) : (
            <ul className="space-y-2">
              {latestAttempts.map((l, i) => (
                <li key={i} className="flex items-center justify-between rounded-xl bg-emerald-50/60 px-3.5 py-2 text-xs">
                  <div>
                    <div className="font-extrabold text-emerald-950">{l.fn} {l.ln}</div>
                    <div className="text-[10px] text-emerald-800/60">{l.title}</div>
                  </div>
                  <span className={`rounded-full px-2.5 py-1 font-black ${((l.score ?? 0) >= 10) ? "bg-emerald-600 text-white" : "bg-red-100 text-red-700"}`}>
                    {l.score === null ? "—" : faNum(l.score)}
                  </span>
                </li>
              ))}
            </ul>
          )}
        </Card>
      </div>
    </div>
  );
}
