import { Module, OnModuleDestroy, OnModuleInit } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { AssetService } from './asset.service';
import { AssetController } from './asset.controller';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { PassportModule } from '@nestjs/passport';
import { JwtModule } from '@nestjs/jwt';
import { UserEntity } from '../entities/user.entity';
import { ProjectEntity } from '../entities/project.entity';
import { ProjectUserEntity } from '../entities/project-user.entity';
import { ColumnEntity } from '../entities/column.entity';
import { AssetEntity } from '../entities/asset.entity';
import { WorkspaceEntity } from '../entities/workspace.entity';
import { CommonService } from '../common/common.service';
import { InvitationEntity } from '../entities/invitation.entity';
import { NotifierModule } from '../notifier/notifier.module';
import { AssetLinkEntity } from '../entities/link.entity';
import { AssetBlockEntity } from '../entities/asset-block.entity';
import { JwtStrategy } from 'src/common/strategies/jwt.strategy';
import { AssetChangeEntity } from '../entities/asset-change.entity';
import { AssetBlockKeyEntity } from '../entities/asset-block-key.entity';
import { AssetBlockCompEntity } from '../entities/asset-block-comp.entity';
import { ComputingService } from './computing.service';
import { AssetSelectorService } from './asset-selector.service';
import { AssetRefEntity } from '../entities/asset-ref.entity';
import { RefService } from './ref.service';
import { AppTokenStrategy } from '../strategies/app-token.strategy';
import { AppTokenEntity } from '../entities/app-token.entity';
import { AuthApiModule } from '../common/auth-api/auth-api.module';
import { OptTokenOrJwtAuthGuard } from '../guards/opt-token-or-jwt.auth.guard';
import { ProjectActionEntity } from '../entities/project-action.entity';
import { IvanovAssetService } from './customizations/ivanov-asset.service';
import { AssetForeignBlockEntity } from '../entities/asset-foreign-block.entity';
import { AssetUserRightEntity } from '../entities/asset-user-right.entity';
import { EventTriggerEntity } from '../entities/event-trigger.entity';
import { EventActionEntity } from '../entities/event-action.entity';
import { EventWebhookLogEntity } from '../entities/event-webhook-log';
import { AssetEventService } from './asset-event.service';
import { CommentService } from './comment.service';
import { CommentEntity } from '../entities/comment.entity';
import { CommentBlockKeyEntity } from '../entities/comment_block_key.entity';
import { CommentReplyEntity } from '../entities/comment_reply.entity';
import { AssetChangeAssetEntity } from '../entities/asset-change-asset.entity';
import {IzhAutosnabService} from "./customizations/izh-autosnab-service";

@Module({
  imports: [
    ConfigModule,
    PassportModule,
    NotifierModule,
    JwtModule.registerAsync({
      imports: [ConfigModule],
      inject: [ConfigService],
      useFactory: async (configService: ConfigService) => ({
        privateKey: configService.get('auth.privateKey'),
        publicKey: configService.get('auth.publicKey'),
        signOptions: { expiresIn: '500s', algorithm: 'RS256' },
      }),
    }),
    TypeOrmModule.forFeature([
      ProjectEntity,
      UserEntity,
      ProjectUserEntity,
      ColumnEntity,
      AssetEntity,
      WorkspaceEntity,
      InvitationEntity,
      AssetLinkEntity,
      AssetBlockEntity,
      AssetForeignBlockEntity,
      AssetChangeEntity,
      AssetChangeAssetEntity,
      AssetBlockKeyEntity,
      AssetBlockCompEntity,
      AssetRefEntity,
      AssetBlockEntity,
      AppTokenEntity,
      ProjectActionEntity,
      AssetUserRightEntity,
      EventTriggerEntity,
      EventActionEntity,
      EventWebhookLogEntity,
      CommentEntity,
      CommentBlockKeyEntity,
      CommentReplyEntity,
    ]),
    AuthApiModule,
  ],
  providers: [
    AppTokenStrategy,
    OptTokenOrJwtAuthGuard,
    AssetSelectorService,
    AssetService,
    AssetEventService,
    ComputingService,
    CommonService,
    JwtStrategy,
    RefService,
    IvanovAssetService,
    IzhAutosnabService,
    CommentService,
  ],
  controllers: [AssetController],
  exports: [AssetService, RefService, AssetSelectorService, ComputingService],
})
export class AssetModule implements OnModuleInit, OnModuleDestroy {
  constructor(private computingService: ComputingService) {}
  onModuleDestroy() {
    this.computingService.stopComputingCycle();
  }

  onModuleInit() {
    this.computingService.startComputingCycle();
  }
}
