'use client';

import { useRef } from 'react';
import { useRouter } from 'next/navigation';
import {
  ArrowLeft,
  FileDown,
  Printer,
  Table2,
  CheckCircle2,
  XCircle,
  AlertTriangle,
  Lightbulb,
  BarChart3,
  Shield,
  Database,
  Users,
  Calendar,
  Phone,
  Mail,
  Layers,
  GitBranch,
  Globe,
  TrendingUp,
  TrendingDown,
  Zap,
  Building2,
  CreditCard,
  Package,
  Star,
  Target,
} from 'lucide-react';
import { cn } from '@/lib/cn';

const LAST_UPDATE = '21 февраля 2026';

/* ═══════════════════════════════════════════════════════════════
   1. ПОЛНЫЙ ФУНКЦИОНАЛ 1С:ФИТНЕС КЛУБ
   ═══════════════════════════════════════════════════════════════ */

interface FeatureModule {
  module: string;
  icon: string;
  features: string[];
}

const fitnessTestModules: FeatureModule[] = [
  {
    module: 'Работа с клиентами',
    icon: 'users',
    features: [
      'Карта клиента (статусы, фото, контакты, теги, удостоверения)',
      'Управление членствами (продажа, активация, заморозка, продление, блокировка, смена владельца)',
      'Учёт посещений (списание тренировок, статистика)',
      'Предварительная запись на групповые и персональные занятия',
      'Пластиковые карты (штрихкод, магнитные, бесконтактные)',
      'Аренда шкафчиков и ячеек',
      'Корпоративные клиенты',
      'Рекуррентные договоры',
      'Печать договоров из шаблонов',
      'Бонусные счета клиентов',
      'Семейные аккаунты',
      'Страховые полисы',
      'Штрафы клиентам',
    ],
  },
  {
    module: 'CRM и продажи',
    icon: 'target',
    features: [
      'Воронки продаж с автоматизацией',
      'Менеджер по продажам (Планировщик) — только КОРП',
      'Руководитель отдела продаж (мониторинг) — только КОРП',
      'Триггерные события и автозадачи',
      'Анализ клиентской базы',
      'KPI менеджеров (конверсия, время обработки, причины отказов)',
      'Сбор лидов из каналов (WA, TG, VK, формы, квизы)',
      'Рекламные источники и UTM-метки',
      'Маркетинговые акции и кампании',
      'Сквозная аналитика (Яндекс Метрика, Calltouch)',
    ],
  },
  {
    module: 'Расписание и бронирование',
    icon: 'calendar',
    features: [
      'Расписание групповых занятий',
      'Расписание персональных тренировок',
      'Аренда залов',
      'Онлайн-запись 24/7 (виджет на сайте)',
      'Листы ожидания',
      'Секции и циклы занятий',
      'Интеграция с Яндекс.Картами и 2ГИС',
    ],
  },
  {
    module: 'Учёт финансов',
    icon: 'credit-card',
    features: [
      'Касса и банк (наличные, безнал)',
      'Лицевые счета клиентов (депозиты, несколько видов)',
      'Взаиморасчёты с подотчётными лицами',
      '10+ вариантов приёма платежей',
      'СБП (система быстрых платежей)',
      'Платёжные ссылки',
      'Яндекс Сплит (рассрочка)',
      'Рекуррентные платежи',
      'Онлайн-оплата на сайте',
      'Оплата в соцсетях и приложении',
      'Подарочные сертификаты (электронные)',
      'Возвраты',
      'Рассрочка',
      'Справки в налоговую',
      'НДС, чеки коррекции',
    ],
  },
  {
    module: 'Управление персоналом',
    icon: 'building',
    features: [
      'График работы сотрудников',
      'График дежурств',
      'Учёт фактически отработанного времени',
      'Расчёт зарплаты (оклад, фикс, тариф за выход, % от услуг)',
      'Анализ эффективности персонала',
      'Интерфейс «Тренер» (планирование, регистрация, отчёты)',
      'Интерфейс «Фитнес-бар» (продажа питания)',
    ],
  },
  {
    module: 'Учёт запасов на складе',
    icon: 'package',
    features: [
      'Поступление товаров',
      'Учёт по партиям (FIFO, по среднему)',
      'Розничная продажа клиентам',
      'Списание материалов при оказании услуг',
      'Контроль критических остатков',
      'Инвентаризация',
      'Технологические карты (блюда)',
      'Расчёт себестоимости блюд',
    ],
  },
  {
    module: 'Маркетинг и лояльность',
    icon: 'star',
    features: [
      'SMS-рассылки (встроенный модуль)',
      'Email-рассылки (встроенный почтовый клиент)',
      'Push-уведомления (через мобильное приложение)',
      'Дисконтные карты (накопительные)',
      'Программа лояльности (бонусы)',
      'Подарочные сертификаты',
      'Персональные промокоды',
      'Реферальная программа',
      'Анализ эффективности рекламных источников',
      '20+ маркетинговых отчётов',
    ],
  },
  {
    module: 'Аналитика и отчёты',
    icon: 'bar-chart',
    features: [
      '120+ готовых отчётов',
      'Конструктор собственных отчётов',
      'Отчёты по клиентам (взаиморасчёты, обязательства, посещения)',
      'Отчёты по финансам (ведомость, выручка, ежедневные)',
      'Отчёты по складу (остатки, ТОРГ-29)',
      'Отчёты по персоналу (расчёты с персоналом)',
      'Маркетинговые отчёты (20+)',
      'Дашборды с визуализацией',
      'Аналитика в мобильном приложении',
      'Рейтинги менеджеров по конверсии',
      'План продаж и выполнение',
    ],
  },
  {
    module: 'Мобильные приложения',
    icon: 'smartphone',
    features: [
      'Приложение для клиентов (абонемент, расписание, запись, оплата)',
      'Приложение для тренеров (расписание, отметка, аналитика, зарплата)',
      'Приложение для руководителя (мобильная аналитика)',
      'Push-уведомления',
      'Личный кабинет на сайте',
    ],
  },
  {
    module: 'СКУД и оборудование',
    icon: 'shield',
    features: [
      'СКУД (только КОРП): карта, карта+палец, карта+лицо',
      'Фискальные регистраторы',
      'Сканеры штрихкодов',
      'Считыватели карт (магнитные, бесконтактные)',
      'Эквайринговые терминалы',
      'Веб-камеры',
      'Облачные кассы (Orange Data, Life pay, CloudKassir)',
    ],
  },
  {
    module: 'Интеграции',
    icon: 'layers',
    features: [
      '100+ готовых интеграций',
      'IP-телефония (50+ провайдеров: Mango, UIS и др.)',
      'Мессенджеры (WhatsApp, Telegram, Viber, VK, MAX)',
      'Чат-боты',
      '1С:Бухгалтерия 8',
      '1С:Отель',
      'CMS 1С-Битрикс',
      'Честный знак (маркировка)',
      'API V.2 и API V.3',
      'Платёжные сервисы (ЮKassa, CloudPayments)',
      'Сквозная аналитика (Яндекс Метрика, Calltouch)',
      'Leed-формы и квизы (Марквиз)',
    ],
  },
  {
    module: 'Коммуникации',
    icon: 'message',
    features: [
      'Единое окно для всех диалогов',
      'Автоответы и чат-боты',
      'Ссылки на оплату прямо в чате',
      'История переписки с клиентом',
      'Уведомления в мессенджерах для сотрудников',
    ],
  },
];

/* ═══════════════════════════════════════════════════════════════
   2. СРАВНИТЕЛЬНАЯ ТАБЛИЦА ФУНКЦИОНАЛА
   ═══════════════════════════════════════════════════════════════ */

type Status = 'yes' | 'no' | 'partial' | 'planned';

interface CompRow {
  category: string;
  feature: string;
  fitness1c: Status;
  fitness1cNote: string;
  myfitcrm: Status;
  myfitcrmNote: string;
}

const comparisonData: CompRow[] = [
  // --- Клиенты ---
  { category: 'Клиенты', feature: 'Карта клиента (ФИО, контакты, фото)', fitness1c: 'yes', fitness1cNote: 'Полная карточка с тегами, удостоверениями', myfitcrm: 'yes', myfitcrmNote: 'Client: firstName, lastName, phone, email, avatarUrl, notes' },
  { category: 'Клиенты', feature: 'Цели и травмы клиента', fitness1c: 'no', fitness1cNote: 'Нет отдельных сущностей', myfitcrm: 'yes', myfitcrmNote: 'ClientGoal, ClientInjury — отдельные модели' },
  { category: 'Клиенты', feature: 'Членства / абонементы', fitness1c: 'yes', fitness1cNote: 'Полный цикл: продажа, заморозка, продление, блокировка, смена владельца', myfitcrm: 'partial', myfitcrmNote: 'ClientMembership: name, startDate, endDate. Нет заморозки, смены владельца' },
  { category: 'Клиенты', feature: 'Корпоративные клиенты', fitness1c: 'yes', fitness1cNote: 'Отдельная сущность с договорами', myfitcrm: 'no', myfitcrmNote: 'Не реализовано' },
  { category: 'Клиенты', feature: 'Семейные аккаунты', fitness1c: 'yes', fitness1cNote: 'Связи между клиентами', myfitcrm: 'no', myfitcrmNote: 'Не реализовано' },
  { category: 'Клиенты', feature: 'Пластиковые карты (штрихкод, RFID)', fitness1c: 'yes', fitness1cNote: 'Полная поддержка + считыватели', myfitcrm: 'no', myfitcrmNote: 'Не реализовано' },
  { category: 'Клиенты', feature: 'Аренда шкафчиков', fitness1c: 'yes', fitness1cNote: 'Учёт аренды ячеек', myfitcrm: 'no', myfitcrmNote: 'Не реализовано' },
  { category: 'Клиенты', feature: 'Бонусные счета', fitness1c: 'yes', fitness1cNote: 'Начисление / списание бонусов', myfitcrm: 'no', myfitcrmNote: 'Нет бонусной системы' },
  { category: 'Клиенты', feature: 'Спящие клиенты (автодетект)', fitness1c: 'partial', fitness1cNote: 'Через отчёты, нет автоматики', myfitcrm: 'yes', myfitcrmNote: 'GET /clients/sleeping — автоматический расчёт (>30 дней)' },
  { category: 'Клиенты', feature: 'Назначение тренера', fitness1c: 'partial', fitness1cNote: 'Через задачи в CRM', myfitcrm: 'yes', myfitcrmNote: 'assignedTrainerId + POST /clients/:id/assign' },
  { category: 'Клиенты', feature: 'Источник привлечения (source)', fitness1c: 'yes', fitness1cNote: 'UTM-метки, рекламные источники', myfitcrm: 'partial', myfitcrmNote: 'Поле source в Client, без UTM-аналитики' },
  { category: 'Клиенты', feature: 'Страховые полисы', fitness1c: 'yes', fitness1cNote: 'Отдельный раздел', myfitcrm: 'no', myfitcrmNote: 'Не реализовано' },
  { category: 'Клиенты', feature: 'Штрафы клиентам', fitness1c: 'yes', fitness1cNote: 'Система штрафов', myfitcrm: 'no', myfitcrmNote: 'Не реализовано' },

  // --- CRM и воронка ---
  { category: 'CRM / Воронка', feature: 'Воронка продаж', fitness1c: 'yes', fitness1cNote: 'Настраиваемые воронки с автоматизацией', myfitcrm: 'yes', myfitcrmNote: 'FunnelEntry: 7 этапов (NEW→REGULAR)' },
  { category: 'CRM / Воронка', feature: 'Координатор (распределение)', fitness1c: 'partial', fitness1cNote: 'Менеджер по продажам (КОРП)', myfitcrm: 'yes', myfitcrmNote: 'Роль COORDINATOR + POST /funnel/assign' },
  { category: 'CRM / Воронка', feature: 'KPI менеджеров', fitness1c: 'yes', fitness1cNote: 'Конверсия, время обработки, причины отказов', myfitcrm: 'partial', myfitcrmNote: 'RatingPeriod (конверсии), нет KPI менеджеров' },
  { category: 'CRM / Воронка', feature: 'Триггерные события / автозадачи', fitness1c: 'yes', fitness1cNote: 'Триггеры, автозадачи, автоуведомления', myfitcrm: 'partial', myfitcrmNote: 'Webhooks (15 событий), но нет автозадач' },
  { category: 'CRM / Воронка', feature: 'Сбор лидов из каналов', fitness1c: 'yes', fitness1cNote: 'WA, TG, VK, формы, квизы', myfitcrm: 'no', myfitcrmNote: 'Нет лидогенерации и форм' },
  { category: 'CRM / Воронка', feature: 'Рекламные источники / UTM', fitness1c: 'yes', fitness1cNote: 'UTM, аналитика рекламы', myfitcrm: 'no', myfitcrmNote: 'Не реализовано' },

  // --- Расписание ---
  { category: 'Расписание', feature: 'Персональные тренировки', fitness1c: 'yes', fitness1cNote: 'Полный CRUD', myfitcrm: 'yes', myfitcrmNote: 'Training: CRUD + отмена/перенос/повтор' },
  { category: 'Расписание', feature: 'Групповые занятия', fitness1c: 'yes', fitness1cNote: 'Расписание с ёмкостью, листы ожидания', myfitcrm: 'partial', myfitcrmNote: 'Нет отдельного типа «групповое», нет листов ожидания' },
  { category: 'Расписание', feature: 'Секции и циклы', fitness1c: 'yes', fitness1cNote: 'Серии занятий с автоповтором', myfitcrm: 'partial', myfitcrmNote: 'isRepeating + repeatParentId, но без секций' },
  { category: 'Расписание', feature: 'Онлайн-запись 24/7', fitness1c: 'yes', fitness1cNote: 'Виджет на сайт, Яндекс.Карты, 2ГИС', myfitcrm: 'no', myfitcrmNote: 'Нет клиентского портала для онлайн-записи' },
  { category: 'Расписание', feature: 'Листы ожидания', fitness1c: 'yes', fitness1cNote: 'Автоматическая очередь', myfitcrm: 'no', myfitcrmNote: 'Не реализовано' },
  { category: 'Расписание', feature: 'Аренда залов', fitness1c: 'yes', fitness1cNote: 'Бронирование залов', myfitcrm: 'partial', myfitcrmNote: 'Room: только справочник, нет бронирования' },
  { category: 'Расписание', feature: 'График работы тренеров', fitness1c: 'yes', fitness1cNote: 'Планирование + дежурства', myfitcrm: 'yes', myfitcrmNote: 'WorkSchedule: date, startTime, endTime, isAvailable' },

  // --- Продажи и финансы ---
  { category: 'Финансы', feature: 'Продажи (услуги, пакеты)', fitness1c: 'yes', fitness1cNote: 'Полный учёт с номенклатурой', myfitcrm: 'yes', myfitcrmNote: 'Sale: amount, status (PENDING/PAID/CANCELLED/REFUNDED)' },
  { category: 'Финансы', feature: 'Касса и банк', fitness1c: 'yes', fitness1cNote: 'Наличные, безнал, депозиты', myfitcrm: 'no', myfitcrmNote: 'Нет кассовых операций' },
  { category: 'Финансы', feature: 'Онлайн-оплата', fitness1c: 'yes', fitness1cNote: '10+ вариантов (СБП, ЮKassa, CloudPayments)', myfitcrm: 'planned', myfitcrmNote: 'Планируется (нет эквайринга)' },
  { category: 'Финансы', feature: 'Рекуррентные платежи', fitness1c: 'yes', fitness1cNote: 'Автосписание по расписанию', myfitcrm: 'no', myfitcrmNote: 'Не реализовано' },
  { category: 'Финансы', feature: 'Подарочные сертификаты', fitness1c: 'yes', fitness1cNote: 'Электронные + физические', myfitcrm: 'no', myfitcrmNote: 'Не реализовано' },
  { category: 'Финансы', feature: 'Возвраты', fitness1c: 'yes', fitness1cNote: 'Полные и частичные', myfitcrm: 'partial', myfitcrmNote: 'SaleStatus.REFUNDED, но нет частичных возвратов' },
  { category: 'Финансы', feature: 'Рассрочка', fitness1c: 'yes', fitness1cNote: 'Кредитные договоры + Яндекс Сплит', myfitcrm: 'no', myfitcrmNote: 'Не реализовано' },
  { category: 'Финансы', feature: 'Расчёт зарплат', fitness1c: 'yes', fitness1cNote: 'Оклад, фикс, тариф, % от услуг', myfitcrm: 'no', myfitcrmNote: 'Не реализовано' },
  { category: 'Финансы', feature: 'Учёт долгов', fitness1c: 'yes', fitness1cNote: 'Взаиморасчёты с клиентами', myfitcrm: 'yes', myfitcrmNote: 'GET /sales/debts + /debts/summary' },

  // --- Склад ---
  { category: 'Склад', feature: 'Учёт товаров на складе', fitness1c: 'yes', fitness1cNote: 'FIFO, средневзвешенная, инвентаризация', myfitcrm: 'no', myfitcrmNote: 'Не реализовано' },
  { category: 'Склад', feature: 'Розничная продажа товаров', fitness1c: 'yes', fitness1cNote: 'POS-продажа + чеки', myfitcrm: 'no', myfitcrmNote: 'Не реализовано' },
  { category: 'Склад', feature: 'Фитнес-бар', fitness1c: 'yes', fitness1cNote: 'Техкарты, себестоимость блюд', myfitcrm: 'no', myfitcrmNote: 'Не реализовано' },

  // --- Персонал ---
  { category: 'Персонал', feature: 'Управление сотрудниками', fitness1c: 'yes', fitness1cNote: 'Полный HR-блок', myfitcrm: 'yes', myfitcrmNote: 'User: 6 ролей, привязка к департаменту' },
  { category: 'Персонал', feature: 'Департаменты', fitness1c: 'partial', fitness1cNote: 'Структурные единицы', myfitcrm: 'yes', myfitcrmNote: 'Department: CRUD + привязка пользователей' },
  { category: 'Персонал', feature: 'Ролевая система (RBAC)', fitness1c: 'partial', fitness1cNote: '3-4 интерфейса (Тренер, Менеджер, РОП, Фитнес-бар)', myfitcrm: 'yes', myfitcrmNote: '6 ролей с гранулярными правами (@Roles decorator)' },
  { category: 'Персонал', feature: 'Рейтинг тренеров', fitness1c: 'partial', fitness1cNote: 'Отчёты по эффективности', myfitcrm: 'yes', myfitcrmNote: 'RatingPeriod: конверсии, trainings, sales, rank' },

  // --- Коммуникации ---
  { category: 'Коммуникации', feature: 'IP-телефония', fitness1c: 'yes', fitness1cNote: 'Интеграция с 50+ провайдерами (Mango, UIS)', myfitcrm: 'yes', myfitcrmNote: 'Встроенный SIP-клиент (RFC 3261, SRTP)' },
  { category: 'Коммуникации', feature: 'Мессенджеры (WA, TG)', fitness1c: 'yes', fitness1cNote: 'WA, TG, Viber, VK, MAX — единое окно', myfitcrm: 'planned', myfitcrmNote: 'Планируется (WhatsApp Business API / TG Bot)' },
  { category: 'Коммуникации', feature: 'Email-рассылки', fitness1c: 'yes', fitness1cNote: 'Встроенный почтовый клиент', myfitcrm: 'yes', myfitcrmNote: 'EmailTemplate (5 типов) + EmailLog + BullMQ' },
  { category: 'Коммуникации', feature: 'SMS-рассылки', fitness1c: 'yes', fitness1cNote: 'Встроенный модуль', myfitcrm: 'no', myfitcrmNote: 'Не реализовано' },
  { category: 'Коммуникации', feature: 'Push-уведомления', fitness1c: 'yes', fitness1cNote: 'Через мобильное приложение', myfitcrm: 'yes', myfitcrmNote: '9 типов + FCM/APNs + PushToken' },
  { category: 'Коммуникации', feature: 'Чат-боты', fitness1c: 'yes', fitness1cNote: 'Подключение к диалогам', myfitcrm: 'no', myfitcrmNote: 'Не реализовано' },

  // --- Интеграции ---
  { category: 'Интеграции', feature: 'Интеграция с 1С:Бухгалтерия', fitness1c: 'yes', fitness1cNote: 'Нативная (единая платформа)', myfitcrm: 'yes', myfitcrmNote: 'IntegrationConfig + SyncLog (REST/SOAP)' },
  { category: 'Интеграции', feature: 'REST API (открытый)', fitness1c: 'partial', fitness1cNote: 'API V.2 и V.3', myfitcrm: 'yes', myfitcrmNote: 'OpenAPI 3.1, 150+ эндпоинтов, API-ключи со scopes' },
  { category: 'Интеграции', feature: 'Webhooks (исходящие)', fitness1c: 'partial', fitness1cNote: 'Webhook-интеграция в CRM', myfitcrm: 'yes', myfitcrmNote: '15 типов событий + HMAC-SHA256 + retry' },
  { category: 'Интеграции', feature: 'СКУД', fitness1c: 'yes', fitness1cNote: 'КОРП: карта + палец + лицо', myfitcrm: 'planned', myfitcrmNote: 'Планируется' },

  // --- Платформа ---
  { category: 'Платформа', feature: 'Multi-tenancy (SaaS)', fitness1c: 'no', fitness1cNote: 'On-premise или облако (1 инстанс = 1 клуб)', myfitcrm: 'yes', myfitcrmNote: 'RLS + TenantStrategy + ProvisioningService' },
  { category: 'Платформа', feature: 'Суперадмин (управление клубами)', fitness1c: 'no', fitness1cNote: 'Нет платформенного уровня', myfitcrm: 'yes', myfitcrmNote: 'SUPER_ADMIN: clubs, licenses, monitoring, audit' },
  { category: 'Платформа', feature: 'Модульная лицензия', fitness1c: 'partial', fitness1cNote: 'ПРОФ/КОРП + доп. модули', myfitcrm: 'yes', myfitcrmNote: 'ClubModule: 12 модулей + @RequireModule guard' },
  { category: 'Платформа', feature: 'Usage metering (биллинг)', fitness1c: 'no', fitness1cNote: 'Фиксированная цена', myfitcrm: 'yes', myfitcrmNote: 'UsageRecord: users, clients, calls, webhooks, push' },
  { category: 'Платформа', feature: '2FA (TOTP)', fitness1c: 'no', fitness1cNote: 'Нет', myfitcrm: 'yes', myfitcrmNote: 'TOTP для суперадмина (Google Authenticator)' },
  { category: 'Платформа', feature: 'Audit log', fitness1c: 'partial', fitness1cNote: 'Журнал действий (базовый)', myfitcrm: 'yes', myfitcrmNote: 'AuditLog: action, entity, oldData, newData, IP' },
  { category: 'Платформа', feature: 'Темы оформления (10 дизайн-китов)', fitness1c: 'no', fitness1cNote: 'Фиксированный интерфейс 1С', myfitcrm: 'yes', myfitcrmNote: 'PlatformTheme + 10 тем + live preview' },

  // --- Отчёты ---
  { category: 'Отчёты', feature: 'Количество готовых отчётов', fitness1c: 'yes', fitness1cNote: '120+ готовых отчётов', myfitcrm: 'partial', myfitcrmNote: 'Report (генерация PDF), ~5-10 типов' },
  { category: 'Отчёты', feature: 'Конструктор отчётов', fitness1c: 'yes', fitness1cNote: 'Да (гибкий конструктор)', myfitcrm: 'no', myfitcrmNote: 'Не реализовано' },
  { category: 'Отчёты', feature: 'Дашборды', fitness1c: 'yes', fitness1cNote: 'Наглядные визуализации', myfitcrm: 'yes', myfitcrmNote: 'GET /stats/summary + веб-дашборды' },

  // --- Мобильное приложение ---
  { category: 'Mobile', feature: 'Приложение для тренера', fitness1c: 'partial', fitness1cNote: 'Отдельное приложение (базовый функционал)', myfitcrm: 'yes', myfitcrmNote: 'Полноценное: воронка, расписание, SIP, статистика' },
  { category: 'Mobile', feature: 'Приложение для клиента', fitness1c: 'yes', fitness1cNote: 'Полное: запись, оплата, расписание, push', myfitcrm: 'planned', myfitcrmNote: 'Планируется (клиентский портал)' },
  { category: 'Mobile', feature: 'Приложение для руководителя', fitness1c: 'yes', fitness1cNote: 'Мобильная аналитика', myfitcrm: 'partial', myfitcrmNote: 'Фитнес-менеджер в том же приложении' },
];

/* ═══════════════════════════════════════════════════════════════
   3. ДЕТАЛЬНОЕ СРАВНЕНИЕ СУЩНОСТЕЙ И ПОЛЕЙ
   ═══════════════════════════════════════════════════════════════ */

interface EntityComparison {
  entityName: string;
  fitness1cName: string;
  myfitcrmName: string;
  fitness1cFields: string[];
  myfitcrmFields: string[];
  differences: string[];
}

const entityComparisons: EntityComparison[] = [
  {
    entityName: 'Клиент',
    fitness1cName: 'Справочник «Клиенты»',
    myfitcrmName: 'Client (Prisma)',
    fitness1cFields: [
      'Код (уникальный идентификатор)',
      'ФИО (фамилия, имя, отчество)',
      'Дата рождения',
      'Пол',
      'Телефон (несколько номеров)',
      'Email',
      'Фотография',
      'Статус клиента (активный, замороженный, заблокированный)',
      'Номер карты (штрихкод / RFID)',
      'Теги / Метки',
      'Удостоверение личности (паспорт, данные)',
      'Адрес',
      'Корпоративный клиент (ссылка)',
      'Рекламный источник (UTM, канал привлечения)',
      'Дата регистрации',
      'Бонусный счёт (баланс)',
      'Депозитный счёт (баланс)',
      'Страховой полис',
      'Комментарии / заметки',
      'Договор (ссылка на бланк)',
      'Семейные связи (родитель ↔ ребёнок)',
      'Штрафы (история)',
      'Последнее посещение',
    ],
    myfitcrmFields: [
      'id (UUID)',
      'clubId (FK → Club)',
      'externalId (для синхронизации с 1С)',
      'firstName',
      'lastName',
      'patronymic',
      'phone',
      'email',
      'birthDate',
      'gender (MALE / FEMALE)',
      'avatarUrl',
      'notes',
      'source (источник привлечения)',
      'assignedTrainerId (FK → User)',
      'lastActivityAt',
      'createdAt / updatedAt',
    ],
    differences: [
      'У 1С значительно больше полей: карта, теги, удостоверения, адрес, корпоративный клиент, бонусы, депозит, страховка, штрафы, семья',
      'MyFitCRM: assignedTrainerId (назначенный тренер) — нет аналога в 1С напрямую',
      'MyFitCRM: externalId для двусторонней синхронизации',
      'MyFitCRM: lastActivityAt для автоматического определения «спящих»',
      'MyFitCRM: цели (ClientGoal) и травмы (ClientInjury) — отдельные сущности, у 1С нет',
      '1С: множество телефонов, у MyFitCRM — один',
      '1С: бонусная и депозитная системы встроены, у MyFitCRM — нет',
    ],
  },
  {
    entityName: 'Членство / Абонемент',
    fitness1cName: 'Документ «Членство», «Пакет услуг»',
    myfitcrmName: 'ClientMembership + ClientService',
    fitness1cFields: [
      'Клиент (ссылка)',
      'Вид членства (тип абонемента)',
      'Период действия (начало, конец)',
      'Статус (активен, заморожен, заблокирован, просрочен)',
      'Количество включённых посещений',
      'Использованные посещения',
      'Стоимость',
      'Оплачено / Остаток',
      'Заморозка (дата начала, окончания, причина)',
      'Пролонгация (автопродление)',
      'Смена владельца (новый клиент)',
      'Привязанные услуги',
      'Скидка',
      'Номер договора',
    ],
    myfitcrmFields: [
      'ClientMembership: id, clubId, clientId, name, startDate, endDate, isActive, externalId',
      'ClientService: id, clubId, clientId, serviceId, sessionsTotal, sessionsUsed, startsAt, expiresAt, status (ACTIVE/EXPIRED/CANCELLED/FROZEN)',
    ],
    differences: [
      '1С: единая сущность «Членство» с заморозкой, пролонгацией, сменой владельца',
      'MyFitCRM: разделено на ClientMembership (абонемент) и ClientService (пакет услуг)',
      'Нет у MyFitCRM: заморозка с датами и причиной, смена владельца, автопродление, скидки, привязка к договору',
      'MyFitCRM: status в ClientService (FROZEN есть), но нет механики заморозки',
      '1С: привязка к стоимости и оплате, у MyFitCRM оплата через Sale',
    ],
  },
  {
    entityName: 'Тренировка / Занятие',
    fitness1cName: 'Документ «Запись на занятие»',
    myfitcrmName: 'Training',
    fitness1cFields: [
      'Клиент (ссылка)',
      'Тренер / Инструктор',
      'Вид занятия (персональное / групповое)',
      'Дата и время',
      'Зал / Помещение',
      'Длительность',
      'Статус (запланировано, подтверждено, проведено, отменено, не явился)',
      'Количество участников (для групповых)',
      'Максимальная ёмкость',
      'Лист ожидания',
      'Секция / Цикл (серия занятий)',
      'Списание из пакета (автоматическое)',
      'Комментарий',
      'Причина отмены',
      'Стоимость',
    ],
    myfitcrmFields: [
      'id (UUID)',
      'clubId (FK → Club)',
      'trainerId (FK → User)',
      'clientId (FK → Client)',
      'serviceId (FK → Service)',
      'roomId (FK → Room)',
      'scheduledAt',
      'duration (минуты)',
      'status (7 значений: PLANNED, CONFIRMED, COMPLETED, PAID, NOT_PAID, NO_SHOW, CANCELLED)',
      'cancelReason (CLIENT_CANCEL, NO_DEDUCTION, SALE_RETURN, SICK)',
      'cancelComment',
      'isRepeating',
      'repeatParentId (для серий)',
    ],
    differences: [
      '1С: разделение на персональные и групповые, у MyFitCRM — единая модель',
      '1С: ёмкость и лист ожидания для групповых, у MyFitCRM — нет',
      '1С: секции и циклы занятий, у MyFitCRM — только repeatParentId',
      'MyFitCRM: больше статусов (7 vs ~5), включая PAID и NOT_PAID',
      'MyFitCRM: 4 причины отмены в enum vs свободный текст у 1С',
      '1С: автоматическое списание из пакета, у MyFitCRM — нужно вручную',
    ],
  },
  {
    entityName: 'Услуга / Номенклатура',
    fitness1cName: 'Справочник «Номенклатура»',
    myfitcrmName: 'Service + ServiceCategory + Package',
    fitness1cFields: [
      'Наименование',
      'Вид (услуга, товар, блюдо)',
      'Категория / Группа',
      'Цена продажи',
      'Себестоимость',
      'Единица измерения',
      'Штрихкод',
      'Артикул',
      'НДС ставка',
      'Описание',
      'Модификаторы (добавки, размеры)',
      'Технологическая карта (для блюд)',
      'Срок годности',
      'Остаток на складе',
      'Минимальный остаток',
      'Фото',
    ],
    myfitcrmFields: [
      'Service: id, clubId, name, description, price (Decimal), duration (мин), categoryId, isActive',
      'ServiceCategory: id, clubId, name, sortOrder',
      'Package: id, clubId, name, description, price, totalSessions, validDays, serviceId, isActive',
    ],
    differences: [
      '1С: «Номенклатура» — универсальная (услуги, товары, блюда в одном справочнике)',
      'MyFitCRM: разделено на Service (услуги) и Package (пакеты), товаров нет',
      '1С: штрихкод, артикул, НДС, себестоимость, единицы, модификаторы — полный товарный учёт',
      'MyFitCRM: только фитнес-услуги (name, price, duration) — проще, но уже',
      '1С: техкарты для блюд (ингредиенты, расчёт себестоимости)',
      'MyFitCRM: Package привязан к Service (1:1), у 1С — более гибкая система пакетов',
    ],
  },
  {
    entityName: 'Продажа',
    fitness1cName: 'Документ «Реализация»',
    myfitcrmName: 'Sale',
    fitness1cFields: [
      'Клиент',
      'Сотрудник (кто продал)',
      'Дата продажи',
      'Номенклатура (услуга / товар / пакет)',
      'Количество',
      'Цена за единицу',
      'Сумма',
      'Скидка (%, абсолютная)',
      'НДС',
      'Способ оплаты (наличные, карта, СБП, депозит, бонусы)',
      'Фискальный чек',
      'Возврат (полный, частичный)',
      'Рассрочка (график платежей)',
      'Статус оплаты',
      'Комментарий',
      'Подарочный сертификат (использован)',
    ],
    myfitcrmFields: [
      'id (UUID)',
      'clubId (FK → Club)',
      'trainerId (FK → User)',
      'clientId (FK → Client)',
      'packageId (FK → Package, optional)',
      'serviceId (FK → Service, optional)',
      'amount (Decimal)',
      'description',
      'status (PENDING, PAID, CANCELLED, REFUNDED)',
      'paidAt',
      'externalId',
    ],
    differences: [
      '1С: полноценный документ реализации (количество, цена за единицу, НДС, скидки)',
      'MyFitCRM: упрощённая модель (amount — итоговая сумма без разбивки)',
      '1С: множество способов оплаты, фискальные чеки, бонусы, депозит',
      'MyFitCRM: нет способа оплаты, нет чеков, нет скидок',
      '1С: частичные возвраты, у MyFitCRM — только полный REFUNDED',
      '1С: рассрочка с графиком, подарочные сертификаты',
      'MyFitCRM: externalId для синхронизации с 1С (уникальное преимущество)',
    ],
  },
  {
    entityName: 'Сотрудник',
    fitness1cName: 'Справочник «Сотрудники»',
    myfitcrmName: 'User',
    fitness1cFields: [
      'ФИО',
      'Должность',
      'Подразделение (структурная единица)',
      'Дата приёма / увольнения',
      'Телефон, email',
      'Фото',
      'Паспортные данные',
      'ИНН, СНИЛС',
      'Банковские реквизиты',
      'Оклад / ставка',
      'Тариф за выход',
      'Процент от услуг',
      'Премии',
      'Роль в системе (Тренер, Менеджер, РОП, Фитнес-бар)',
      'Доступ (интерфейс)',
      'SIP-аккаунт (через IP-телефонию)',
    ],
    myfitcrmFields: [
      'id (UUID)',
      'clubId (FK → Club)',
      'phone',
      'passwordHash',
      'firstName, lastName, patronymic',
      'role (TRAINER, COORDINATOR, MANAGER, RECEPTIONIST, CLUB_ADMIN, SUPER_ADMIN)',
      'departmentId (FK → Department)',
      'avatarUrl',
      'isActive',
      'totpSecret (2FA)',
    ],
    differences: [
      '1С: HR-данные (паспорт, ИНН, СНИЛС, банковские реквизиты, трудоустройство)',
      'MyFitCRM: нет HR-данных, только авторизационные и организационные поля',
      '1С: оклад, тариф, %, премии — система расчёта зарплат',
      'MyFitCRM: нет расчёта зарплат',
      'MyFitCRM: 6 ролей (vs 3-4 интерфейса у 1С) + координатор — уникальная роль',
      'MyFitCRM: 2FA (TOTP), у 1С — нет',
      'MyFitCRM: passwordHash (авторизация по телефону+пароль), у 1С — стандартная авторизация 1С',
    ],
  },
  {
    entityName: 'SIP / Телефония',
    fitness1cName: 'Интеграция с IP-АТС (50+ провайдеров)',
    myfitcrmName: 'SipConfig + SipAccount + SipCall',
    fitness1cFields: [
      'Провайдер (Mango, UIS и др.)',
      'Настройки подключения',
      'Журнал звонков',
      'Привязка звонка к клиенту',
      'Запись разговоров',
      'CallerID',
      'Статус звонка',
      'Длительность',
    ],
    myfitcrmFields: [
      'SipConfig: sipServer, sipPort, transport (UDP/TCP/TLS), realm, stunServer, turnServer, callerId, codecs',
      'SipAccount: sipUsername, sipPassword, displayName (per-user)',
      'SipCall: callerId, clientId, callerNumber, calleeNumber, direction, status (7 значений), startedAt, answeredAt, endedAt, duration',
    ],
    differences: [
      '1С: интеграция через внешних провайдеров (50+), не встроенный клиент',
      'MyFitCRM: встроенный SIP-клиент (RFC 3261, Opus, SRTP) — прямо в приложении',
      '1С: запись разговоров, у MyFitCRM — нет (ограничение v1)',
      'MyFitCRM: STUN/TURN для NAT, полный контроль кодеков',
      'MyFitCRM: per-user SIP-аккаунты, у 1С — общий аккаунт провайдера',
      'Оба: журнал звонков с привязкой к клиенту',
    ],
  },
  {
    entityName: 'Зал / Помещение',
    fitness1cName: 'Справочник «Помещения»',
    myfitcrmName: 'Room',
    fitness1cFields: [
      'Наименование',
      'Вместимость',
      'Тип (зал, бассейн, студия)',
      'Расписание доступности',
      'Привязка к филиалу',
      'Оборудование',
      'Стоимость аренды',
    ],
    myfitcrmFields: [
      'id (UUID)',
      'clubId (FK → Club)',
      'name',
      'capacity',
      'description',
      'isActive',
    ],
    differences: [
      '1С: тип помещения, оборудование, стоимость аренды, привязка к филиалу',
      'MyFitCRM: минимальная модель (имя, вместимость, описание)',
      '1С: расписание доступности зала, у MyFitCRM — нет (зал всегда доступен)',
      'Нет у MyFitCRM: бронирование залов, аренда, оборудование',
    ],
  },
  {
    entityName: 'Email-рассылки',
    fitness1cName: 'Модуль «Email-рассылки»',
    myfitcrmName: 'EmailTemplate + EmailLog',
    fitness1cFields: [
      'Шаблоны писем',
      'Список рассылки (сегментация)',
      'Статус отправки',
      'Текст письма (HTML)',
      'Вложения',
      'Трекинг (базовый)',
    ],
    myfitcrmFields: [
      'EmailTemplate: type (5 типов), subject (Handlebars), bodyHtml (MJML), bodyText, variables, isActive',
      'EmailLog: recipientEmail, clientId, type, status (7 значений), providerMessageId, sentAt, deliveredAt, openedAt, clickedAt, errorMessage',
    ],
    differences: [
      'MyFitCRM: продвинутый трекинг (delivered, opened, clicked, bounced, failed)',
      'MyFitCRM: Handlebars/MJML шаблонизация с переменными',
      'MyFitCRM: поддержка нескольких провайдеров (SMTP, SendGrid, Mailgun, Unisender)',
      '1С: более простой email-модуль, но с вложениями',
      'MyFitCRM: BullMQ-очередь для batch-отправки',
      'Нет у MyFitCRM: кампании и сегментация аудитории (в EmailCampaign — planned)',
    ],
  },
  {
    entityName: 'Финансовые операции',
    fitness1cName: 'Документы: Касса, Банк, Депозит',
    myfitcrmName: '(Нет отдельной сущности)',
    fitness1cFields: [
      'Приходный кассовый ордер',
      'Расходный кассовый ордер',
      'Перемещение денежных средств',
      'Банковская выписка',
      'Лицевой счёт клиента (депозит)',
      'Взаиморасчёты',
      'Фискальный чек (54-ФЗ)',
      'Инкассация',
      'Ежедневный отчёт кассира',
    ],
    myfitcrmFields: [
      'Нет отдельных финансовых сущностей',
      'Sale.status = PAID / REFUNDED — единственный финансовый учёт',
      'Sale.amount — сумма без разбивки на способы оплаты',
    ],
    differences: [
      '1С: полноценный финансовый модуль (касса, банк, депозиты, 54-ФЗ)',
      'MyFitCRM: финансы ограничены сущностью Sale (сумма + статус)',
      'Критичный GAP: нет кассовых операций, фискализации, депозитов',
      '1С: соответствие 54-ФЗ «из коробки»',
    ],
  },
];

/* ═══════════════════════════════════════════════════════════════
   4. СТАТИСТИКА И ВЫВОДЫ
   ═══════════════════════════════════════════════════════════════ */

interface StatCard {
  label: string;
  fitness1c: string;
  myfitcrm: string;
  winner: '1c' | 'myfitcrm' | 'tie';
}

const stats: StatCard[] = [
  { label: 'Модели данных / Сущности', fitness1c: '60+', myfitcrm: '37', winner: '1c' },
  { label: 'API-эндпоинты', fitness1c: '~50 (API V.3)', myfitcrm: '150+', winner: 'myfitcrm' },
  { label: 'Готовые отчёты', fitness1c: '120+', myfitcrm: '~10', winner: '1c' },
  { label: 'Роли пользователей', fitness1c: '3-4 интерфейса', myfitcrm: '6 ролей (RBAC)', winner: 'myfitcrm' },
  { label: 'Webhook-события', fitness1c: '~5', myfitcrm: '15', winner: 'myfitcrm' },
  { label: 'Интеграции (готовые)', fitness1c: '100+', myfitcrm: '~5', winner: '1c' },
  { label: 'Способы оплаты', fitness1c: '10+', myfitcrm: '0 (planned)', winner: '1c' },
  { label: 'Email-трекинг', fitness1c: 'Базовый', myfitcrm: '7 статусов', winner: 'myfitcrm' },
  { label: 'Multi-tenancy', fitness1c: 'Нет', myfitcrm: 'RLS + Strategy', winner: 'myfitcrm' },
  { label: 'SIP-телефония', fitness1c: 'Внешняя (50+)', myfitcrm: 'Встроенная (RFC 3261)', winner: 'myfitcrm' },
  { label: 'Мессенджеры', fitness1c: '5 (WA, TG, VK, Viber, MAX)', myfitcrm: '0 (planned)', winner: '1c' },
  { label: 'Лет на рынке', fitness1c: '16+ (с 2005)', myfitcrm: 'Запуск', winner: '1c' },
];

/* ═══════════════════════════════════════════════════════════════
   HELPERS
   ═══════════════════════════════════════════════════════════════ */

function StatusBadge({ status }: { status: Status }) {
  switch (status) {
    case 'yes': return <span className="inline-flex items-center gap-1 text-xs font-medium text-green-700 bg-green-50 px-2 py-0.5 rounded-full"><CheckCircle2 className="h-3 w-3" /> Есть</span>;
    case 'no': return <span className="inline-flex items-center gap-1 text-xs font-medium text-red-600 bg-red-50 px-2 py-0.5 rounded-full"><XCircle className="h-3 w-3" /> Нет</span>;
    case 'partial': return <span className="inline-flex items-center gap-1 text-xs font-medium text-yellow-700 bg-yellow-50 px-2 py-0.5 rounded-full"><AlertTriangle className="h-3 w-3" /> Частично</span>;
    case 'planned': return <span className="inline-flex items-center gap-1 text-xs font-medium text-blue-700 bg-blue-50 px-2 py-0.5 rounded-full"><ClockIcon className="h-3 w-3" /> Планируется</span>;
  }
}

function ClockIcon(props: { className?: string }) {
  return (
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth={2} strokeLinecap="round" strokeLinejoin="round" className={props.className}>
      <circle cx="12" cy="12" r="10" /><polyline points="12 6 12 12 16 14" />
    </svg>
  );
}

const moduleIcons: Record<string, React.ComponentType<{ className?: string }>> = {
  users: Users,
  target: Target,
  calendar: Calendar,
  'credit-card': CreditCard,
  building: Building2,
  package: Package,
  star: Star,
  'bar-chart': BarChart3,
  smartphone: Phone,
  shield: Shield,
  layers: Layers,
  message: Mail,
};

/* ═══════════════════════════════════════════════════════════════
   COMPONENT
   ═══════════════════════════════════════════════════════════════ */

export default function Competitor1CFitnessDocument() {
  const router = useRouter();
  const contentRef = useRef<HTMLDivElement>(null);

  const handleDownloadPdf = async () => {
    const el = contentRef.current;
    if (!el) return;
    const html2canvas = (await import('html2canvas-pro')).default;
    const { jsPDF } = await import('jspdf');
    const canvas = await html2canvas(el, { scale: 2, useCORS: true });
    const imgData = canvas.toDataURL('image/png');
    const pdf = new jsPDF('p', 'mm', 'a4');
    const pdfW = pdf.internal.pageSize.getWidth();
    const pdfH = pdf.internal.pageSize.getHeight();
    const imgW = pdfW - 16;
    const imgH = (canvas.height * imgW) / canvas.width;
    let y = 8;
    let page = 0;
    while (y < imgH + 8) {
      if (page > 0) pdf.addPage();
      pdf.addImage(imgData, 'PNG', 8, 8 - y + 8 * (page === 0 ? 0 : 1), imgW, imgH);
      y += pdfH - 16;
      page++;
    }
    pdf.save('1c-fitness-vs-myfitcrm.pdf');
  };

  const handleDownloadExcel = async () => {
    const XLSX = await import('xlsx');
    const wb = XLSX.utils.book_new();

    // Sheet 1: comparison table
    const compData = comparisonData.map((r) => ({
      'Категория': r.category,
      'Функция': r.feature,
      '1С:Фитнес клуб': r.fitness1c === 'yes' ? 'Есть' : r.fitness1c === 'partial' ? 'Частично' : r.fitness1c === 'planned' ? 'План' : 'Нет',
      '1С Примечание': r.fitness1cNote,
      'MyFitCRM': r.myfitcrm === 'yes' ? 'Есть' : r.myfitcrm === 'partial' ? 'Частично' : r.myfitcrm === 'planned' ? 'План' : 'Нет',
      'MyFitCRM Примечание': r.myfitcrmNote,
    }));
    const ws1 = XLSX.utils.json_to_sheet(compData);
    ws1['!cols'] = [{ wch: 16 }, { wch: 35 }, { wch: 12 }, { wch: 50 }, { wch: 12 }, { wch: 50 }];
    XLSX.utils.book_append_sheet(wb, ws1, 'Сравнение функций');

    // Sheet 2: entity fields
    const entityData = entityComparisons.flatMap((e) => {
      const maxLen = Math.max(e.fitness1cFields.length, e.myfitcrmFields.length, e.differences.length);
      return Array.from({ length: maxLen }, (_, i) => ({
        'Сущность': i === 0 ? e.entityName : '',
        '1С Название': i === 0 ? e.fitness1cName : '',
        'MyFitCRM Название': i === 0 ? e.myfitcrmName : '',
        '1С Поля': e.fitness1cFields[i] ?? '',
        'MyFitCRM Поля': e.myfitcrmFields[i] ?? '',
        'Различия': e.differences[i] ?? '',
      }));
    });
    const ws2 = XLSX.utils.json_to_sheet(entityData);
    ws2['!cols'] = [{ wch: 20 }, { wch: 30 }, { wch: 30 }, { wch: 45 }, { wch: 45 }, { wch: 60 }];
    XLSX.utils.book_append_sheet(wb, ws2, 'Сущности и поля');

    // Sheet 3: stats
    const statsData = stats.map((s) => ({
      'Метрика': s.label,
      '1С:Фитнес клуб': s.fitness1c,
      'MyFitCRM': s.myfitcrm,
      'Лидер': s.winner === '1c' ? '1С' : s.winner === 'myfitcrm' ? 'MyFitCRM' : 'Равны',
    }));
    const ws3 = XLSX.utils.json_to_sheet(statsData);
    ws3['!cols'] = [{ wch: 30 }, { wch: 25 }, { wch: 25 }, { wch: 12 }];
    XLSX.utils.book_append_sheet(wb, ws3, 'Статистика');

    // Sheet 4: 1C features list
    const featData = fitnessTestModules.flatMap((m) =>
      m.features.map((f) => ({ 'Модуль': m.module, 'Функция': f })),
    );
    const ws4 = XLSX.utils.json_to_sheet(featData);
    ws4['!cols'] = [{ wch: 30 }, { wch: 60 }];
    XLSX.utils.book_append_sheet(wb, ws4, 'Функционал 1С');

    XLSX.writeFile(wb, '1c-fitness-vs-myfitcrm.xlsx');
  };

  // Group comparison by category
  const categories = [...new Set(comparisonData.map((r) => r.category))];

  return (
    <div>
      <button
        onClick={() => router.push('/documents')}
        className="flex items-center gap-2 text-sm text-muted hover:text-gray-900 mb-6 transition-colors"
      >
        <ArrowLeft className="h-4 w-4" />
        Все документы
      </button>

      <div ref={contentRef} className="bg-card rounded-xl shadow-sm border border-border overflow-hidden">
        {/* ── Header ── */}
        <div className="px-8 py-6 border-b border-border">
          <div className="flex items-start justify-between">
            <div className="flex items-center gap-3">
              <div className="bg-blue-50 p-2.5 rounded-lg">
                <Database className="h-6 w-6 text-blue-600" />
              </div>
              <div>
                <h1 className="text-xl font-bold text-gray-900">
                  1С:Фитнес клуб vs MyFitCRM — детальное сравнение
                </h1>
                <p className="text-sm text-muted mt-1">
                  Дата: {LAST_UPDATE} | {comparisonData.length} функций | {entityComparisons.length} сущностей | {fitnessTestModules.reduce((s, m) => s + m.features.length, 0)} функций 1С
                </p>
              </div>
            </div>
            <div className="flex gap-2 print:hidden">
              <button
                onClick={() => void handleDownloadPdf()}
                className="flex items-center gap-2 border border-border bg-card text-gray-700 px-4 py-2 rounded-xl text-sm font-medium hover:bg-background transition-colors"
              >
                <FileDown className="h-4 w-4" />
                PDF
              </button>
              <button
                onClick={() => void handleDownloadExcel()}
                className="flex items-center gap-2 border border-border bg-card text-gray-700 px-4 py-2 rounded-xl text-sm font-medium hover:bg-background transition-colors"
              >
                <Table2 className="h-4 w-4" />
                Excel
              </button>
              <button
                onClick={() => window.print()}
                className="flex items-center gap-2 border border-border bg-card text-gray-700 px-4 py-2 rounded-xl text-sm font-medium hover:bg-background transition-colors"
              >
                <Printer className="h-4 w-4" />
                Печать
              </button>
            </div>
          </div>
        </div>

        <div className="px-8 py-6 space-y-10">

          {/* ══════ SECTION 1: 1C Features ══════ */}
          <div>
            <h2 className="text-lg font-semibold text-gray-900 mb-4 flex items-center gap-2">
              <Layers className="h-5 w-5 text-indigo-600" />
              Полный функционал 1С:Фитнес клуб (FitnessTest)
            </h2>
            <p className="text-sm text-muted mb-4">
              Демо-стенд: <a href="https://fitnesstest.work-in.cloud/FitnessTest/ru/" target="_blank" rel="noopener noreferrer" className="text-blue-600 underline">fitnesstest.work-in.cloud</a> | Сайт: <a href="https://www.fitness1c.ru" target="_blank" rel="noopener noreferrer" className="text-blue-600 underline">fitness1c.ru</a> | Версии: ПРОФ (57 000 ₽) и КОРП (90 000+ ₽)
            </p>
            <div className="grid grid-cols-2 gap-4">
              {fitnessTestModules.map((m) => {
                const Icon = moduleIcons[m.icon] ?? Layers;
                return (
                  <div key={m.module} className="border border-border rounded-xl p-4">
                    <div className="flex items-center gap-2 mb-3">
                      <div className="bg-gray-50 p-1.5 rounded-lg">
                        <Icon className="h-4 w-4 text-gray-600" />
                      </div>
                      <h3 className="text-sm font-bold text-gray-900">{m.module}</h3>
                      <span className="text-[10px] text-muted bg-gray-100 px-1.5 py-0.5 rounded-full">{m.features.length}</span>
                    </div>
                    <ul className="space-y-1">
                      {m.features.map((f, i) => (
                        <li key={i} className="text-xs text-gray-600 flex items-start gap-1.5">
                          <span className="text-gray-400 mt-0.5 shrink-0">-</span>
                          {f}
                        </li>
                      ))}
                    </ul>
                  </div>
                );
              })}
            </div>
          </div>

          {/* ══════ SECTION 2: Quick Stats ══════ */}
          <div>
            <h2 className="text-lg font-semibold text-gray-900 mb-4 flex items-center gap-2">
              <BarChart3 className="h-5 w-5 text-purple-600" />
              Сравнение в цифрах
            </h2>
            <div className="overflow-x-auto">
              <table className="w-full text-sm border-collapse">
                <thead>
                  <tr className="bg-gray-50">
                    <th className="text-left px-4 py-2.5 font-medium text-muted border border-border">Метрика</th>
                    <th className="text-center px-4 py-2.5 font-medium text-muted border border-border w-36">1С:Фитнес клуб</th>
                    <th className="text-center px-4 py-2.5 font-medium text-primary border border-border bg-orange-50/50 w-36">MyFitCRM</th>
                    <th className="text-center px-4 py-2.5 font-medium text-muted border border-border w-24">Лидер</th>
                  </tr>
                </thead>
                <tbody>
                  {stats.map((s, i) => (
                    <tr key={i} className="hover:bg-gray-50/50">
                      <td className="px-4 py-2 border border-border text-gray-900">{s.label}</td>
                      <td className={cn('px-4 py-2 border border-border text-center font-medium', s.winner === '1c' ? 'text-green-700 bg-green-50/50' : 'text-gray-600')}>{s.fitness1c}</td>
                      <td className={cn('px-4 py-2 border border-border text-center font-medium', s.winner === 'myfitcrm' ? 'text-green-700 bg-green-50/50' : 'text-gray-600')}>{s.myfitcrm}</td>
                      <td className="px-4 py-2 border border-border text-center">
                        {s.winner === '1c' && <span className="text-xs font-medium text-gray-500 bg-gray-100 px-2 py-0.5 rounded-full">1С</span>}
                        {s.winner === 'myfitcrm' && <span className="text-xs font-medium text-primary bg-orange-50 px-2 py-0.5 rounded-full">MyFitCRM</span>}
                        {s.winner === 'tie' && <span className="text-xs font-medium text-gray-400">-</span>}
                      </td>
                    </tr>
                  ))}
                </tbody>
              </table>
            </div>
          </div>

          {/* ══════ SECTION 3: Feature Comparison ══════ */}
          <div>
            <h2 className="text-lg font-semibold text-gray-900 mb-4 flex items-center gap-2">
              <Table2 className="h-5 w-5 text-blue-600" />
              Сравнительная таблица функционала
            </h2>
            <div className="overflow-x-auto">
              <table className="w-full text-sm border-collapse">
                <thead>
                  <tr className="bg-gray-50">
                    <th className="text-left px-3 py-2.5 font-medium text-muted border border-border w-28">Категория</th>
                    <th className="text-left px-3 py-2.5 font-medium text-muted border border-border">Функция</th>
                    <th className="text-center px-3 py-2.5 font-medium text-muted border border-border w-20">1С</th>
                    <th className="text-left px-3 py-2.5 font-medium text-muted border border-border w-64">1С: детали</th>
                    <th className="text-center px-3 py-2.5 font-bold text-primary border border-border bg-orange-50/50 w-20">My</th>
                    <th className="text-left px-3 py-2.5 font-medium text-muted border border-border w-64">MyFitCRM: детали</th>
                  </tr>
                </thead>
                <tbody>
                  {categories.map((cat) => {
                    const rows = comparisonData.filter((r) => r.category === cat);
                    return rows.map((row, i) => (
                      <tr key={`${cat}-${i}`} className="hover:bg-gray-50/30">
                        {i === 0 && (
                          <td
                            className="px-3 py-2 border border-border font-semibold text-gray-900 bg-gray-50/50 align-top"
                            rowSpan={rows.length}
                          >
                            {cat}
                          </td>
                        )}
                        <td className="px-3 py-2 border border-border text-gray-800 font-medium">{row.feature}</td>
                        <td className="px-3 py-1.5 border border-border text-center"><StatusBadge status={row.fitness1c} /></td>
                        <td className="px-3 py-2 border border-border text-xs text-gray-500">{row.fitness1cNote}</td>
                        <td className="px-3 py-1.5 border border-border text-center bg-orange-50/20"><StatusBadge status={row.myfitcrm} /></td>
                        <td className="px-3 py-2 border border-border text-xs text-gray-500">{row.myfitcrmNote}</td>
                      </tr>
                    ));
                  })}
                </tbody>
              </table>
            </div>
          </div>

          {/* ══════ SECTION 4: Entity Comparison ══════ */}
          <div>
            <h2 className="text-lg font-semibold text-gray-900 mb-4 flex items-center gap-2">
              <Database className="h-5 w-5 text-green-600" />
              Детальное сравнение сущностей и полей
            </h2>
            <div className="space-y-6">
              {entityComparisons.map((entity) => (
                <div key={entity.entityName} className="border border-border rounded-xl overflow-hidden">
                  <div className="bg-gray-50 px-5 py-3 flex items-center justify-between">
                    <h3 className="text-sm font-bold text-gray-900">{entity.entityName}</h3>
                    <div className="flex items-center gap-4 text-xs text-muted">
                      <span>1С: <strong className="text-gray-700">{entity.fitness1cName}</strong></span>
                      <span className="text-gray-300">|</span>
                      <span>MyFitCRM: <strong className="text-primary">{entity.myfitcrmName}</strong></span>
                    </div>
                  </div>
                  <div className="grid grid-cols-3 divide-x divide-border">
                    {/* 1C Fields */}
                    <div className="p-4">
                      <h4 className="text-xs font-semibold text-muted uppercase tracking-wider mb-2">
                        Поля 1С:Фитнес клуб ({entity.fitness1cFields.length})
                      </h4>
                      <ul className="space-y-1">
                        {entity.fitness1cFields.map((f, i) => (
                          <li key={i} className="text-xs text-gray-600 flex items-start gap-1.5">
                            <span className="text-gray-400 mt-0.5 shrink-0">-</span>
                            {f}
                          </li>
                        ))}
                      </ul>
                    </div>

                    {/* MyFitCRM Fields */}
                    <div className="p-4">
                      <h4 className="text-xs font-semibold text-primary uppercase tracking-wider mb-2">
                        Поля MyFitCRM ({entity.myfitcrmFields.length})
                      </h4>
                      <ul className="space-y-1">
                        {entity.myfitcrmFields.map((f, i) => (
                          <li key={i} className="text-xs text-gray-600 flex items-start gap-1.5">
                            <span className="text-primary/50 mt-0.5 shrink-0">-</span>
                            <code className="text-xs">{f}</code>
                          </li>
                        ))}
                      </ul>
                    </div>

                    {/* Differences */}
                    <div className="p-4 bg-yellow-50/30">
                      <h4 className="text-xs font-semibold text-yellow-700 uppercase tracking-wider mb-2">
                        Ключевые различия ({entity.differences.length})
                      </h4>
                      <ul className="space-y-1.5">
                        {entity.differences.map((d, i) => (
                          <li key={i} className="text-xs text-gray-700 flex items-start gap-1.5">
                            <GitBranch className="h-3 w-3 text-yellow-600 shrink-0 mt-0.5" />
                            {d}
                          </li>
                        ))}
                      </ul>
                    </div>
                  </div>
                </div>
              ))}
            </div>
          </div>

          {/* ══════ SECTION 5: What MyFitCRM Has That 1C Doesn't ══════ */}
          <div>
            <h2 className="text-lg font-semibold text-gray-900 mb-4 flex items-center gap-2">
              <Zap className="h-5 w-5 text-orange-500" />
              Что есть у MyFitCRM, но нет у 1С:Фитнес клуб
            </h2>
            <div className="grid grid-cols-2 gap-4">
              {[
                { title: 'Встроенный SIP-клиент', desc: 'RFC 3261, Opus/G.711, SRTP, STUN/TURN — прямо в мобильном приложении. 1С использует внешних провайдеров.', icon: Phone },
                { title: 'Multi-tenancy (SaaS)', desc: 'PostgreSQL RLS, TenantStrategy, ProvisioningService — единая платформа для всех клубов. 1С = отдельный инстанс.', icon: Globe },
                { title: '6-ролевая RBAC', desc: 'Тренер, Координатор, ФМ, Рецепция, Админ клуба, Суперадмин с гранулярными правами. 1С: 3-4 интерфейса.', icon: Shield },
                { title: 'Координатор (роль)', desc: 'Выделенная роль для распределения клиентов по тренерам и департаментам. В 1С нет аналога.', icon: Users },
                { title: 'Webhooks API (15 событий)', desc: 'HMAC-SHA256, retry (3 попытки), журнал доставки. 1С: базовая webhook-интеграция.', icon: Layers },
                { title: 'Цели и травмы клиента', desc: 'ClientGoal, ClientInjury — отдельные сущности для тренерского учёта. Нет аналога в 1С.', icon: Target },
                { title: '2FA (TOTP) для суперадмина', desc: 'Google Authenticator, обязательная для суперадмина. 1С: нет двухфакторной авторизации.', icon: Shield },
                { title: '10 дизайн-тем', desc: 'PlatformTheme: 10 тем с live preview, CSS-переменные, динамические шрифты. 1С: фиксированный интерфейс.', icon: Star },
                { title: 'Usage Metering', desc: 'UsageRecord: подсчёт ресурсов (users, clients, calls, webhooks, push, API) для биллинга. 1С: фиксированная цена.', icon: BarChart3 },
                { title: 'Спящие клиенты (автодетект)', desc: 'GET /clients/sleeping — автоматический расчёт (>30 дней без активности). 1С: только ручные отчёты.', icon: TrendingDown },
              ].map((item) => (
                <div key={item.title} className="bg-gradient-to-br from-orange-50/80 to-white border border-orange-200 rounded-xl p-4">
                  <div className="flex items-center gap-2 mb-2">
                    <div className="bg-primary/10 p-1.5 rounded-lg">
                      <item.icon className="h-4 w-4 text-primary" />
                    </div>
                    <h4 className="text-sm font-bold text-gray-900">{item.title}</h4>
                  </div>
                  <p className="text-xs text-gray-600 leading-relaxed">{item.desc}</p>
                </div>
              ))}
            </div>
          </div>

          {/* ══════ SECTION 6: What 1C Has That We Don't ══════ */}
          <div>
            <h2 className="text-lg font-semibold text-gray-900 mb-4 flex items-center gap-2">
              <AlertTriangle className="h-5 w-5 text-red-500" />
              Что есть у 1С:Фитнес клуб, но нет у MyFitCRM (GAP)
            </h2>
            <table className="w-full text-sm border-collapse">
              <thead>
                <tr className="bg-red-50/50">
                  <th className="text-left px-4 py-2.5 font-medium text-red-900 border border-border">Функция</th>
                  <th className="text-center px-4 py-2.5 font-medium text-red-900 border border-border w-24">Приоритет</th>
                  <th className="text-left px-4 py-2.5 font-medium text-red-900 border border-border">Комментарий</th>
                </tr>
              </thead>
              <tbody>
                {[
                  { feature: 'Онлайн-оплата (ЮKassa, СБП, CloudPayments)', priority: 'critical' as const, comment: 'Без этого клубы не могут монетизировать. 1С: 10+ способов оплаты.' },
                  { feature: 'Расчёт зарплат тренеров', priority: 'critical' as const, comment: '1С: оклад, тариф, %, премии. Базовое ожидание HR.' },
                  { feature: 'Учёт товаров на складе', priority: 'high' as const, comment: '1С: FIFO, инвентаризация, ТОРГ-29, себестоимость. Важно для клубов с баром/магазином.' },
                  { feature: 'СКУД (турникеты)', priority: 'high' as const, comment: '1С КОРП: карта + палец + лицо. Ключевой запрос средних/крупных клубов.' },
                  { feature: 'Программа лояльности (бонусы, скидки)', priority: 'high' as const, comment: '1С: дисконтные карты, промокоды, реферальная программа. +25% удержание.' },
                  { feature: 'Групповые занятия (отдельный тип)', priority: 'high' as const, comment: '1С: расписание групповых с ёмкостью и листами ожидания. У нас один тип Training.' },
                  { feature: 'Мессенджеры (WA, TG, Viber, VK)', priority: 'high' as const, comment: '1С: 5 мессенджеров, единое окно, чат-боты. У нас — planned.' },
                  { feature: 'SMS-рассылки', priority: 'medium' as const, comment: '1С: встроенный модуль. У нас — нет.' },
                  { feature: 'Корпоративные клиенты', priority: 'medium' as const, comment: '1С: отдельная сущность с договорами. У нас — нет.' },
                  { feature: 'Семейные аккаунты', priority: 'medium' as const, comment: '1С: связи между клиентами. У нас — нет.' },
                  { feature: 'Пластиковые карты / RFID', priority: 'medium' as const, comment: '1С: штрихкод, магнитные, бесконтактные. У нас — нет.' },
                  { feature: 'Конструктор отчётов', priority: 'medium' as const, comment: '1С: гибкий конструктор + 120 готовых. У нас — ~10 отчётов, без конструктора.' },
                  { feature: 'Приложение для клиентов', priority: 'medium' as const, comment: '1С: полноценное приложение (запись, оплата, расписание). У нас — planned.' },
                  { feature: 'Фитнес-бар (техкарты блюд)', priority: 'low' as const, comment: '1С: рецепты, себестоимость, продажа. Нишевая функция.' },
                  { feature: 'Рекуррентные платежи', priority: 'high' as const, comment: '1С: автосписание. Тренд рынка.' },
                  { feature: 'Подарочные сертификаты', priority: 'medium' as const, comment: '1С: электронные + физические. Канал продаж.' },
                  { feature: 'Рассрочка / кредитные договоры', priority: 'low' as const, comment: '1С: Яндекс Сплит, внутренняя рассрочка.' },
                  { feature: 'Онлайн-запись клиентов (виджет)', priority: 'high' as const, comment: '1С: виджет на сайт + Яндекс.Карты + 2ГИС. У нас — нет.' },
                  { feature: 'Аренда шкафчиков', priority: 'low' as const, comment: '1С: учёт аренды ячеек. Нишевая.' },
                ].map((item, i) => {
                  const colors = {
                    critical: { bg: 'bg-red-50', text: 'text-red-700', border: 'border-red-200', label: 'Крит.' },
                    high: { bg: 'bg-orange-50', text: 'text-orange-700', border: 'border-orange-200', label: 'Выс.' },
                    medium: { bg: 'bg-blue-50', text: 'text-blue-700', border: 'border-blue-200', label: 'Сред.' },
                    low: { bg: 'bg-gray-50', text: 'text-gray-600', border: 'border-gray-200', label: 'Низ.' },
                  };
                  const c = colors[item.priority];
                  return (
                    <tr key={i} className="hover:bg-gray-50/50">
                      <td className="px-4 py-2 border border-border text-gray-900 font-medium">{item.feature}</td>
                      <td className="px-4 py-2 border border-border text-center">
                        <span className={cn('text-[10px] font-semibold px-2 py-0.5 rounded-full border', c.bg, c.text, c.border)}>{c.label}</span>
                      </td>
                      <td className="px-4 py-2 border border-border text-xs text-gray-600">{item.comment}</td>
                    </tr>
                  );
                })}
              </tbody>
            </table>
          </div>

          {/* ══════ SECTION 7: Conclusions ══════ */}
          <div>
            <h2 className="text-lg font-semibold text-gray-900 mb-4 flex items-center gap-2">
              <Lightbulb className="h-5 w-5 text-yellow-500" />
              Выводы и стратегия
            </h2>
            <div className="space-y-4">
              <div className="bg-blue-50 border border-blue-200 rounded-xl p-5">
                <h3 className="text-sm font-bold text-blue-900 mb-2">Позиционирование vs 1С:Фитнес клуб</h3>
                <p className="text-sm text-blue-800 leading-relaxed">
                  <strong>1С:Фитнес клуб</strong> — безусловный лидер рынка РФ (16+ лет, 6000+ клиентов, 120+ отчётов). Однако это <strong>legacy-система</strong> с устаревшим интерфейсом, высокой ценой и сложностью. MyFitCRM не конкурирует напрямую — мы занимаем нишу <strong>«облачный SaaS нового поколения»</strong> с фокусом на тренера и современный UX.
                </p>
              </div>

              <div className="grid grid-cols-2 gap-4">
                <div className="bg-green-50 border border-green-200 rounded-xl p-5">
                  <h3 className="text-sm font-bold text-green-900 mb-2 flex items-center gap-1">
                    <TrendingUp className="h-4 w-4" />
                    Наши преимущества (10 пунктов)
                  </h3>
                  <ul className="space-y-1.5">
                    {[
                      'Встроенный SIP (единственный на рынке)',
                      'Multi-tenancy SaaS (единая платформа)',
                      '6 ролей + координатор',
                      'Webhooks 15 событий + HMAC-SHA256',
                      'REST API 150+ эндпоинтов',
                      '2FA (TOTP)',
                      'Цели и травмы клиента',
                      '10 дизайн-тем',
                      'Usage metering / модульная лицензия',
                      'Автодетект спящих клиентов',
                    ].map((s, i) => (
                      <li key={i} className="text-xs text-green-800 flex items-start gap-1.5">
                        <CheckCircle2 className="h-3.5 w-3.5 text-green-600 shrink-0 mt-0.5" />{s}
                      </li>
                    ))}
                  </ul>
                </div>
                <div className="bg-red-50 border border-red-200 rounded-xl p-5">
                  <h3 className="text-sm font-bold text-red-900 mb-2 flex items-center gap-1">
                    <TrendingDown className="h-4 w-4" />
                    Нам нужно добавить (топ-5 критичных)
                  </h3>
                  <ul className="space-y-1.5">
                    {[
                      'Онлайн-оплата и эквайринг',
                      'Расчёт зарплат тренеров',
                      'Групповые занятия с ёмкостью',
                      'Онлайн-запись клиентов (виджет)',
                      'Мессенджеры (WA, TG)',
                    ].map((s, i) => (
                      <li key={i} className="text-xs text-red-800 flex items-start gap-1.5">
                        <AlertTriangle className="h-3.5 w-3.5 text-red-500 shrink-0 mt-0.5" />{s}
                      </li>
                    ))}
                  </ul>
                  <p className="text-[10px] text-red-600 mt-3">Без этих 5 функций клубы не смогут полноценно мигрировать с 1С</p>
                </div>
              </div>

              <div className="bg-gradient-to-r from-gray-900 to-gray-800 rounded-xl p-5 text-white">
                <h3 className="text-sm font-bold mb-3">Итоговый вердикт</h3>
                <div className="grid grid-cols-3 gap-4 text-sm text-gray-300">
                  <div>
                    <p className="font-semibold text-white mb-1">1С сильнее в:</p>
                    <p className="text-xs">Финансы, склад, отчёты (120+), оплата, СКУД, интеграции (100+), мессенджеры, клиентское приложение, зарплаты</p>
                  </div>
                  <div>
                    <p className="font-semibold text-orange-400 mb-1">MyFitCRM сильнее в:</p>
                    <p className="text-xs">Архитектура (SaaS, multi-tenancy), API (150+), SIP, RBAC (6 ролей), webhooks, 2FA, темы, metering, UX, trainer-first</p>
                  </div>
                  <div>
                    <p className="font-semibold text-blue-400 mb-1">Стратегия:</p>
                    <p className="text-xs">Не заменяем 1С — дополняем. Клубы на 1С могут использовать MyFitCRM как мобильный фронтенд через двустороннюю синхронизацию. Новые клубы — полностью на MyFitCRM.</p>
                  </div>
                </div>
              </div>
            </div>
          </div>

        </div>
      </div>
    </div>
  );
}
