import { Controller, Get, OnModuleInit } from '@nestjs/common';
import { AppService } from './app.service';
import { InjectModel } from '@nestjs/mongoose';
import { Admin, AdminDocument } from './schema/admin.schema';
import { Model } from 'mongoose';
import * as bcrypt from 'bcrypt';
import { shipmentModeData } from './utils/data';
import {
  Shipment_Mode,
  Shipment_Mode_Document,
} from './schema/map-shipment-mode.schema';

@Controller()
export class AppController implements OnModuleInit {
  constructor(
    private readonly appService: AppService,
    @InjectModel(Admin.name) private readonly adminModel: Model<AdminDocument>,
    @InjectModel(Shipment_Mode.name)
    private readonly shipmentModeModel: Model<Shipment_Mode_Document>,
  ) { }
  async onModuleInit() {
    const admin = await this.adminModel.find();
    if (admin.length === 0) {
      const password = await bcrypt.hash(process.env.ADMIN_PASSWORD, 10);
      await new this.adminModel({
        email: process.env.ADMIN_EMAIL,
        password: password,
      }).save();
      console.log('Admin Created');
    }
    // for (let i = 0; i < shipmentModeData.length; i++) {
    //   const mode = await this.shipmentModeModel.findOne({
    //     slug: shipmentModeData[i]?.slug,
    //   });
    //   if (!mode) {
    //     await new this.shipmentModeModel(shipmentModeData[i]).save();
    //   }
    // }
    for (const data of shipmentModeData) {
      // Keep only one existing document
      const existingDocs = await this.shipmentModeModel.find({ slug: data.slug });
      if (existingDocs.length > 1) {
        const [first, ...rest] = existingDocs;
        await this.shipmentModeModel.deleteMany({ _id: { $in: rest.map(d => d._id) } });
      }

      // Upsert
      await this.shipmentModeModel.updateOne(
        { slug: data.slug },
        { $set: data },
        { upsert: true }
      );
    }

  }

  @Get()
  getHello(): string {
    return this.appService.getHello();
  }
}
