import { Injectable, Logger, OnApplicationBootstrap } from "@nestjs/common";
import { InjectModel } from "@nestjs/mongoose";
import { Model } from "mongoose";
import { AuthService } from "./auth.service";
import { Batch, BatchDocument } from "./schemas/batch.schema";
import { InventoryBalance, InventoryBalanceDocument } from "./schemas/inventory-balance.schema";
import { Item, ItemDocument } from "./schemas/item.schema";
import { Warehouse, WarehouseDocument } from "./schemas/warehouse.schema";

@Injectable()
export class DatabaseSeeder implements OnApplicationBootstrap {
  private readonly logger = new Logger(DatabaseSeeder.name);

  constructor(
    @InjectModel(Warehouse.name) private readonly warehouseModel: Model<WarehouseDocument>,
    @InjectModel(Item.name) private readonly itemModel: Model<ItemDocument>,
    @InjectModel(Batch.name) private readonly batchModel: Model<BatchDocument>,
    @InjectModel(InventoryBalance.name)
    private readonly balanceModel: Model<InventoryBalanceDocument>,
    private readonly authService: AuthService,
  ) {}

  async onApplicationBootstrap() {
    await this.authService.seedDefaultUsers();

    const warehouseCount = await this.warehouseModel.countDocuments().exec();
    if (warehouseCount > 0) {
      this.logger.log("Database already seeded — skipping.");
      return;
    }

    this.logger.log("Seeding initial data...");

    // ─── Warehouses ───────────────────────────────────────────────────────────
    const warehouses = await this.warehouseModel.insertMany([
      { name: "Abu Dhabi Musaffah",          code: "ADM",   aliases: ["Abu Dhabi Musaffah"],              active: true },
      { name: "Al-Ain Mazyad",               code: "AAM",   aliases: ["Al Ain Mazyad", "Mazyad"],         active: true },
      { name: "Al-Ain Mazyad (Strategic)",   code: "AAMS",  aliases: ["Al Ain Mazyad Strategic"],         active: true },
      { name: "Al-Ain Mazyad (ACC)",         code: "AAMA",  aliases: ["Al Ain Mazyad ACC"],               active: true },
      { name: "Al-Ain Sanaya B Block - A",   code: "AASBA", aliases: ["Sanaya B Block A"],                active: true },
      { name: "Al-Ain Sanaya B Block - B",   code: "AASBB", aliases: ["Sanaya B Block B"],                active: true },
      { name: "Al-Ain Sanaya B Block - C",   code: "AASBC", aliases: ["Sanaya B Block C"],                active: true },
      { name: "Al-Ain Sanaya B Block - D",   code: "AASBD", aliases: ["Sanaya B Block D"],                active: true },
      { name: "Mazyad (6 month contr)",      code: "AAM6",  aliases: ["Mazyad 6 month"],                  active: true },
      { name: "DIC 1",                       code: "DIC1",  aliases: ["DIC1"],                            active: true },
      { name: "DIC 2",                       code: "DIC2",  aliases: ["DIC2"],                            active: true },
      { name: "DIC 3",                       code: "DIC3",  aliases: ["DIC3"],                            active: true },
      { name: "DIC 4",                       code: "DIC4",  aliases: ["DIC4"],                            active: true },
      { name: "DIC 5",                       code: "DIC5",  aliases: ["DIC5"],                            active: true },
      { name: "DIC 6",                       code: "DIC6",  aliases: ["DIC6"],                            active: true },
      { name: "DIC 7",                       code: "DIC7",  aliases: ["DIC7"],                            active: true },
      { name: "DIC 8",                       code: "DIC8",  aliases: ["DIC8"],                            active: true },
      { name: "DIC 9 (Strategic)",           code: "DIC9S", aliases: ["DIC9", "DIC 9 Strategic"],         active: true },
      { name: "DIC 10",                      code: "DIC10", aliases: ["DIC10"],                           active: true },
      { name: "DIC 11",                      code: "DIC11", aliases: ["DIC11"],                           active: true },
      { name: "Sharjah Sajaa Block B",       code: "SHJB",  aliases: ["Sajaa Block B"],                   active: true },
      { name: "Sharjah Sajaa Block C",       code: "SHJC",  aliases: ["Sajaa Block C"],                   active: true },
    ]);

    // Use a few warehouses for sample batch/balance seeding
    const [whADM, whAAM, , , , , , , , whDIC1, whDIC2, whDIC3, whDIC4, whDIC5] = warehouses;

    // ─── Items ────────────────────────────────────────────────────────────────
    const items = await this.itemModel.insertMany([
      {
        itemCode: "ITM-1001",
        itemName: "Rice Najm 25kg",
        normalizedName: "rice najm 25kg",
        brand: "Najm",
        barcode: "6291003050014",
        countryOfOrigin: "India",
        unit: "BAG/1x25kg",
      },
      {
        itemCode: "ITM-1002",
        itemName: "Rice Najm Basmati 25kg",
        normalizedName: "rice najm basmati 25kg",
        brand: "Najm",
        barcode: "6291003050021",
        countryOfOrigin: "India",
        unit: "BAG/1x25kg",
      },
      {
        itemCode: "ITM-1003",
        itemName: "Rice Majlis 25kg",
        normalizedName: "rice majlis 25kg",
        brand: "Majlis",
        barcode: "6291004060011",
        countryOfOrigin: "India",
        unit: "BAG/1x25kg",
      },
      {
        itemCode: "ITM-1004",
        itemName: "Rice Majlis Sella 25kg",
        normalizedName: "rice majlis sella 25kg",
        brand: "Majlis",
        barcode: "6291004060028",
        countryOfOrigin: "India",
        unit: "BAG/1x25kg",
      },
      {
        itemCode: "ITM-1005",
        itemName: "Rice Bawardy Basmati Sella 25kg",
        normalizedName: "rice bawardy basmati sella 25kg",
        brand: "Bawardy",
        barcode: "6291005070015",
        countryOfOrigin: "India",
        unit: "BAG/1x25kg",
      },
      {
        itemCode: "ITM-1006",
        itemName: "Rice Al Musafir Premium Basmati 25kg",
        normalizedName: "rice al musafir premium basmati 25kg",
        brand: "Al Musafir",
        barcode: "6291006080012",
        countryOfOrigin: "India",
        unit: "BAG/1x25kg",
      },
      {
        itemCode: "ITM-1007",
        itemName: "Rice Khazna 25kg",
        normalizedName: "rice khazna 25kg",
        brand: "Khazna",
        barcode: "6291007090019",
        countryOfOrigin: "Pakistan",
        unit: "BAG/1x25kg",
      },
      {
        itemCode: "ITM-1008",
        itemName: "Rice Sella Classic Premium 25kg",
        normalizedName: "rice sella classic premium 25kg",
        brand: "Sella",
        barcode: "6291008100016",
        countryOfOrigin: "India",
        unit: "BAG/1x25kg",
      },
      {
        itemCode: "ITM-1009",
        itemName: "Rice Summerville Creamy Sella 25kg",
        normalizedName: "rice summerville creamy sella 25kg",
        brand: "Summerville",
        barcode: "6291009110013",
        countryOfOrigin: "India",
        unit: "BAG/1x25kg",
      },
      {
        itemCode: "ITM-1010",
        itemName: "Rice Indian White Sella 25kg",
        normalizedName: "rice indian white sella 25kg",
        brand: "Indian",
        barcode: "6291010120010",
        countryOfOrigin: "India",
        unit: "BAG/1x25kg",
      },
    ]);

    const [itNajm, itNajmBas, itMajlis, itMajlisSella, itBawardy, itMusafir, itKhazna, itSella, itSummer, itIndian] = items;

    // ─── Batches ──────────────────────────────────────────────────────────────
    const batches = await this.batchModel.insertMany([
      { warehouseId: whADM._id,  itemId: itNajm._id,         batchNumber: "NJM-2501", expiryDate: "2026-01-28" },
      { warehouseId: whAAM._id,  itemId: itNajm._id,         batchNumber: "NJM-2502", expiryDate: "2026-02-15" },
      { warehouseId: whDIC1._id, itemId: itNajmBas._id,      batchNumber: "NJB-2501", expiryDate: "2026-03-10" },
      { warehouseId: whDIC2._id, itemId: itMajlis._id,       batchNumber: "MJL-2501", expiryDate: "2026-04-20" },
      { warehouseId: whDIC3._id, itemId: itMajlisSella._id,  batchNumber: "MJS-2501", expiryDate: "2026-05-18" },
      { warehouseId: whADM._id,  itemId: itBawardy._id,      batchNumber: "BWD-2501", expiryDate: "2026-06-30" },
      { warehouseId: whDIC4._id, itemId: itMusafir._id,      batchNumber: "MSF-2501", expiryDate: "2026-07-12" },
      { warehouseId: whDIC5._id, itemId: itKhazna._id,       batchNumber: "KHZ-2501", expiryDate: "2026-08-25" },
      { warehouseId: whAAM._id,  itemId: itSella._id,        batchNumber: "SLA-2501", expiryDate: "2026-09-05" },
      { warehouseId: whADM._id,  itemId: itSummer._id,       batchNumber: "SMV-2501", expiryDate: "2026-10-14" },
      { warehouseId: whAAM._id,  itemId: itIndian._id,       batchNumber: "IND-2501", expiryDate: "2026-11-20" },
    ]);

    const [ba1, ba2, ba3, ba4, ba5, ba6, ba7, ba8, ba9, ba10, ba11] = batches;

    // ─── Inventory Balances ───────────────────────────────────────────────────
    await this.balanceModel.insertMany([
      { warehouseId: whADM._id,  itemId: itNajm._id,        batchId: ba1._id,  currentQuantityMt: 320,  thresholdTargetMt: 26000, lastUpdated: new Date().toISOString() },
      { warehouseId: whAAM._id,  itemId: itNajm._id,        batchId: ba2._id,  currentQuantityMt: 180,  thresholdTargetMt: 26000, lastUpdated: new Date().toISOString() },
      { warehouseId: whDIC1._id, itemId: itNajmBas._id,     batchId: ba3._id,  currentQuantityMt: 450,  thresholdTargetMt: 26000, lastUpdated: new Date().toISOString() },
      { warehouseId: whDIC2._id, itemId: itMajlis._id,      batchId: ba4._id,  currentQuantityMt: 210,  thresholdTargetMt: 26000, lastUpdated: new Date().toISOString() },
      { warehouseId: whDIC3._id, itemId: itMajlisSella._id, batchId: ba5._id,  currentQuantityMt: 390,  thresholdTargetMt: 26000, lastUpdated: new Date().toISOString() },
      { warehouseId: whADM._id,  itemId: itBawardy._id,     batchId: ba6._id,  currentQuantityMt: 140,  thresholdTargetMt: 26000, lastUpdated: new Date().toISOString() },
      { warehouseId: whDIC4._id, itemId: itMusafir._id,     batchId: ba7._id,  currentQuantityMt: 275,  thresholdTargetMt: 26000, lastUpdated: new Date().toISOString() },
      { warehouseId: whDIC5._id, itemId: itKhazna._id,      batchId: ba8._id,  currentQuantityMt: 500,  thresholdTargetMt: 26000, lastUpdated: new Date().toISOString() },
      { warehouseId: whAAM._id,  itemId: itSella._id,       batchId: ba9._id,  currentQuantityMt: 160,  thresholdTargetMt: 26000, lastUpdated: new Date().toISOString() },
      { warehouseId: whADM._id,  itemId: itSummer._id,      batchId: ba10._id, currentQuantityMt: 95,   thresholdTargetMt: 26000, lastUpdated: new Date().toISOString() },
      { warehouseId: whAAM._id,  itemId: itIndian._id,      batchId: ba11._id, currentQuantityMt: 730,  thresholdTargetMt: 26000, lastUpdated: new Date().toISOString() },
    ]);

    this.logger.log(
      "Seed complete: 22 warehouses, 10 items, 11 batches, 11 inventory balances.",
    );
  }
}
