import { reportCardsListHref } from "@/lib/report-cards";

export type BreadcrumbLabels = Partial<{
  school: string | null;
  class: string | null;
  detail: string | null;
  student: string | null;
  staff: string | null;
  book: string | null;
  role: string | null;
  reportCard: string | null;
  assignment: string | null;
  admission: string | null;
  space: string | null;
}>;

export type BreadcrumbItem = {
  href: string;
  label: string;
};

type CrumbContext = {
  params: Record<string, string>;
  search: URLSearchParams;
  labels: BreadcrumbLabels;
  role: string | null;
};

type RouteDef = {
  pattern: string;
  label: string | ((ctx: CrumbContext) => string);
  parent?: string | ((ctx: CrumbContext) => string | null);
  href?: string | ((ctx: CrumbContext) => string);
};

function named(value: string | null | undefined, fallback: string) {
  const trimmed = value?.trim();
  return trimmed ? trimmed : fallback;
}

export function classContextDetail(room: {
  name?: string | null;
  code?: string | null;
  field?: string | null;
  education_stage?: { name?: string | null } | null;
  grade_level?: { name?: string | null } | null;
  study_field?: { name?: string | null } | null;
  academic_year?: { title?: string | null } | null;
} | null | undefined): string {
  if (!room) return "";
  const code = room.code?.trim();
  const parts = [
    code && !room.name?.includes(code) ? code : null,
    room.education_stage?.name,
    room.grade_level?.name ? `پایه ${room.grade_level.name}` : null,
    room.study_field?.name ?? room.field,
    room.academic_year?.title,
  ].filter(Boolean);
  return parts.join(" · ");
}

export function classBreadcrumbLabels(room: {
  name?: string | null;
  code?: string | null;
  field?: string | null;
  branch?: { name?: string | null } | null;
  education_stage?: { name?: string | null } | null;
  grade_level?: { name?: string | null } | null;
  study_field?: { name?: string | null } | null;
  academic_year?: { title?: string | null } | null;
} | null | undefined): BreadcrumbLabels {
  if (!room) return {};
  return {
    school: room.branch?.name,
    class: room.name,
    detail: classContextDetail(room) || undefined,
  };
}

function schoolParent(ctx: CrumbContext) {
  return ctx.role === "super_admin" || ctx.role === "developer" ? "/schools" : "/dashboard";
}

function booksListHref(ctx: CrumbContext) {
  const branchId = ctx.search.get("branch_id");
  return branchId ? `/academic/curriculum/books?branch_id=${branchId}` : "/academic/curriculum/books";
}

function booksListParent(ctx: CrumbContext) {
  const branchId = ctx.search.get("branch_id");
  return branchId ? `/schools/${branchId}/dashboard` : "/academic/curriculum";
}

const ROUTES: RouteDef[] = [
  { pattern: "/dashboard", label: "داشبورد" },

  { pattern: "/account", label: "حساب کاربری", parent: "/dashboard" },
  { pattern: "/support", label: "مرکز راهنما", parent: "/dashboard" },
  { pattern: "/branding", label: "برند و ظاهر", parent: "/settings/school" },
  { pattern: "/settings/updates", label: "به‌روزرسانی‌ها", parent: "/settings/school" },
  { pattern: "/settings/password", label: "سیاست رمز عبور", parent: "/settings/school" },
  { pattern: "/settings/school/branding", label: "برند و ظاهر", parent: "/settings/school" },
  { pattern: "/settings/school/foreign-nationals", label: "امکان ثبت نام اتباع", parent: "/settings/school" },
  { pattern: "/settings/school/password", label: "سیاست رمز عبور", parent: "/settings/school" },
  { pattern: "/settings/school/updates", label: "به‌روزرسانی‌ها", parent: "/settings/school" },
  { pattern: "/settings/school", label: "تنظیمات مدرسه", parent: "/dashboard" },
  { pattern: "/settings", label: "ماژول‌های سامانه", parent: "/dashboard" },
  { pattern: "/users", label: "کاربران", parent: "/dashboard" },
  { pattern: "/branches", label: "شعب", parent: "/dashboard" },
  { pattern: "/virtual-classes", label: "کلاس آنلاین", parent: "/dashboard" },
  { pattern: "/virtual-classes/manage", label: "عملیات کلاس آنلاین", parent: "/virtual-classes" },
  { pattern: "/virtual-classes/providers", label: "سرویس‌ها و سرورها", parent: "/virtual-classes" },
  { pattern: "/virtual-classes/providers/new", label: "ثبت سرور", parent: "/virtual-classes/providers" },
  { pattern: "/virtual-classes/providers/:id", label: "ویرایش سرور", parent: "/virtual-classes/providers" },
  {
    pattern: "/virtual-classes/providers/:id/access",
    label: "دسترسی",
    parent: "/virtual-classes/providers",
  },
  { pattern: "/virtual-classes/settings", label: "تنظیمات کلاس آنلاین", parent: "/virtual-classes" },
  { pattern: "/virtual-classes/rooms/new", label: "افزودن اتاق", parent: "/virtual-classes/manage" },
  { pattern: "/virtual-classes/sessions/new", label: "افزودن جلسه", parent: "/virtual-classes/manage" },
  { pattern: "/virtual-classes/rooms/:id", label: "اتاق کلاس آنلاین", parent: "/virtual-classes/manage" },
  { pattern: "/virtual-classes/sessions/:id", label: "جلسه کلاس آنلاین", parent: "/virtual-classes/manage" },
  { pattern: "/reports/performance", label: "گزارش عملکرد", parent: "/dashboard" },

  { pattern: "/schools", label: "مدارس", parent: "/dashboard" },
  { pattern: "/schools/new", label: "مدرسه جدید", parent: "/schools" },
  { pattern: "/buildings", label: "ساختمان‌ها", parent: "/dashboard" },
  { pattern: "/buildings/new", label: "ساختمان جدید", parent: "/buildings" },
  { pattern: "/buildings/:id", label: "ویرایش ساختمان", parent: "/buildings" },
  {
    pattern: "/schools/:id/dashboard",
    label: (ctx) => named(ctx.labels.school, "مدرسه"),
    parent: schoolParent,
  },
  {
    pattern: "/schools/:id/edit",
    label: "تنظیمات مدرسه",
    parent: "/schools/:id/dashboard",
  },
  {
    pattern: "/schools/:id/classes",
    label: "کلاس‌ها",
    parent: "/schools/:id/dashboard",
  },
  {
    pattern: "/schools/:id/periods",
    label: "زنگ‌ها",
    parent: "/schools/:id/dashboard",
  },
  {
    pattern: "/schools/:id/subjects",
    label: "فهرست دروس",
    parent: "/schools/:id/dashboard",
  },
  {
    pattern: "/schools/:id/pre-registration",
    label: "پیش‌ثبت‌نام",
    parent: "/schools/:id/dashboard",
  },
  {
    pattern: "/schools/:id/classes/:classId",
    label: (ctx) => named(ctx.labels.class, "کلاس"),
    parent: "/schools/:id/classes",
    href: "/schools/:id/classes/:classId/schedule",
  },
  {
    pattern: "/schools/:id/classes/:classId/schedule",
    label: "برنامه هفتگی",
    parent: "/schools/:id/classes/:classId",
  },
  {
    pattern: "/schools/:id/classes/:classId/subjects",
    label: "دروس و معلمان",
    parent: "/schools/:id/classes/:classId",
  },
  {
    pattern: "/schools/:id/classes/:classId/placement",
    label: "کلاس‌بندی",
    parent: "/schools/:id/classes/:classId",
  },

  { pattern: "/my-school/classes", label: "کلاس‌ها", parent: "/dashboard" },
  { pattern: "/my-school/periods", label: "زنگ‌ها", parent: "/dashboard" },
  { pattern: "/my-school/subjects", label: "فهرست دروس", parent: "/dashboard" },

  { pattern: "/academic", label: "نمرات و کارنامه", parent: "/dashboard" },
  { pattern: "/academic/academy", label: "آکادمی", parent: "/academic" },
  { pattern: "/academic/assignments", label: "تکالیف", parent: "/academic" },
  { pattern: "/academic/attendance", label: "گزارش حضور و غیاب", parent: "/academic" },
  {
    pattern: "/academic/attendance/records",
    label: "ریز داده‌های حضور",
    parent: "/academic/attendance",
  },
  { pattern: "/academic/class-logs", label: "دفتر کلاسی", parent: "/academic" },
  { pattern: "/academic/discipline", label: "انضباط", parent: "/academic" },
  { pattern: "/academic/promotion", label: "ارتقای پایه", parent: "/academic" },
  { pattern: "/academic/schedules", label: "برنامه هفتگی", parent: "/academic" },
  { pattern: "/academic/subjects", label: "دروس", parent: "/academic/curriculum" },
  { pattern: "/academic/curriculum", label: "برنامه درسی پایه", parent: "/academic" },
  { pattern: "/academic/curriculum/extras", label: "دروس فوق‌العاده", parent: "/academic/curriculum" },
  {
    pattern: "/academic/curriculum/books",
    label: "کتاب‌های درسی",
    parent: booksListParent,
    href: booksListHref,
  },
  {
    pattern: "/academic/curriculum/books/:id",
    label: (ctx) =>
      ctx.params.id === "new" ? "کتاب درسی جدید" : named(ctx.labels.book, "کتاب درسی"),
    parent: "/academic/curriculum/books",
  },
  { pattern: "/academic/grades/pending-teachers", label: "نظارت کارنامه", parent: "/academic/report-cards" },
  {
    pattern: "/academic/grades/pending-teachers/:periodId",
    label: "نظارت کارنامه",
    parent: "/academic/report-cards",
  },
  { pattern: "/academic/grades/completion", label: "کارنامه‌ها", parent: "/academic/report-cards" },
  { pattern: "/academic/grades/teacher", label: "کارنامه‌ها", parent: "/academic/report-cards" },
  {
    pattern: "/academic/grades/teacher/:classId",
    label: "ثبت نمره",
    parent: "/academic/report-cards",
  },
  { pattern: "/academic/report-cards", label: "کارنامه‌ها", parent: "/academic", href: () => reportCardsListHref() },
  { pattern: "/academic/report-cards/new", label: "ایجاد کارنامه", parent: "/academic/report-cards" },
  {
    pattern: "/academic/report-cards/:id",
    label: (ctx) => named(ctx.labels.reportCard, "کارنامه"),
    parent: "/academic/report-cards",
  },
  {
    pattern: "/academic/report-cards/:id/print",
    label: "چاپ کارنامه",
    parent: "/academic/report-cards/:id",
  },
  {
    pattern: "/academic/report-cards/:id/analytics",
    label: "نمودارهای تحلیلی",
    parent: "/academic/report-cards/:id",
  },
  {
    pattern: "/academic/report-cards/:id/warnings",
    label: "تنظیمات",
    parent: "/academic/report-cards/:id",
  },
  {
    pattern: "/academic/report-cards/:id/grade-windows",
    label: "بازه ثبت",
    parent: "/academic/report-cards/:id",
  },
  {
    pattern: "/assignments/:id",
    label: (ctx) => named(ctx.labels.assignment, "پیشرفت تمرین"),
    parent: "/academic/assignments",
  },

  { pattern: "/pre-registration", label: "پیش‌ثبت‌نام", parent: "/dashboard" },
  { pattern: "/pre-registration/admissions", label: "میز پذیرش", parent: "/pre-registration" },
  {
    pattern: "/pre-registration/admissions/:id",
    label: (ctx) => named(ctx.labels.admission, "جزئیات درخواست"),
    parent: "/pre-registration/admissions",
  },
  { pattern: "/pre-registration/branches", label: "مدارس پیش‌ثبت‌نام", parent: "/pre-registration" },
  { pattern: "/pre-registration/exam", label: "محل و زمان آزمون", parent: "/pre-registration" },
  { pattern: "/pre-registration/grades", label: "قوانین هر پایه", parent: "/pre-registration" },
  { pattern: "/pre-registration/interest", label: "درخواست اطلاع ثبت‌نام", parent: "/pre-registration" },
  { pattern: "/pre-registration/interview", label: "زمان‌بندی مصاحبه", parent: "/pre-registration" },
  { pattern: "/pre-registration/org-defaults", label: "اعمال گروهی تنظیمات", parent: "/pre-registration/settings" },
  { pattern: "/pre-registration/payment", label: "پرداخت و درگاه", parent: "/pre-registration/settings" },
  { pattern: "/pre-registration/seats", label: "ظرفیت پذیرش", parent: "/pre-registration" },
  { pattern: "/pre-registration/settings", label: "تنظیمات پیش‌ثبت‌نام", parent: "/pre-registration" },
  { pattern: "/admissions", label: "میز پذیرش", parent: "/pre-registration" },

  { pattern: "/students", label: "دانش‌آموزان", parent: "/dashboard" },
  { pattern: "/students/new", label: "ثبت دانش‌آموز", parent: "/students" },
  { pattern: "/students/import", label: "ورود از اکسل", parent: "/students" },
  {
    pattern: "/students/:id",
    label: (ctx) => named(ctx.labels.student, "دانش‌آموز"),
    parent: "/students",
  },
  {
    pattern: "/students/:id/edit",
    label: "ویرایش",
    parent: "/students/:id",
  },
  {
    pattern: "/students/:id/reset-password",
    label: "بازنشانی رمز",
    parent: "/students/:id",
  },
  {
    pattern: "/students/:id/guardians",
    label: "اولیا",
    parent: "/students/:id",
  },
  {
    pattern: "/students/:id/guardians/new",
    label: "افزودن ولی",
    parent: "/students/:id/guardians",
  },
  {
    pattern: "/students/:id/guardians/:linkId/edit",
    label: "ویرایش ولی",
    parent: "/students/:id/guardians",
  },
  {
    pattern: "/students/:id/membership",
    label: "عضویت",
    parent: "/students/:id",
  },

  { pattern: "/staff", label: "کارمندان", parent: "/dashboard" },
  { pattern: "/staff/new", label: "ثبت کارمند", parent: "/staff" },
  { pattern: "/staff/import", label: "ورود از اکسل", parent: "/staff" },
  {
    pattern: "/staff/:id",
    label: (ctx) => named(ctx.labels.staff, "مشاهده کارمند"),
    parent: "/staff",
  },
  {
    pattern: "/staff/:id/edit",
    label: "ویرایش",
    parent: "/staff/:id",
  },
  {
    pattern: "/staff/:id/roles",
    label: "تخصیص نقش",
    parent: "/staff/:id",
  },

  { pattern: "/roles", label: "نقش‌ها و دسترسی‌ها", parent: "/dashboard" },
  {
    pattern: "/roles/:id",
    label: (ctx) => named(ctx.labels.role, "دسترسی‌های نقش"),
    parent: "/roles",
  },

  { pattern: "/academic-years", label: "سال تحصیلی", parent: "/dashboard" },
  { pattern: "/calendar", label: "تقویم و تعطیلات", parent: "/dashboard" },
  { pattern: "/calendar/import", label: "ورود گروهی", parent: "/calendar" },
  { pattern: "/education-stages", label: "مقاطع و پایه‌ها", parent: "/dashboard" },
  { pattern: "/study-fields", label: "رشته‌های تحصیلی", parent: "/dashboard" },
  { pattern: "/rule-sets", label: "قوانین", parent: "/dashboard" },

  { pattern: "/messaging", label: "پیامک و اطلاع‌رسانی", parent: "/dashboard" },
  { pattern: "/social", label: "شبکه اجتماعی", parent: "/dashboard" },
  {
    pattern: "/social/:spaceId",
    label: (ctx) => named(ctx.labels.space, "فضا"),
    parent: "/social",
  },
  { pattern: "/teacher/profile", label: "پرونده معلم", parent: "/dashboard" },
  {
    pattern: "/teacher/classes/:classId",
    label: (ctx) => named(ctx.labels.class, "کلاس"),
    parent: "/dashboard",
  },
  {
    pattern: "/teacher/classes/:classId/assignments/new",
    label: "تکلیف جدید",
    parent: "/teacher/classes/:classId",
  },
  {
    pattern: "/teacher/classes/:classId/assignments/:assignmentId/edit",
    label: (ctx) => named(ctx.labels.assignment, "ویرایش تکلیف"),
    parent: "/teacher/classes/:classId",
  },
  {
    pattern: "/teacher/classes/:classId/assignments/:assignmentId/grading",
    label: (ctx) => named(ctx.labels.assignment, "تصحیح تکلیف"),
    parent: "/teacher/classes/:classId",
  },
];

function stripQuery(path: string) {
  const index = path.indexOf("?");
  return index === -1 ? path : path.slice(0, index);
}

function interpolate(template: string, params: Record<string, string>) {
  return template.replace(/:([A-Za-z]+)/g, (_, key: string) => params[key] ?? `:${key}`);
}

function matchPattern(pattern: string, pathname: string): Record<string, string> | null {
  const patternParts = pattern.split("/").filter(Boolean);
  const pathParts = pathname.split("/").filter(Boolean);
  if (patternParts.length !== pathParts.length) return null;

  const params: Record<string, string> = {};
  for (let i = 0; i < patternParts.length; i++) {
    const part = patternParts[i];
    if (part.startsWith(":")) {
      params[part.slice(1)] = decodeURIComponent(pathParts[i]);
    } else if (part !== pathParts[i]) {
      return null;
    }
  }
  return params;
}

function findMatch(pathname: string): { def: RouteDef; params: Record<string, string> } | null {
  const path = stripQuery(pathname);
  let best: { def: RouteDef; params: Record<string, string>; staticCount: number; length: number } | null = null;

  for (const def of ROUTES) {
    const params = matchPattern(def.pattern, path);
    if (!params) continue;
    const parts = def.pattern.split("/").filter(Boolean);
    const staticCount = parts.filter((part) => !part.startsWith(":")).length;
    if (
      !best ||
      staticCount > best.staticCount ||
      (staticCount === best.staticCount && parts.length > best.length)
    ) {
      best = { def, params, staticCount, length: parts.length };
    }
  }

  return best ? { def: best.def, params: best.params } : null;
}

function toSearch(search: URLSearchParams | string): URLSearchParams {
  return typeof search === "string" ? new URLSearchParams(search) : search;
}

export function resolveBreadcrumbs(
  pathname: string,
  search: URLSearchParams | string,
  labels: BreadcrumbLabels = {},
  role: string | null = null,
  fallbackTitle?: string,
): BreadcrumbItem[] {
  if (!pathname || pathname === "/dashboard") return [];

  const query = toSearch(search);
  const seen = new Set<string>();
  const chain: BreadcrumbItem[] = [];
  let currentPath = stripQuery(pathname);
  let params: Record<string, string> = {};

  for (let i = 0; i < 12; i++) {
    if (!currentPath || currentPath === "/dashboard" || seen.has(currentPath)) break;
    seen.add(currentPath);

    const found = findMatch(currentPath);
    if (!found) {
      if (chain.length === 0 && fallbackTitle) {
        chain.push({ href: currentPath, label: fallbackTitle });
      }
      break;
    }

    params = { ...params, ...found.params };
    const ctx: CrumbContext = { params, search: query, labels, role };
    const href =
      typeof found.def.href === "function"
        ? found.def.href(ctx)
        : interpolate(found.def.href ?? found.def.pattern, params);
    const label = typeof found.def.label === "function" ? found.def.label(ctx) : found.def.label;
    chain.push({ href, label });

    const parentRaw = typeof found.def.parent === "function" ? found.def.parent(ctx) : found.def.parent;
    if (!parentRaw) break;
    currentPath = stripQuery(interpolate(parentRaw, params));
  }

  if (chain.length === 0) return [];

  const items = chain.reverse();
  if (items[0]?.href !== "/dashboard") {
    items.unshift({ href: "/dashboard", label: "داشبورد" });
  }
  const detail = labels.detail?.trim();
  if (detail && items.length > 0) {
    const last = items[items.length - 1];
    last.label = `${last.label} · ${detail}`;
  }
  return items;
}

export function resolveParentHref(items: BreadcrumbItem[]): string {
  if (items.length >= 2) return items[items.length - 2].href;
  return "/dashboard";
}
