const {
  BaseKonnector,
  log,
  errors,
  addData,
  hydrateAndFilter
} = require('cozy-konnector-libs')
const rp = require('request-promise')
const cookiejar = rp.jar()
const cheerio = require('cheerio')
const moment = require('moment')

module.exports = new BaseKonnector(start)

// The start function is run by the BaseKonnector instance only when it got all the account
// information (fields). When you run this connector yourself in "standalone" mode or "dev" mode,
// the account information come from ./konnector-dev-config.json file
async function start(fields) {
  log('info', 'Authenticating ...')

  //get the javax state from the auth page
  const javaxFacesAuth = await getJavaxFacesAuth()
  await authenticate(fields.login, fields.password, javaxFacesAuth)

  log('info', 'Successfully logged in')
  log('info', 'Fetching the data')

  // get the javax state from the consommations page
  const javaxFacesData = await getJavaxFacesData()

  await preGetData(javaxFacesData)

  const data = await getData(javaxFacesData)

  log('info', 'Saving data to Cozy')

  await storeData(data)
}

const startDate = moment()
  .subtract(10, 'day')
  .format('DD/MM/YYYY')
const endDate = moment().format('DD/MM/YYYY')

function getJavaxFacesAuth() {
  const javaxFacesRequest = {
    method: 'GET',
    uri: 'https://monespace.grdf.fr/monespace/connexion',
    jar: cookiejar,
    headers: {
      Host: 'monespace.grdf.fr'
    },
    followAllRedirects: true,
    transform: function(body) {
      const $ = cheerio.load(body)
      return $('[name = "javax.faces.ViewState"]')
        .eq(5) //!!!\\ il y en a 10, c'est le 5e
        .val()
    }
  }

  return rp(javaxFacesRequest).catch(() => {
    throw new Error(errors.VENDOR_DOWN)
  })
}

function getJavaxFacesData() {
  const javaxFacesRequest = {
    method: 'GET',
    uri:
      'https://monespace.grdf.fr/monespace/particulier/consommation/consommations',
    jar: cookiejar,
    headers: {
      Host: 'monespace.grdf.fr'
    },
    transform: function(body) {
      const $ = cheerio.load(body)
      return $('[name = "javax.faces.ViewState"]')
        .eq(7) //!!!\\ c'est le 7e
        .val()
    }
  }

  return rp(javaxFacesRequest).catch(() => {
    throw new Error(errors.VENDOR_DOWN)
  })
}

async function authenticate(login, password, javaxFaces) {
  const authRequest = {
    method: 'POST',
    uri:
      'https://monespace.grdf.fr/web/guest/monespace?p_p_id=EspacePerso_WAR_EPportlet&p_p_lifecycle=2&p_p_state=normal&p_p_mode=view&p_p_cacheability=cacheLevelPage&p_p_col_id=column-2&p_p_col_count=1&_EspacePerso_WAR_EPportlet__jsfBridgeAjax=true&_EspacePerso_WAR_EPportlet__facesViewIdResource=%2Fviews%2FespacePerso%2FseconnecterEspaceViewMode.xhtml',
    jar: cookiejar,
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
    },
    body:
      'javax.faces.partial.ajax=true&javax.faces.source=_EspacePerso_WAR_EPportlet_%3AseConnecterForm%3AmeConnecter&javax.faces.partial.execute=_EspacePerso_WAR_EPportlet_%3AseConnecterForm&javax.faces.partial.render=_EspacePerso_WAR_EPportlet_%3Aglobal+_EspacePerso_WAR_EPportlet_%3AgroupTitre&javax.faces.behavior.event=click&javax.faces.partial.event=click&_EspacePerso_WAR_EPportlet_%3AseConnecterForm=_EspacePerso_WAR_EPportlet_%3AseConnecterForm&javax.faces.encodedURL=https%3A%2F%2Fmonespace.grdf.fr%2Fweb%2Fguest%2Fmonespace%3Fp_p_id%3DEspacePerso_WAR_EPportlet%26p_p_lifecycle%3D2%26p_p_state%3Dnormal%26p_p_mode%3Dview%26p_p_cacheability%3DcacheLevelPage%26p_p_col_id%3Dcolumn-2%26p_p_col_count%3D1%26_EspacePerso_WAR_EPportlet__jsfBridgeAjax%3Dtrue%26_EspacePerso_WAR_EPportlet__facesViewIdResource%3D%252Fviews%252FespacePerso%252FseconnecterEspaceViewMode.xhtml&_EspacePerso_WAR_EPportlet_%3AseConnecterForm%3Aemail=' +
      login +
      '&_EspacePerso_WAR_EPportlet_%3AseConnecterForm%3ApasswordSecretSeConnecter=' +
      password +
      '&javax.faces.ViewState=' +
      javaxFaces
  }

  try {
    const res = await rp(authRequest)
    log('debug', res)
  } catch (error) {
    throw new Error(errors.LOGIN_FAILED)
  }
}

async function getData(javaxFaces) {
  const dataRequest = {
    method: 'POST',
    uri:
      'https://monespace.grdf.fr/web/guest/monespace/particulier/consommation/consommations?p_p_id=eConsoconsoDetaille_WAR_eConsoportlet&p_p_lifecycle=2&p_p_state=normal&p_p_mode=view&p_p_cacheability=cacheLevelPage&p_p_col_id=column-3&p_p_col_count=5&p_p_col_pos=3&_eConsoconsoDetaille_WAR_eConsoportlet__jsfBridgeAjax=true&_eConsoconsoDetaille_WAR_eConsoportlet__facesViewIdResource=%2Fviews%2Fconso%2Fdetaille%2FconsoDetailleViewMode.xhtml',
    jar: cookiejar,
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
    },
    body:
      'javax.faces.partial.ajax=true&javax.faces.source=_eConsoconsoDetaille_WAR_eConsoportlet_%3AidFormConsoDetaille%3ApanelTypeGranularite1%3A2&javax.faces.partial.execute=_eConsoconsoDetaille_WAR_eConsoportlet_%3AidFormConsoDetaille%3ApanelTypeGranularite1&javax.faces.partial.render=_eConsoconsoDetaille_WAR_eConsoportlet_%3AidFormConsoDetaille%3ArefreshHighchart+_eConsoconsoDetaille_WAR_eConsoportlet_%3AidFormConsoDetaille%3AupdateDatesBean+_eConsoconsoDetaille_WAR_eConsoportlet_%3AidFormConsoDetaille%3AboutonTelechargerDonnees+_eConsoconsoDetaille_WAR_eConsoportlet_%3AidFormConsoDetaille%3ApanelTypeGranularite+_eConsoconsoDetaille_WAR_eConsoportlet_%3AidFormConsoDetaille%3AidBlocSeuilParametrage&javax.faces.behavior.event=valueChange&javax.faces.partial.event=change&_eConsoconsoDetaille_WAR_eConsoportlet_%3AidFormConsoDetaille=_eConsoconsoDetaille_WAR_eConsoportlet_%3AidFormConsoDetaille&javax.faces.encodedURL=https%3A%2F%2Fmonespace.grdf.fr%2Fweb%2Fguest%2Fmonespace%2Fparticulier%2Fconsommation%2Fconsommations%3Fp_p_id%3DeConsoconsoDetaille_WAR_eConsoportlet%26p_p_lifecycle%3D2%26p_p_state%3Dnormal%26p_p_mode%3Dview%26p_p_cacheability%3DcacheLevelPage%26p_p_col_id%3Dcolumn-3%26p_p_col_count%3D5%26p_p_col_pos%3D3%26_eConsoconsoDetaille_WAR_eConsoportlet__jsfBridgeAjax%3Dtrue%26_eConsoconsoDetaille_WAR_eConsoportlet__facesViewIdResource%3D%252Fviews%252Fconso%252Fdetaille%252FconsoDetailleViewMode.xhtml&_eConsoconsoDetaille_WAR_eConsoportlet_%3AidFormConsoDetaille%3AidDateDebutConsoDetaille=' +
      startDate +
      '&_eConsoconsoDetaille_WAR_eConsoportlet_%3AidFormConsoDetaille%3AidDateFinConsoDetaille=' +
      endDate +
      '&_eConsoconsoDetaille_WAR_eConsoportlet_%3AidFormConsoDetaille%3ApanelTypeGranularite1=jour&_eConsoconsoDetaille_WAR_eConsoportlet_%3AidFormConsoDetaille%3ApanelTypeGranularite3=mois&_eConsoconsoDetaille_WAR_eConsoportlet_%3AidFormConsoDetaille%3AselecteurVolumeType2=kwh&_eConsoconsoDetaille_WAR_eConsoportlet_%3AidFormConsoDetaille%3AselecteurVolumeType4=kwh&javax.faces.ViewState=' +
      javaxFaces
  }

  try {
    const response = await rp(dataRequest)
    //log('debug', 'reponse getData: ' + response)
    var data = /donneesCourante = ".+"/.exec(response)
    var dates = /tooltipDatesInfo = ".+"/.exec(response)
    return formating(data[0], dates[0])
  } catch (error) {
    throw new Error(errors.VENDOR_DOWN)
  }
}

async function preGetData(javaxFaces) {
  const dataRequest = {
    method: 'POST',
    uri:
      'https://monespace.grdf.fr/web/guest/monespace/particulier/consommation/consommations?p_p_id=eConsoconsoDetaille_WAR_eConsoportlet&p_p_lifecycle=2&p_p_state=normal&p_p_mode=view&p_p_cacheability=cacheLevelPage&p_p_col_id=column-3&p_p_col_count=5&p_p_col_pos=3&_eConsoconsoDetaille_WAR_eConsoportlet__jsfBridgeAjax=true&_eConsoconsoDetaille_WAR_eConsoportlet__facesViewIdResource=%2Fviews%2Fconso%2Fdetaille%2FconsoDetailleViewMode.xhtml',
    jar: cookiejar,
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
    },
    body:
      'javax.faces.partial.ajax=true&javax.faces.source=_eConsoconsoDetaille_WAR_eConsoportlet_%3AidFormConsoDetaille%3Aj_idt139&javax.faces.partial.execute=_eConsoconsoDetaille_WAR_eConsoportlet_%3AidFormConsoDetaille%3Aj_idt139&javax.faces.partial.render=_eConsoconsoDetaille_WAR_eConsoportlet_%3AidFormConsoDetaille&javax.faces.behavior.event=click&javax.faces.partial.event=click&_eConsoconsoDetaille_WAR_eConsoportlet_%3AidFormConsoDetaille=_eConsoconsoDetaille_WAR_eConsoportlet_%3AidFormConsoDetaille&javax.faces.encodedURL=https%3A%2F%2Fmonespace.grdf.fr%2Fweb%2Fguest%2Fmonespace%2Fparticulier%2Fconsommation%2Fconsommations%3Fp_p_id%3DeConsoconsoDetaille_WAR_eConsoportlet%26p_p_lifecycle%3D2%26p_p_state%3Dnormal%26p_p_mode%3Dview%26p_p_cacheability%3DcacheLevelPage%26p_p_col_id%3Dcolumn-3%26p_p_col_count%3D5%26p_p_col_pos%3D3%26_eConsoconsoDetaille_WAR_eConsoportlet__jsfBridgeAjax%3Dtrue%26_eConsoconsoDetaille_WAR_eConsoportlet__facesViewIdResource%3D%252Fviews%252Fconso%252Fdetaille%252FconsoDetailleViewMode.xhtml&javax.faces.ViewState=' +
      javaxFaces
  }

  try {
    const response = await rp(dataRequest)
    return response
  } catch (error) {
    throw new Error(errors.VENDOR_DOWN)
  }
}

function formating(data, dates) {
  const dataArray = data.slice(19, -1).split(',')
  const dateArray = dates.slice(23, -1).split(',Le ')
  var n = -1
  return dataArray.map(value => {
    n++
    return {
      load: parseInt(value, 10),
      time: moment.utc(dateArray[n], 'DD/MM/YYYY').format('YYYY-MM-DD')
    }
  })
}

async function storeData(data) {
  return hydrateAndFilter(data, 'grdf.data', {
    keys: ['time']
  }).then(filteredDocuments => {
    addData(filteredDocuments, 'grdf.data')
  })
}