export type SupportStep = {
  title: string;
  description: string;
  href?: string;
  tips?: string[];
  roles?: string[];
};

export type SupportGuide = {
  id: string;
  title: string;
  summary: string;
  roles: string[];
  featured?: boolean;
  keywords?: string[];
  steps: SupportStep[];
};

export function normalizeSupportQuery(value: string): string {
  return value
    .trim()
    .replace(/ي/g, "ی")
    .replace(/ك/g, "ک")
    .replace(/‌/g, " ")
    .replace(/\s+/g, " ")
    .toLowerCase();
}

export const SUPPORT_GUIDES: SupportGuide[] = [
  {
    id: "holding-setup",
    title: "راه‌اندازی اولیه هلدینگ",
    summary: "تعریف سال تحصیلی، مدارس، برندینگ و تنظیمات پایه سازمان.",
    roles: ["developer", "super_admin"],
    featured: true,
    keywords: ["هلدینگ", "برندینگ", "سال تحصیلی", "پیش‌ثبت‌نام"],
    steps: [
      {
        title: "تعریف سال تحصیلی",
        description: "سال تحصیلی جدید را بسازید و سال جاری را مشخص کنید.",
        href: "/academic-years",
        tips: ["برای هر سال، تاریخ شروع و پایان را دقیق وارد کنید.", "فقط یک سال می‌تواند «جاری» باشد."],
      },
      {
        title: "ثبت مدارس و شعب",
        description: "اطلاعات هر مدرسه، آدرس، نقشه و مدیر شعبه را تکمیل کنید.",
        href: "/schools",
      },
      {
        title: "برند و ظاهر",
        description: "لوگو، رنگ‌ها و عناوین پورتال و پنل را از تنظیمات مدرسه → برند و ظاهر تنظیم کنید.",
        href: "/settings/school/branding",
      },
      {
        title: "سامانه پیام‌رسانی هلدینگ",
        description:
          "توکن و خط ارسال سامانه پیامکی سازمان را ثبت کنید و قالب پیام‌های سیستمی (ورود، بازیابی رمز) را تنظیم کنید. فعلاً درایور آزمایشی فقط در لاگ ثبت می‌شود.",
        href: "/messaging",
      },
      {
        title: "تنظیمات سراسری پیش‌ثبت‌نام",
        description:
          "فعال‌سازی هر مدرسه، ثبت اتباع پیش‌ثبت‌نام، و یادآوری SMS ثبت‌نام ناتمام از صفحه تنظیمات پیش‌ثبت‌نام (بخش تنظیمات سازمان برای مدیرکل).",
        href: "/pre-registration/settings",
      },
      {
        title: "تنظیمات مدرسه",
        description:
          "از صفحه تنظیمات مدرسه، برند و ظاهر، امکان ثبت اتباع، سیاست رمز عبور و به‌روزرسانی‌ها را باز کنید.",
        href: "/settings/school",
      },
      {
        title: "فعال‌سازی ماژول پیش‌ثبت‌نام",
        description: "در صورت نیاز، ماژول پیش‌ثبت‌نام آنلاین را از ماژول‌های سامانه (نقش برنامه‌نویس) فعال کنید.",
        href: "/settings",
        tips: ["تب Feature Flags → «پیش‌ثبت‌نام آنلاین»"],
      },
      {
        title: "تنظیمات پیش‌ثبت‌نام",
        description: "قوانین پایه، ظرفیت، پرداخت و فعال‌سازی ثبت‌نام را برای کل هلدینگ آماده کنید.",
        href: "/pre-registration",
      },
    ],
  },
  {
    id: "academic-year-start",
    title: "شروع سال تحصیلی در مدرسه",
    summary: "مراحل کامل آماده‌سازی مدرسه برای سال جدید: از زنگ‌ها تا چیدمان دانش‌آموز.",
    roles: ["branch_manager"],
    featured: true,
    keywords: ["کلاس", "زنگ", "برنامه هفتگی", "پیش‌ثبت‌نام", "پرسنل"],
    steps: [
      {
        title: "انتخاب زمینه کاری",
        description: "نقش «مدیر مدرسه»، شعبه فعال و سال تحصیلی جاری را انتخاب کنید.",
        href: "/select-context",
        tips: ["بدون انتخاب سال تحصیلی، کلاس‌ها و گزارش‌ها درست نمایش داده نمی‌شوند."],
      },
      {
        title: "تعریف زنگ‌های کلاسی",
        description: "ساعات شروع و پایان هر زنگ (اول تا آخر) را برای مدرسه تنظیم کنید.",
        href: "/my-school/periods",
        tips: ["قبل از برنامه هفتگی، زنگ‌ها باید کامل باشند."],
      },
      {
        title: "ایجاد کلاس‌های سال جدید",
        description: "برای هر پایه، کلاس‌های فیزیکی (مثلاً ۷/۱، ۷/۲) را بسازید.",
        href: "/my-school/classes",
      },
      {
        title: "تخصیص دروس و معلم",
        description: "از صفحه هر کلاس، دروس و معلم مسئول هر درس را مشخص کنید.",
        href: "/my-school/classes",
        tips: ["پس از ورود به لیست کلاس‌ها، روی هر کلاس بزنید و بخش «دروس» را باز کنید."],
      },
      {
        title: "برنامه هفتگی",
        description: "برنامه زنگ‌به‌زنگ هر کلاس را در بخش «برنامه» تنظیم کنید.",
        href: "/my-school/classes",
        tips: ["ابتدا دروس و معلم‌ها را ثبت کنید؛ سپس برنامه را چیدمان کنید."],
      },
      {
        title: "چیدمان دانش‌آموزان",
        description: "دانش‌آموزان را به کلاس مناسب منتقل یا تخصیص دهید.",
        href: "/my-school/classes",
        tips: ["از بخش «چیدمان» هر کلاس می‌توانید دانش‌آموزان را گروهی جابه‌جا کنید."],
      },
      {
        title: "ثبت و مدیریت پرسنل",
        description: "معلمان و کادر اداری را اضافه کنید و نقش هر فرد را تعیین کنید.",
        href: "/staff",
      },
      {
        title: "سامانه پیام‌رسانی مدرسه",
        description:
          "پنل پیامکی مدرسه (توکن، خط ارسال، نام کاربری و رمز) را وصل کنید و متن پیام‌های پیش‌ثبت‌نام و سایر رویدادها را فعال یا ویرایش کنید.",
        href: "/messaging",
      },
      {
        title: "آماده‌سازی پیش‌ثبت‌نام",
        description: "قوانین پایه، ظرفیت، پرداخت و میز پذیرش را برای سال جدید فعال کنید.",
        href: "/pre-registration",
      },
      {
        title: "ثبت دانش‌آموزان",
        description: "پرونده دانش‌آموزان جدید را تکمیل و وضعیت ثبت‌نام را پیگیری کنید.",
        href: "/students",
      },
      {
        title: "برنامه درسی پایه",
        description: "دروس هر پایه را مطابق برنامه آموزشی تنظیم کنید.",
        href: "/academic/curriculum",
      },
    ],
  },
  {
    id: "branch-staff",
    title: "مدیریت پرسنل و دسترسی‌ها",
    summary: "افزودن کارکنان، تخصیص نقش و کنترل سطح دسترسی در مدرسه.",
    roles: ["branch_manager", "developer", "super_admin"],
    steps: [
      {
        title: "افزودن کارمند",
        description: "اطلاعات هویتی، کد پرسنلی و نوع همکاری را ثبت کنید.",
        href: "/staff",
      },
      {
        title: "تخصیص نقش",
        description: "برای هر فرد نقش مناسب (معلم، معاون، مسئول پایه و …) را در شعبه تعیین کنید.",
        href: "/roles",
        tips: ["یک فرد می‌تواند چند نقش در شعب مختلف داشته باشد."],
      },
      {
        title: "فیلتر بر اساس شعبه",
        description: "در لیست پرسنل، ابتدا شعبه را انتخاب کنید تا فقط همان مدرسه نمایش داده شود.",
        href: "/staff",
      },
    ],
  },
  {
    id: "pre-registration-flow",
    title: "راهنمای پیش‌ثبت‌نام و پذیرش",
    summary: "از تنظیم قوانین تا بررسی پرونده و تأیید نهایی در میز پذیرش.",
    roles: ["branch_manager", "developer", "super_admin", "deputy_executive", "deputy_education"],
    keywords: ["پیش ثبت نام", "پذیرش", "ظرفیت", "درگاه", "میز پذیرش"],
    steps: [
      {
        title: "تنظیمات پیش‌ثبت‌نام",
        description: "وضعیت فعال بودن فرم را تنظیم کنید؛ از همین صفحه به قوانین پایه و درگاه بروید.",
        href: "/pre-registration/settings",
      },
      {
        title: "قوانین هر پایه",
        description: "شرایط، هزینه، ظرفیت، لیست انتظار و زمان آزمون را مرحله‌به‌مرحله برای هر پایه تنظیم کنید.",
        href: "/pre-registration/grades",
      },
      {
        title: "پرداخت و درگاه",
        description: "فعال‌سازی درگاه و کارت‌به‌کارت، اطلاعات حساب/شبا و تنظیمات API درگاه.",
        href: "/pre-registration/payment",
      },
      {
        title: "میز پذیرش",
        description: "پرونده‌های ارسالی را بررسی، تأیید یا رد کنید و وضعیت را به اولیا اطلاع دهید.",
        href: "/pre-registration/admissions",
      },
    ],
  },
  {
    id: "education-ops",
    title: "عملیات آموزشی و کارنامه",
    summary: "ثبت نمره، کارنامه، انضباط و پایش تکمیل نمرات.",
    roles: ["branch_manager", "deputy_education", "grade_coordinator"],
    steps: [
      {
        title: "کارنامه‌ها",
        description: "نمرات، بازه ثبت، نظارت معلمان و چاپ کارنامه از یک مسیر.",
        href: "/academic/report-cards",
      },
      {
        title: "صدور و چاپ کارنامه",
        description: "کارنامه‌های یک کلاس را مشاهده یا به‌صورت PDF دانلود کنید.",
        href: "/academic/report-cards",
      },
      {
        title: "انضباط",
        description: "موارد انضباطی را ثبت و پیگیری کنید.",
        href: "/academic/discipline",
      },
    ],
  },
  {
    id: "year-end",
    title: "پایان سال و ارتقای پایه",
    summary: "بررسی شرایط قبولی و انتقال دانش‌آموزان به پایه بعد.",
    roles: ["branch_manager", "deputy_education", "developer", "super_admin"],
    steps: [
      {
        title: "تکمیل نمرات",
        description: "مطمئن شوید همه کلاس‌ها نمره نهایی دارند.",
        href: "/academic/report-cards",
      },
      {
        title: "پیش‌نمایش ارتقا",
        description: "وضعیت قبولی، مردودی و تک‌ماده را قبل از اجرا بررسی کنید.",
        href: "/academic/promotion",
        tips: ["قوانین قبولی بر اساس مقطع (توصیفی/عددی) اعمال می‌شود."],
      },
      {
        title: "اجرای ارتقا",
        description: "پس از تأیید، دانش‌آموزان به پایه بعد منتقل می‌شوند.",
        href: "/academic/promotion",
      },
    ],
  },
  {
    id: "discipline-attendance",
    title: "حضور، غیبت و انضباط",
    summary: "ثبت و پیگیری موارد انضباطی و حضور کلاسی.",
    roles: ["deputy_discipline", "branch_manager", "teacher", "guest_teacher"],
    keywords: ["حضور", "غیبت", "انضباط", "دفتر کلاسی"],
    steps: [
      {
        title: "گزارش حضور و غیاب",
        description: "وضعیت حضور کلاس‌ها را در گزارش مدرسه ببینید و پیگیری کنید.",
        href: "/academic/attendance",
        roles: ["deputy_discipline", "branch_manager"],
      },
      {
        title: "حضور کلاسی",
        description: "از داشبورد معلم، وضعیت حضور هر جلسه را ثبت کنید.",
        href: "/dashboard",
        roles: ["teacher", "guest_teacher"],
      },
      {
        title: "ثبت مورد انضباطی",
        description: "تخلفات و اقدامات انضباطی را مستند کنید.",
        href: "/academic/discipline",
      },
      {
        title: "دفتر کلاسی",
        description: "یادداشت‌های روزانه کلاس و موضوعات تدریس‌شده را ثبت کنید.",
        href: "/academic/class-logs",
      },
    ],
  },
  {
    id: "teacher-daily",
    title: "کار روزانه معلم",
    summary: "کلاس‌ها، نمره، تکلیف، حضور و ارتباط با اولیا.",
    roles: ["teacher", "guest_teacher"],
    featured: true,
    keywords: ["نمره", "تکلیف", "کلاس", "اعلان"],
    steps: [
      {
        title: "انتخاب زمینه",
        description: "نقش معلم، مدرسه و سال تحصیلی را انتخاب کنید.",
        href: "/select-context",
      },
      {
        title: "کلاس‌ها و برنامه",
        description: "کلاس‌های تخصیص‌یافته و برنامه روزانه خود را در داشبورد ببینید.",
        href: "/dashboard",
      },
      {
        title: "ثبت نمره",
        description: "نمرات مستمر و پایانی را در بازه مجاز وارد کنید.",
        href: "/academic/report-cards",
      },
      {
        title: "تکالیف",
        description: "تکلیف تعریف کنید و پاسخ دانش‌آموزان را بررسی کنید.",
        href: "/academic/assignments",
      },
      {
        title: "حضور و دفتر کلاسی",
        description: "حضور و غیبت و یادداشت‌های کلاسی را ثبت کنید.",
        href: "/academic/class-logs",
      },
      {
        title: "اعلان‌ها و پیام",
        description: "از شبکه اجتماعی برای اطلاع‌رسانی مدرسه و کلاس استفاده کنید.",
        href: "/social",
      },
    ],
  },
  {
    id: "grade-coordinator",
    title: "هماهنگی مسئول پایه",
    summary: "نظارت بر کلاس‌های یک پایه، نمرات و برنامه درسی.",
    roles: ["grade_coordinator", "deputy_education"],
    steps: [
      {
        title: "بررسی کلاس‌های پایه",
        description: "کلاس‌ها، دروس و معلم‌های پایه تحت مسئولیت خود را مرور کنید.",
        href: "/my-school/classes",
      },
      {
        title: "پایش تکمیل نمره",
        description: "معلمان پایه را برای تکمیل به‌موقع نمرات پیگیری کنید.",
        href: "/academic/report-cards",
      },
      {
        title: "برنامه درسی",
        description: "هماهنگی محتوای درسی و دروس اضافه پایه.",
        href: "/academic/curriculum",
      },
    ],
  },
  {
    id: "executive-ops",
    title: "امور اجرایی مدرسه",
    summary: "اطلاع‌رسانی، گزارش‌ها و پشتیبانی روزانه مدرسه.",
    roles: ["deputy_executive", "branch_manager"],
    steps: [
      {
        title: "اعلان‌های مدرسه",
        description: "اطلاعیه‌های مهم را از کانال مدرسه در شبکه اجتماعی منتشر کنید.",
        href: "/social",
      },
      {
        title: "گزارش عملکرد",
        description: "شاخص‌های کلیدی مدرسه را در گزارش عملکرد ببینید.",
        href: "/reports/performance",
      },
      {
        title: "شبکه اجتماعی",
        description: "کانال‌ها و گروه‌های اطلاع‌رسانی مدرسه را مدیریت کنید.",
        href: "/social",
      },
    ],
  },
];

function stepVisibleForRole(step: SupportStep, role: string): boolean {
  if (!step.roles?.length) return true;
  return step.roles.includes(role);
}

export function guidesForRole(role: string | null): SupportGuide[] {
  if (!role) return [];
  return SUPPORT_GUIDES.filter((guide) => guide.roles.includes(role))
    .map((guide) => ({
      ...guide,
      steps: guide.steps.filter((step) => stepVisibleForRole(step, role)),
    }))
    .filter((guide) => guide.steps.length > 0);
}

export function featuredGuideForRole(role: string | null): SupportGuide | undefined {
  return guidesForRole(role).find((guide) => guide.featured);
}

function guideSearchBlob(guide: SupportGuide): string {
  return [
    guide.title,
    guide.summary,
    ...(guide.keywords ?? []),
    ...guide.steps.flatMap((step) => [step.title, step.description, ...(step.tips ?? [])]),
  ].join(" ");
}

export function searchGuides(guides: SupportGuide[], query: string): SupportGuide[] {
  const needle = normalizeSupportQuery(query);
  if (!needle) return guides;
  return guides.filter((guide) => normalizeSupportQuery(guideSearchBlob(guide)).includes(needle));
}
