'use strict'
const Knex = require('knex')
let knex
const { Model } = require('objection')
const {Schueler, Schule, Schuelerfoto, Versetzung} = require('./models/Models')
/*
Vorhandene Models:
Abschnitt, Fachklasse, Versetzung, Lehrer, Note, Fach, BKAbschluss, BKAbschlussFach, AbiAbschluss, AbiAbschlussFach,
FHRAbschluss, FHRAbschlussFach, Sprachenfolge, FachGliederung, Vermerk, Schuelerfoto, Schule, Nutzer
*/

const Schild = {
  suche: async function (pattern) {
    const schueler = await Schueler.query()
      .where(function () { this.where('Geloescht', '-').andWhere('Gesperrt', '-') })
      .andWhere(function () { this.where('Vorname', 'like', pattern + '%').orWhere('Name', 'like', pattern + '%') })
      .select('Name', 'Vorname', 'Klasse', 'Status', 'AktSchuljahr', 'ID')
      .orderBy('AktSchuljahr', 'desc')
      .map(s => {
        return {
          value: `${s.Name}, ${s.Vorname} (${s.Klasse})`,
          status: s.Status,
          jahr: s.AktSchuljahr,
          id: s.ID
        }
      })
    const klasse = await Versetzung.query()
      .where('Klasse', 'like', pattern + '%')
      .select('Klasse')
      .orderBy('Klasse', 'desc')
      .map(k => {
        return { value: k.Klasse, id: k.Klasse }
      })
    return schueler.concat(klasse)
  },
  getSchueler: async function (id) {
    return Schueler.query()
      .where('ID', id)
      .eager('[abschnitte.[noten.fach, lehrer], fachklasse, versetzung, bk_abschluss, bk_abschluss_faecher.fach, fhr_abschluss, fhr_abschluss_faecher.fach, abi_abschluss, abi_abschluss_faecher.fach, vermerke]')
      .modifyEager('abschnitte', builder => { builder.orderBy('ID') })
      .first()
  },
  getKlasse: async function (klasse, jahr, abschnitt) {
    return Versetzung.query()
      .where('Klasse', klasse)
      // 2 = aktiv, 8 = mit Abschluss entlassen
      // .where(function() {
      //     this.where('Status', 2).orWhere('Status', 8)
      //   })
      .eager('[schueler.[abschnitte.[noten.fach, lehrer], fachklasse, versetzung, bk_abschluss, bk_abschluss_faecher.fach, fhr_abschluss, fhr_abschluss_faecher.fach, abi_abschluss, abi_abschluss_faecher.fach, vermerke], fachklasse, jahrgang]')
      .modifyEager('schueler', builder => { builder.orderBy('Name') })
      .first()
  },
  getSchule: async function () {
    return Schule.query().first()
  },
  getSchuelerfoto: async function (id) {
    const data = await Schuelerfoto.query()
      .where('Schueler_ID', id).first()
    return Buffer.from(data.Foto, 'binary').toString('base64')
  },
  connect: function (knexConfig, env = process.env.NODE_ENV) {
    knex = Knex(knexConfig[env])
    Model.knex(knex)
    return knex
  },
  disconnect: function () {
    if (knex) knex.destroy()
  },
  testConnection: function () {
    return knex.raw('select 1+1 as result')
      .then(res => {
        console.log('Testverbindung konnte aufgebaut werden')
        return true
      })
      .catch(err => {
        console.log(err)
        console.log('Testverbindung konnte nicht aufgebaut werden')
        return false
      })
  }
}

module.exports = Schild
