const csv = require('csv-parser'),
      fs = require('fs'),
      path = require('path');

const readCSV = async function(scope) {
  const {fileName, types, keys, index} = scope,
    postProcess = scope.postProcess || (a => a);

  const trash = Symbol('Trash')
  const hash = {};
  return await new Promise(function(resolve, reject) {
    let id = 1;
    const inc = ()=>id++;

    fs.createReadStream(fileName)
      .pipe(csv({
        mapHeaders: ({header}) => keys[header] || trash,
        mapValues: ({header, value}) => header in types ? types[header](value) : null
      }))
      .on('data', (obj) => {
        if(postProcess(obj, inc)!==false)
          hash[obj[index]] = obj;
      })
      .on('end', () => {
        resolve(hash);
        console.log('CSV parsed: '+ fileName)
      });
  });
};
const base = process.env.KUS_DATA_DIR || './data';

const connections = JSON.parse(fs.readFileSync(path.join(base,'connections.json'))+'');
const tags = JSON.parse(fs.readFileSync(path.join(base,'tags.json'))+'');

data = {tags, connections, more:[]};
(async()=>{
  data.components = await readCSV({
    fileName: path.join(base,'components.csv'),
    keys: {
      'номер карточки': 'id',
      'ингредиент': 'name'
    },
    types: {
      id: Number,
      name: String
    },
    postProcess: (a, inc) => a.iID = inc(),
    index: 'iID'
  });

  data.standardQuestions = await readCSV({
    fileName: path.join(base,'standard_questions.csv'),
    keys: {
      'id': 'qID',
      'card_info_id': 'cardInfoID',
      'text': 'title',
      'image': 'image',
      'type': 'multiple'
    },
    types: {
      qID: Number,
      cardInfoID: Number,
      title: String,
      image: String,
      multiple: String,
    },
    postProcess: (a) => {
      a.answers = [];
      a.multiple = a.multiple === 'checkbox';
      a.category = 2;
    },
    index: 'qID'
  });

  var maxQ = 1;
  const standardAnswers = await readCSV({
    fileName: path.join(base,'standard_answers.csv'),
    keys: {
      'question_id': 'qID',
      'text': 'title',
      'correct': 'correct',
    },
    types: {
      qID: Number,
      title: String,
      correct: Number
    },
    postProcess: (a, inc) => {
      a.id = inc();
      a.answers = [];
      a.correct = a.correct === 1;
    },
    index: 'id'
  });
  Object.values(standardAnswers).forEach(a=>{
    maxQ = Math.max(a.qID, maxQ);
    data.standardQuestions[a.qID].answers.push(a);
  });

  data.products = await readCSV({
    fileName: path.join(base,'products.csv'),
    keys: {
      '': 'id',
      'название': 'title',
      'описание': 'description',
      'категория': 'cat',
      'подкатегория': 'subcat',
      'подподкатегория': 'subsubcat',
      'участвует в тесте': 'use'
    },
    types: {
      id: Number,
      title: String,
      description: String,
      cat: String,
      subcat: String,
      subsubcat: String,
      use: a=>Boolean(Number(a))
    },
    index: 'id'
  });



  var dumped = [{"id":1,"title":"Блины \"Карбонара\"","image":"/upload/resize/161031/161031_530x300x85_c.jpg"},{"id":2,"title":"Блины с начинкой жюльен","image":"/upload/resize/93710/93710_530x300x85_c.jpg"},{"id":3,"title":"Блины с ветчиной (из свинины) и с сыром","image":"/upload/resize/93352/93352_530x300x85_c.jpg"},{"id":4,"title":"Блины с мясом","image":"/upload/resize/95146/95146_530x300x85_c.jpg"},{"id":5,"title":"Блины постные с картофелем и грибами","image":"/upload/resize/96634/96634_530x300x85_c.jpg"},{"id":6,"title":"Варенье вишневое, 50 г"},{"id":7,"title":"Малина дроблёная с сахаром","image":"/upload/resize/113263/113263_530x300x85_c.jpg"},{"id":8,"title":"Варенье из слив с лимоном и имбирем","image":"/upload/resize/95818/95818_530x300x85_c.jpg"},{"id":9,"title":"Варенье черничное","image":"/upload/resize/93853/93853_530x300x85_c.jpg"},{"id":10,"title":"Варенье из клубники с мятой","image":"/upload/resize/94377/94377_530x300x85_c.jpg"},{"id":11,"title":"Голубцы ленивые в сметанном соусе"},{"id":12,"title":"Лингвини с креветками и с соусом с тыквой","image":"/upload/resize/94017/94017_530x300x85_c.jpg"},{"id":13,"title":"Котлетки рыбные с запечёнными овощами","image":"/upload/resize/157871/157871_530x300x85_c.jpg"},{"id":14,"title":"Паста с лососем в сливочном соусе","image":"/upload/resize/162506/162506_530x300x85_c.jpg"},{"id":15,"title":"Голубцы с курицей в томатном соусе","image":"/upload/resize/154668/154668_530x300x85_c.jpg"},{"id":16,"title":"Бейгл с кунжутом","image":"/upload/resize/161019/161019_530x300x85_c.jpg"},{"id":17,"title":"Хлеб бородинский бездрожжевой","image":"/upload/resize/113263/113263_530x300x85_c.jpg"},{"id":18,"title":"Чиабатта","image":"/upload/resize/96735/96735_530x300x85_c.jpg"},{"id":19,"title":"Хлеб Печерский масличный","image":"/upload/resize/94387/94387_530x300x85_c.jpg"},{"id":20,"title":"Слойка Свердловская","image":"/upload/resize/157888/157888_530x300x85_c.jpg"},{"id":21,"title":"Мидии мясо варено-мороженное","image":"/upload/resize/96601/96601_530x300x85_c.jpg"},{"id":22,"title":"Кальмар филе очищенный зам.","image":"/upload/resize/93260/93260_530x300x85_c.jpg"},{"id":23,"title":"Креветка северная варено-мороженая","image":"/upload/resize/95442/95442_530x300x85_c.jpg"},{"id":24,"title":"Кальмар кольца зам.","image":"/upload/resize/93248/93248_530x300x85_c.jpg"},{"id":25,"title":"Кальмар тушка зам.","image":"/upload/resize/158195/158195_530x300x85_c.jpg"},{"id":26,"title":"Шпинат свежезамороженный","image":"/upload/resize/96005/96005_530x300x85_c.jpg"},{"id":27,"title":"Смесь Гавайская с/м","image":"/upload/resize/95103/95103_530x300x85_c.jpg"},{"id":28,"title":"Смесь мексиканская с/м","image":"/upload/resize/95101/95101_530x300x85_c.jpg"},{"id":29,"title":"Весенние овощи с/м","image":"/upload/resize/95099/95099_530x300x85_c.jpg"},{"id":30,"title":"Смесь овощная для вок с/м","image":"/upload/resize/157890/157890_530x300x85_c.jpg"},{"id":31,"title":"Колбаса «Сервелат Коньячный» в/к","image":"/upload/resize/94937/94937_530x300x85_c.jpg"},{"id":32,"title":"Колбаса «Особенная» из индейки варёная","image":"/upload/resize/93938/93938_530x300x85_c.jpg"},{"id":33,"title":"Колбаса запеченная из индейки","image":"/upload/resize/93844/93844_530x300x85_c.jpg"},{"id":34,"title":"Колбаса «Брауншвейг. полусухая» с/к в/у","image":"/upload/resize/95596/95596_530x300x85_c.jpg"},{"id":35,"title":"Колбаса кровяная с гречкой"},{"id":36,"title":"Шампунь Яичный","image":"/upload/resize/95618/95618_530x300x85_c.jpg"},{"id":37,"title":"Шампунь мужской","image":"/upload/resize/93625/93625_530x300x85_c.jpg"},{"id":38,"title":"Шампунь молочный Миндаль","image":"/upload/resize/95620/95620_530x300x85_c.jpg"},{"id":39,"title":"Маска для волос Сладкий миндаль","image":"/upload/resize/93749/93749_530x300x85_c.jpg"},{"id":40,"title":"Шампунь твёрдый \"Крапивный\"","image":"/upload/resize/157311/157311_530x300x85_c.jpg"},{"id":41,"title":"Пастила фруктовая из персика","image":"/upload/resize/153082/153082_530x300x85_c.jpg"},{"id":42,"title":"Пастила яблочная натуральная","image":"/upload/resize/99730/99730_530x300x85_c.jpg"},{"id":43,"title":"Пастила яблочная хрустящая","image":"/upload/resize/96081/96081_530x300x85_c.jpg"},{"id":44,"title":"Пастила яблоко-вишня хрустящая","image":"/upload/resize/95513/95513_530x300x85_c.jpg"},{"id":45,"title":"Мармелад \"Облепиха\"","image":"/upload/resize/162524/162524_530x300x85_c.jpg"},{"id":46,"title":"Булгур","image":"/upload/resize/94357/94357_530x300x85_c.jpg"},{"id":47,"title":"Кускус","image":"/upload/resize/96042/96042_530x300x85_c.jpg"},{"id":48,"title":"Киноа","image":"/upload/resize/96046/96046_530x300x85_c.jpg"},{"id":49,"title":"Рис для плова Басмати экстрадлинный","image":"/upload/resize/96040/96040_530x300x85_c.jpg"},{"id":50,"title":"Рис \"Жасмин\"","image":"/upload/resize/157295/157295_530x300x85_c.jpg"},{"id":51,"title":"Йогурт греческий","image":"/upload/resize/93247/93247_530x300x85_c.jpg"},{"id":52,"title":"Иммуноцея с сиропом шиповника","image":"/upload/resize/93481/93481_530x300x85_c.jpg"},{"id":53,"title":"Мацони","image":"/upload/resize/95610/95610_530x300x85_c.jpg"},{"id":54,"title":"Скир \"Исландский\" 1,5%","image":"/upload/resize/162486/162486_530x300x85_c.jpg"},{"id":55,"title":"Творог 5%, 180 г","image":"/upload/resize/162528/162528_530x300x85_c.jpg"},{"id":56,"title":"Балык «Королевский» с/к","image":"/upload/resize/94876/94876_530x300x85_c.jpg"},{"id":57,"title":"Карпаччо из индейки с/к","image":"/upload/resize/96643/96643_530x300x85_c.jpg"},{"id":58,"title":"Шпек сыровяленый нарезка, 50 г","image":"/upload/resize/94257/94257_530x300x85_c.jpg"},{"id":59,"title":"Филе грудки индейки \"Су-вид\" в маринаде Корридо","image":"/upload/resize/161126/161126_530x300x85_c.jpg"},{"id":60,"title":"Ребрышки говяжьи, 400 г","image":"/upload/resize/151246/151246_530x300x85_c.jpg"},{"id":61,"title":"Вырезка из свинины","image":"/upload/resize/93373/93373_530x300x85_c.jpg"},{"id":62,"title":"Половина тушки кролика","image":"/upload/resize/36233/36233_530x300x85_c.jpg"},{"id":63,"title":"Стейк из индейки","image":"/upload/resize/94623/94623_530x300x85_c.jpg"},{"id":64,"title":"Филе бедра куриное бескостное","image":"/upload/resize/93376/93376_530x300x85_c.jpg"},{"id":65,"title":"Напиток Чай с лимоном","image":"/upload/resize/94097/94097_530x300x85_c.jpg"},{"id":66,"title":"Напиток «Чайный гриб» со стевией","image":"/upload/resize/94756/94756_530x300x85_c.jpg"},{"id":67,"title":"Напиток «Лимон-Имбирь»","image":"/upload/resize/93810/93810_530x300x85_c.jpg"},{"id":68,"title":"Вода минеральная Псыж 1л","image":"/upload/resize/141107/141107_530x300x85_c.jpg"},{"id":69,"title":"Напиток \"Кокосовый\" на бактериальной закваске","image":"/upload/resize/155586/155586_530x300x85_c.jpg"},{"id":70,"title":"Паштет мясной запеченный","image":"/upload/resize/94249/94249_530x300x85_c.jpg"},{"id":71,"title":"Паштет из тофу «По-испански»","image":"/upload/resize/95069/95069_530x300x85_c.jpg"},{"id":72,"title":"Риет из горбуши с миндалем","image":"/upload/resize/157319/157319_530x300x85_c.jpg"},{"id":73,"title":"Паштет мясной с печенью индейки и грушей","image":"/upload/resize/96449/96449_530x300x85_c.jpg"},{"id":74,"title":"Паштет из печени кролика с шампиньонами","image":"/upload/resize/157301/157301_530x300x85_c.jpg"},{"id":75,"title":"Суп Харчо","image":"/upload/resize/36472/36472_530x300x85_c.jpg"},{"id":76,"title":"Борщ вегетарианский","image":"/upload/resize/95379/95379_530x300x85_c.jpg"},{"id":77,"title":"Суп куриный с домашней лапшой","image":"/upload/resize/93384/93384_530x300x85_c.jpg"},{"id":78,"title":"Суп-пюре норвежский с сёмгой","image":"/upload/resize/154670/154670_530x300x85_c.jpg"},{"id":79,"title":"Уха русская с сёмгой","image":"/upload/resize/151259/151259_530x300x85_c.jpg"},{"id":80,"title":"Ассорти из омуля, муксуна, чира","image":"/upload/resize/161017/161017_530x300x85_c.jpg"},{"id":81,"title":"Ассорти рыбное х/к из скумбрии и горбуши","image":"/upload/resize/157291/157291_530x300x85_c.jpg"},{"id":82,"title":"Ассорти рыбное х/к ломтики","image":"/upload/resize/93193/93193_530x300x85_c.jpg"},{"id":83,"title":"Корюшка горячего копчения","image":"/upload/resize/94935/94935_530x300x85_c.jpg"},{"id":84,"title":"Муксун ломтики холодного копчения","image":"/upload/resize/96307/96307_530x300x85_c.jpg"},{"id":85,"title":"Салат с яблоком, свеклой и черносливом","image":"/upload/resize/149089/149089_530x300x85_c.jpg"},{"id":86,"title":"Салат Мимоза","image":"/upload/resize/96318/96318_530x300x85_c.jpg"},{"id":87,"title":"Салат «Грин Энерджи»","image":"/upload/resize/95216/95216_530x300x85_c.jpg"},{"id":88,"title":"Салат «Оливье»","image":"/upload/resize/93367/93367_530x300x85_c.jpg"},{"id":89,"title":"Салат винегрет с маринованной капустой","image":"/upload/resize/95948/95948_530x300x85_c.jpg"},{"id":90,"title":"Сыр \"Российский\" тёртый","image":"/upload/resize/162484/162484_530x300x85_c.jpg"},{"id":91,"title":"Сыр козий \"Кремчиз с брусникой и яблоком\"","image":"/upload/resize/154664/154664_530x300x85_c.jpg"},{"id":92,"title":"Сыр твердый «Грюнбергер»","image":"/upload/resize/93323/93323_530x300x85_c.jpg"},{"id":93,"title":"Сыр «Эдам»","image":"/upload/resize/96491/96491_530x300x85_c.jpg"},{"id":94,"title":"Сыр «Алтайский» полутвёрдый","image":"/upload/resize/96247/96247_530x300x85_c.jpg"},{"id":95,"title":"Тетрадь в линейку, 48 л","image":"/upload/resize/157293/157293_530x300x85_c.jpg"},{"id":96,"title":"Десерт молочный \"Ночь в Брюгге\"","image":"/upload/resize/156148/156148_530x300x85_c.jpg"},{"id":97,"title":"Панна-котта «Манго-маракуйя-апельсин»","image":"/upload/resize/96593/96593_530x300x85_c.jpg"},{"id":98,"title":"Пирожное постное «Трюфельное»","image":"/upload/resize/96391/96391_530x300x85_c.jpg"},{"id":99,"title":"Рулет бисквитный","image":"/upload/resize/94957/94957_530x300x85_c.jpg"},{"id":100,"title":"Пирожное \"Малиновое\" на кокосовом молоке","image":"/upload/resize/157898/157898_530x300x85_c.jpg"},{"id":101,"title":"Мята душистая","image":"/upload/resize/143429/143429_530x300x85_c.jpg"},{"id":102,"title":"Горный чабрец","image":"/upload/resize/95864/95864_530x300x85_c.jpg"},{"id":103,"title":"Чай с мятой и календулой в пакетиках","image":"/upload/resize/94555/94555_530x300x85_c.jpg"},{"id":104,"title":"Чай зеленый байховый в пакетиках","image":"/upload/resize/95751/95751_530x300x85_c.jpg"},{"id":105,"title":"Чай гречишный, в пирамидках"}];
  dumped.filter(a=>a.image).forEach(a=>data.products[a.id].image = 'https://vkusvill.ru'+a.image)
  fs.writeFileSync('tmp.json',JSON.stringify(Object.values(data.products).map(({id, title})=>({id, title}))));



  if(data.more){
    for( let i = 0, _i = data.more.length; i < _i; i++ ){
      const moreElement = data.more[ i ];

      const Q = await readCSV({
        fileName: path.join(base,moreElement.q),
        keys: {
          'номер вопроса': 'qID',
          'карточка': 'cardInfoID',
          'Заголовок': 'title',
          'Тип вопроса': 'image',
          'множественный выбор': 'multiple',
          'Тип ответа': 'answer_type',
          'категория': 'category'
        },
        types: {
          qID: Number,
          cardInfoID: Number,
          title: String,
          image: String,
          multiple: String,
          category: Number,
          answer_type: String
        },
        postProcess: (a) => {
          if(a.title.trim()==='')return false;
          a.answers = [];
          a.multiple = (a.multiple+'')[0].toLowerCase() in {'д':1,'1':1,'y': '1', 'c': '1'};
          a.image = null;
        },
        index: 'qID'
      });

      const A = await readCSV({
        fileName: path.join(base,moreElement.a),
        keys: {
          'номер вопроса': 'qID',
          'ответ': 'title',
          'правильный': 'correct',
        },
        types: {
          qID: Number,
          title: String,
          correct: Number
        },
        postProcess: (a, inc) => {
          if(a.title.trim()==='')return false;
          a.id = inc();
          a.correct = (a.correct+'')[0].toLowerCase() in {'д':1,'1':1,'y': '1', 'c': '1'};
        },
        index: 'id'
      });
      Object.values(A).forEach(a=>{
        Q[a.qID].answers.push(a);
      });
      for(var qI in Q){
        let id = ++maxQ;
        Q[qI].qID = id;
        Q[qI].answers.forEach(a=>a.qID = id);
        data.standardQuestions[ id ] = Q[qI];
      }
    }
  }

  data.after && data.after(data);
})();


const keys = {
  'номер карточки': 'id',
  'ингредиент': 'name'
};
const mapper = {
  id: Number,
  name: String
};

module.exports = data;