import 'package:flutter/widgets.dart';
import 'package:lucide_icons_flutter/lucide_icons.dart' as lucide;

import '../permissions/permission_resources.dart';

/// 사이드바/내비게이션용 페이지 정보.
class AppPageDescriptor {
  const AppPageDescriptor({
    required this.path,
    required this.label,
    required this.icon,
    required this.summary,
    this.extraRequiredResources = const [],
  });

  final String path;
  final String label;
  final IconData icon;
  final String summary;
  final List<String> extraRequiredResources;
}

/// 메뉴 섹션을 나타내는 데이터 클래스.
class AppSectionDescriptor {
  const AppSectionDescriptor({required this.label, required this.pages});

  final String label;
  final List<AppPageDescriptor> pages;
}

/// 로그인 라우트 경로.
const loginRoutePath = '/login';

/// 대시보드 라우트 경로.
const dashboardRoutePath = '/dashboard';

/// 재고 현황 라우트 경로.
const inventorySummaryRoutePath = '/inventory/summary';

/// 네비게이션 구성을 정의한 섹션 목록.
const appSections = <AppSectionDescriptor>[
  AppSectionDescriptor(
    label: '대시보드',
    pages: [
      AppPageDescriptor(
        path: dashboardRoutePath,
        label: '대시보드',
        icon: lucide.LucideIcons.layoutDashboard,
        summary: '오늘 입고/출고, 결재 대기, 최근 트랜잭션을 한 화면에서 확인합니다.',
      ),
    ],
  ),
  AppSectionDescriptor(
    label: '재고',
    pages: [
      AppPageDescriptor(
        path: inventorySummaryRoutePath,
        label: '재고 현황',
        icon: lucide.LucideIcons.chartNoAxesColumnIncreasing,
        summary: '제품별 총 재고, 창고 잔량, 최근 이벤트를 한 화면에서 확인합니다.',
        extraRequiredResources: [PermissionResources.inventoryScope],
      ),
    ],
  ),
  AppSectionDescriptor(
    label: '입·출고',
    pages: [
      AppPageDescriptor(
        path: '/inventory/inbound',
        label: '입고',
        icon: lucide.LucideIcons.packagePlus,
        summary: '입고 처리 기본정보와 라인 품목을 등록하고 검토합니다.',
      ),
      AppPageDescriptor(
        path: '/inventory/outbound',
        label: '출고',
        icon: lucide.LucideIcons.packageMinus,
        summary: '출고 품목, 고객사 연결, 상태 변경을 관리합니다.',
      ),
      AppPageDescriptor(
        path: '/inventory/rental',
        label: '대여',
        icon: lucide.LucideIcons.handshake,
        summary: '대여/반납 구분과 반납예정일을 포함한 대여 흐름입니다.',
      ),
    ],
  ),
  AppSectionDescriptor(
    label: '마스터',
    pages: [
      AppPageDescriptor(
        path: '/masters/vendors',
        label: '제조사 관리',
        icon: lucide.LucideIcons.factory,
        summary: '벤더코드, 명칭, 사용여부 등을 유지합니다.',
      ),
      AppPageDescriptor(
        path: '/masters/products',
        label: '장비 모델 관리',
        icon: lucide.LucideIcons.box,
        summary: '제품코드, 제조사, 단위 정보를 관리합니다.',
      ),
      AppPageDescriptor(
        path: '/masters/warehouses',
        label: '입고지 관리',
        icon: lucide.LucideIcons.warehouse,
        summary: '창고 주소와 사용여부를 설정합니다.',
      ),
      AppPageDescriptor(
        path: '/masters/customers',
        label: '회사 관리',
        icon: lucide.LucideIcons.building,
        summary: '고객사 연락처와 주소 정보를 관리합니다.',
      ),
      AppPageDescriptor(
        path: '/masters/users',
        label: '사용자 관리',
        icon: lucide.LucideIcons.users,
        summary: '사번, 그룹, 사용여부를 관리합니다.',
      ),
      AppPageDescriptor(
        path: '/masters/groups',
        label: '그룹 관리',
        icon: lucide.LucideIcons.layers,
        summary: '권한 그룹과 설명, 기본여부를 정의합니다.',
      ),
      AppPageDescriptor(
        path: '/masters/menus',
        label: '메뉴 관리',
        icon: lucide.LucideIcons.listTree,
        summary: '메뉴 계층과 경로, 노출 순서를 구성합니다.',
      ),
      AppPageDescriptor(
        path: '/masters/group-permissions',
        label: '그룹 메뉴 권한',
        icon: lucide.LucideIcons.shieldCheck,
        summary: '그룹별 메뉴 CRUD 권한을 설정합니다.',
      ),
    ],
  ),
  AppSectionDescriptor(
    label: '결재',
    pages: [
      AppPageDescriptor(
        path: '/approvals/requests',
        label: '결재 관리',
        icon: lucide.LucideIcons.fileCheck,
        summary: '결재 번호, 상태, 상신자를 관리합니다.',
      ),
      AppPageDescriptor(
        path: '/approvals/steps',
        label: '결재 단계',
        icon: lucide.LucideIcons.workflow,
        summary: '단계 순서와 승인자 할당을 설정합니다.',
      ),
      AppPageDescriptor(
        path: '/approvals/history',
        label: '결재 이력',
        icon: lucide.LucideIcons.history,
        summary: '결재 단계별 변경 이력을 조회합니다.',
      ),
      AppPageDescriptor(
        path: '/approvals/templates',
        label: '결재 템플릿',
        icon: lucide.LucideIcons.fileSpreadsheet,
        summary: '반복되는 결재 흐름을 템플릿으로 관리합니다.',
      ),
    ],
  ),
  AppSectionDescriptor(
    label: '도구',
    pages: [
      AppPageDescriptor(
        path: '/utilities/postal-search',
        label: '우편번호 검색',
        icon: lucide.LucideIcons.search,
        summary: '모달 기반 우편번호 검색 도구입니다.',
      ),
    ],
  ),
  AppSectionDescriptor(
    label: '보고',
    pages: [
      AppPageDescriptor(
        path: '/reports',
        label: '보고서',
        icon: lucide.LucideIcons.fileDown,
        summary: '조건 필터와 PDF/XLSX 다운로드 기능입니다.',
      ),
    ],
  ),
];

List<AppPageDescriptor> get allAppPages => [
  for (final section in appSections) ...section.pages,
];
