'use strict'


/*
   Entry point for crawling functionality
   All communication between crawlers and savers is here
   All environment specific configuration is read here and
   passed to the crawlers and savers.

*/
import {
  install
} from 'source-map-support';
import 'dotenv/config';
import OlxCrawler from './specific/olx';
import ProstorCrawler from './specific/prostor';
import RentalCrawler from './specific/rental';
import MongoSaver from './savers/mongo'

install(); // for source maps to work

let crawlers = [
  //new OlxCrawler(process.env.OLX_FROM_PAGE, process.env.OLX_TO_PAGE, process.env.OLX_MAX_RESULTS),
  new ProstorCrawler(parseInt(process.env.PROSTOR_FROM_PAGE), parseInt(process.env.PROSTOR_TO_PAGE), parseInt(process.env.PROSTOR_MAX_RESULTS)),
  new RentalCrawler(parseInt(process.env.RENTAL_FROM_PAGE), parseInt(process.env.RENTAL_TO_PAGE), parseInt(process.env.RENTAL_MAX_RESULTS))
];

let savers = [
  new MongoSaver(process.env.MONGO_URL)
];

async function crawlAll() {

  for (let crawler of crawlers) {
    try {
      let results = await crawler.crawl()
      for (let saver of savers) {
        try {
          await saver.connect();
          await saver.save(results);
        } catch (e) {
          console.log("Error saving. Trying next saver! ", e);
        }
      }
    } catch (e) {
      console.log("Error crawling. Trying next crawler! ", e);
    }
  }

  for (let saver of savers) {
    saver.close();
  }
}

crawlAll();
