import { NestFactory } from '@nestjs/core';
import { eq } from 'drizzle-orm';
import { readFileSync } from 'fs';
import { AppModule } from './app.module';
import { DrizzleService } from '@lib/drizzle/src';
import { tnInsurerInvoice, tnInvoice } from 'drizzle/schema';
import { tnInsurer } from 'drizzle/schema';

async function init() {
  const app = await NestFactory.createApplicationContext(AppModule);
  const drizzle = app.get(DrizzleService);
  const lifeJson = readFileSync('life.json', 'utf8');
  const propertyJson = readFileSync('property.json', 'utf8');
  const lifeData = JSON.parse(lifeJson);
  const propertyData = JSON.parse(propertyJson);

  const lifeInsurers = Object.entries(lifeData);
  const propertyInsurers = Object.entries(propertyData);
  const lifeDatas: any[] = [];
  const propertyDatas: any[] = [];
  for (const [key, value] of lifeInsurers) {
    const [insurer] = await drizzle
      .select()
      .from(tnInsurer)
      .where(eq(tnInsurer.insName, key));

    for (const [key, coordinates] of Object.entries(value as Object)) {
      const [invoice] = await drizzle
        .select()
        .from(tnInvoice)
        .where(eq(tnInvoice.ivcNameKr, key));
      if (!invoice) {
        continue;
      }

      for (const coordinate of coordinates) {
        lifeDatas.push({
          insId: insurer.insId,
          ivcId: invoice.ivcId,
          iivPage: coordinate.page,
          iivCoordinateX: coordinate.x,
          iivCoordinateY: coordinate.y,
        });
      }
    }
  }

  for (const [key, value] of propertyInsurers) {
    const [insurer] = await drizzle
      .select()
      .from(tnInsurer)
      .where(eq(tnInsurer.insName, key));

    for (const [key, coordinates] of Object.entries(value as Object)) {
      const [invoice] = await drizzle
        .select()
        .from(tnInvoice)
        .where(eq(tnInvoice.ivcNameKr, key));

      for (const coordinate of coordinates) {
        propertyDatas.push({
          insId: insurer.insId,
          ivcId: invoice.ivcId,
          iivPage: coordinate.page,
          iivCoordinateX: coordinate.x,
          iivCoordinateY: coordinate.y,
        });
      }
    }
  }
  await drizzle.insert(tnInsurerInvoice).values(lifeDatas);
  await drizzle.insert(tnInsurerInvoice).values(propertyDatas);
  await app.close();
}
init();
