import type { KnipConfig } from 'knip'

/**
 * Knip Configuration for Dead Code Detection
 *
 * This configuration helps identify unused files, exports, and dependencies
 * in the Dify web application (Next.js 15 + TypeScript + React 19).
 *
 * ⚠️ SAFETY FIRST: This configuration is designed to be conservative and
 * avoid false positives that could lead to deleting actively used code.
 *
 * @see https://knip.dev/reference/configuration
 */
const config: KnipConfig = {
  // ============================================================================
  // Next.js Framework Configuration
  // ============================================================================
  // Configure entry points specific to Next.js application structure.
  // These files are automatically treated as entry points by the framework.
  next: {
    entry: [
      // Next.js App Router pages (must exist for routing)
      'app/**/page.tsx',
      'app/**/layout.tsx',
      'app/**/loading.tsx',
      'app/**/error.tsx',
      'app/**/not-found.tsx',
      'app/**/template.tsx',
      'app/**/default.tsx',

      // Middleware (runs before every route)
      'middleware.ts',

      // Configuration files
      'next.config.js',
      'tailwind.config.js',
      'tailwind-common-config.ts',
      'postcss.config.js',

      // Linting configuration
      'eslint.config.mjs',
    ],
  },

  // ============================================================================
  // Global Entry Points
  // ============================================================================
  // Files that serve as entry points for the application.
  // The '!' suffix means these patterns take precedence and are always included.
  entry: [
    // Next.js App Router patterns (high priority)
    'app/**/page.tsx!',
    'app/**/layout.tsx!',
    'app/**/loading.tsx!',
    'app/**/error.tsx!',
    'app/**/not-found.tsx!',
    'app/**/template.tsx!',
    'app/**/default.tsx!',

    // Core configuration files
    'middleware.ts!',
    'next.config.js!',
    'tailwind.config.js!',
    'tailwind-common-config.ts!',
    'postcss.config.js!',

    // Linting setup
    'eslint.config.mjs!',

    // ========================================================================
    // 🔒 CRITICAL: Global Initializers and Providers
    // ========================================================================
    // These files are imported by root layout.tsx and provide global functionality.
    // Even if not directly imported elsewhere, they are essential for app initialization.

    // Browser initialization (runs on client startup)
    'app/components/browser-initializer.tsx!',
    'app/components/sentry-initializer.tsx!',
    'app/components/swr-initializer.tsx!',

    // i18n initialization (server and client)
    'app/components/i18n.tsx!',
    'app/components/i18n-server.tsx!',

    // Route prefix handling (used in root layout)
    'app/routePrefixHandle.tsx!',

    // ========================================================================
    // 🔒 CRITICAL: Context Providers
    // ========================================================================
    // Context providers might be used via React Context API and imported dynamically.
    // Protecting all context files to prevent breaking the provider chain.
    'context/**/*.ts?(x)!',

    // Component-level contexts (also used via React.useContext)
    'app/components/**/*.context.ts?(x)!',

    // ========================================================================
    // 🔒 CRITICAL: State Management Stores
    // ========================================================================
    // Zustand stores might be imported dynamically or via hooks.
    // These are often imported at module level, so they should be protected.
    'app/components/**/*.store.ts?(x)!',
    'context/**/*.store.ts?(x)!',

    // ========================================================================
    // 🔒 CRITICAL: Provider Components
    // ========================================================================
    // Provider components wrap the app and provide global state/functionality
    'app/components/**/*.provider.ts?(x)!',
    'context/**/*.provider.ts?(x)!',

    // ========================================================================
    // Development tools
    // ========================================================================
    // Storybook configuration
    '.storybook/**/*',
  ],

  // ============================================================================
  // Project Files to Analyze
  // ============================================================================
  // Glob patterns for files that should be analyzed for unused code.
  // Excludes test files to avoid false positives.
  project: [
    '**/*.{js,jsx,ts,tsx,mjs,cjs}',
  ],

  // ============================================================================
  // Ignored Files and Directories
  // ============================================================================
  // Files and directories that should be completely excluded from analysis.
  // These typically contain:
  // - Test files
  // - Internationalization files (loaded dynamically)
  // - Static assets
  // - Build outputs
  // - External libraries
  ignore: [
    // Test files and directories
    '**/__tests__/**',
    '**/*.spec.{ts,tsx}',
    '**/*.test.{ts,tsx}',

    // ========================================================================
    // 🔒 CRITICAL: i18n Files (Dynamically Loaded)
    // ========================================================================
    // Internationalization files are loaded dynamically at runtime via i18next.
    // Pattern: import(`@/i18n/${locale}/messages`)
    // These will NEVER show up in static analysis but are essential!
    'i18n/**',

    // ========================================================================
    // 🔒 CRITICAL: Static Assets
    // ========================================================================
    // Static assets are referenced by URL in the browser, not via imports.
    // Examples: /logo.png, /icons/*, /embed.js
    'public/**',

    // Build outputs and caches
    'node_modules/**',
    '.next/**',
    'coverage/**',

    // Development tools
    '**/*.stories.{ts,tsx}',

    // ========================================================================
    // 🔒 Utility scripts (not part of application runtime)
    // ========================================================================
    // These scripts are run manually (e.g., pnpm gen-icons, pnpm check-i18n)
    // and are not imported by the application code.
    'scripts/**',
    'bin/**',
    'i18n-config/**',

    // Icon generation script (generates components, not used in runtime)
    'app/components/base/icons/script.mjs',
  ],

  // ============================================================================
  // Ignored Dependencies
  // ============================================================================
  // Dependencies that are used but not directly imported in code.
  // These are typically:
  // - Build tools
  // - Plugins loaded by configuration files
  // - CLI tools
  ignoreDependencies: [
    // ========================================================================
    // Next.js plugins (loaded by next.config.js)
    // ========================================================================
    'next-pwa',
    '@next/bundle-analyzer',
    '@next/mdx',

    // ========================================================================
    // Build tools (used by webpack/next.js build process)
    // ========================================================================
    'code-inspector-plugin',

    // ========================================================================
    // Development and translation tools (used by scripts)
    // ========================================================================
    'bing-translate-api',
    'uglify-js',
    'magicast',
  ],

  // ============================================================================
  // Export Analysis Configuration
  // ============================================================================
  // Configure how exports are analyzed

  // Ignore exports that are only used within the same file
  // (e.g., helper functions used internally in the same module)
  ignoreExportsUsedInFile: true,

  // ⚠️ SAFETY: Include exports from entry files in the analysis
  // This helps find unused public APIs, but be careful with:
  // - Context exports (useContext hooks)
  // - Store exports (useStore hooks)
  // - Type exports (might be used in other files)
  includeEntryExports: true,

  // ============================================================================
  // Ignored Binaries
  // ============================================================================
  // Binary executables that are used but not listed in package.json
  ignoreBinaries: [
    'only-allow', // Used in preinstall script to enforce pnpm usage
  ],

  // ============================================================================
  // Reporting Rules
  // ============================================================================
  // Configure what types of issues to report and at what severity level
  rules: {
    // ========================================================================
    // Unused files are ERRORS
    // ========================================================================
    // These should definitely be removed or used.
    // However, always manually verify before deleting!
    files: 'error',

    // ========================================================================
    // Unused dependencies are WARNINGS
    // ========================================================================
    // Dependencies might be:
    // - Used in production builds but not in dev
    // - Peer dependencies
    // - Used by other tools
    dependencies: 'warn',
    devDependencies: 'warn',

    // ========================================================================
    // Unlisted imports are ERRORS
    // ========================================================================
    // Missing from package.json - will break in production!
    unlisted: 'error',

    // ========================================================================
    // Unused exports are WARNINGS (not errors!)
    // ========================================================================
    // Exports might be:
    // - Part of public API for future use
    // - Used by external tools
    // - Exported for type inference
    // ⚠️ ALWAYS manually verify before removing exports!
    exports: 'warn',

    // Unused types are warnings (might be part of type definitions)
    types: 'warn',

    // Duplicate exports are warnings (could cause confusion but not breaking)
    duplicates: 'warn',
  },
}

export default config
