import { BusinessRecord } from './classes.businessrecord.js';
import { HandelsRegister } from './classes.handelsregister.js';
import { JsonlDataProcessor, type SeedEntryType } from './classes.jsonldata.js';
import * as paths from './paths.js';
import * as plugins from './plugins.js';

export class OpenData {
  public db: plugins.smartdata.SmartdataDb;
  private serviceQenv = new plugins.qenv.Qenv(paths.packageDir, paths.nogitDir);

  public jsonLDataProcessor: JsonlDataProcessor<SeedEntryType>;
  public handelsregister: HandelsRegister;

  public CBusinessRecord = plugins.smartdata.setDefaultManagerForDoc(this, BusinessRecord);

  public async start() {
    this.db = new plugins.smartdata.SmartdataDb({
      mongoDbUrl: await this.serviceQenv.getEnvVarOnDemand('MONGODB_URL'),
      mongoDbName: await this.serviceQenv.getEnvVarOnDemand('MONGODB_NAME'),
      mongoDbUser: await this.serviceQenv.getEnvVarOnDemand('MONGODB_USER'),
      mongoDbPass: await this.serviceQenv.getEnvVarOnDemand('MONGODB_PASS'),
    });
    await this.db.init();
    this.jsonLDataProcessor = new JsonlDataProcessor(async (entryArg) => {
      const businessRecord = new this.CBusinessRecord();
      businessRecord.id = await this.CBusinessRecord.getNewId();
      businessRecord.data.name = entryArg.name;
      businessRecord.data.germanParsedRegistration = {
        court: entryArg.all_attributes.registered_office,
        number: entryArg.all_attributes._registerNummer,
        type: entryArg.all_attributes._registerArt as 'HRA' | 'HRB',
      };
      await businessRecord.save();
    });
    this.handelsregister = new HandelsRegister(this);
    await this.handelsregister.start();
  }

  public async buildInitialDb() {
    await this.jsonLDataProcessor.processDataFromUrl();
  }

  public async slowValidateDb() {

  }

  public async validateSearchByName() {

  }

  public async searchDbByBusinessNameAndPostalCode(businessNameArg: string, postalCodeArg: string) {

  }



  public async stop() {
    await this.db.close();
    await this.handelsregister.stop();
  }
}