import { Logger, Module } from '@nestjs/common';
import { loadEnv } from '@/config/env';
import { PlatformModule } from '@/modules/platform/platform.module';
import { MasterDataModule } from '@/modules/master-data/master-data.module';
import { InventoryModule } from '@/modules/inventory/inventory.module';
import { InboundModule } from '@/modules/inbound/inbound.module';
import { OutboundModule } from '@/modules/outbound/outbound.module';
import { TasksModule } from '@/modules/tasks/tasks.module';
import { BillingModule } from '@/modules/billing/billing.module';
import { ReportsModule } from '@/modules/reports/reports.module';
import { LLM_PROVIDER, LlmProvider } from './llm/llm.provider';
import { AnthropicProvider } from './llm/anthropic.provider';
import { DisabledProvider } from './llm/disabled.provider';
import { MockProvider } from './llm/mock.provider';
import { LlmService } from './llm/llm.service';
import { ProposalsService } from './proposals.service';
import { DocumentIntakeService } from './document-intake.service';
import { AnalyticsService } from './analytics.service';
import { CopilotService } from './copilot.service';
import { AiController } from './ai.controller';

/**
 * AI layer. Provider is selected from the environment:
 *   AI_PROVIDER=anthropic + ANTHROPIC_API_KEY  -> live model
 *   AI_PROVIDER=disabled (default)             -> LLM features return AI_DISABLED, deterministic analytics still work
 * Adding another vendor = one new class implementing LlmProvider + one case below.
 */
@Module({
  imports: [PlatformModule, MasterDataModule, InventoryModule, InboundModule, OutboundModule, TasksModule, BillingModule, ReportsModule],
  providers: [
    {
      provide: LLM_PROVIDER,
      useFactory: (): LlmProvider => {
        const env = loadEnv();
        const logger = new Logger('AiModule');
        if (env.AI_PROVIDER === 'anthropic') {
          if (!env.ANTHROPIC_API_KEY) {
            logger.error('AI_PROVIDER=anthropic but ANTHROPIC_API_KEY is missing; AI features are disabled');
            return new DisabledProvider();
          }
          logger.log(`AI provider: anthropic (${env.AI_MODEL})`);
          return new AnthropicProvider(env.ANTHROPIC_API_KEY, env.AI_MODEL, env.AI_MAX_TOKENS);
        }
        if (env.AI_PROVIDER === 'mock') {
          if (env.NODE_ENV === 'production') throw new Error('AI_PROVIDER=mock is not allowed in production');
          logger.warn('AI provider: mock (deterministic, for development and tests only)');
          return new MockProvider();
        }
        logger.log('AI provider: disabled');
        return new DisabledProvider();
      },
    },
    LlmService,
    ProposalsService,
    DocumentIntakeService,
    AnalyticsService,
    CopilotService,
  ],
  controllers: [AiController],
  exports: [LlmService, ProposalsService],
})
export class AiModule {}
