const express = require ('express')
const axios = require ('axios')
const plantsRouter = express.Router ()
const CONFIG = require ('./config')


async function getAccessToken () {
  const formData = new FormData ()
  formData.append ('grant_type', 'client_credentials')
  formData.append ('client_id', CONFIG.CLIENT_ID)
  formData.append ('client_secret', CONFIG.CLIENT_SECRET)

  try {
    const response = await axios.post (
      'https://open.plantbook.io/api/v1/token/',
      formData,
      {
        headers: {'Content-Type': 'multipart/form-data'},
      }
    )
    if (response.data && response.data.access_token) {
      console.log ('Access token retrieved:', response.data.access_token)
      return response.data.access_token
    } else {
      console.error ('Error: access_token not found in response')
      return null
    }
  } catch (error) {
    console.error (
      'Error fetching access token:',
      error.response ? error.response.data : error.message
    )
    return null
  }
}

async function fetchPlantData (plantId) {
  const accessToken = await getAccessToken ()
  if (!accessToken) {
    return null
  }
  try {
    const response = await axios.get (
      `https://open.plantbook.io/api/v1/plant/detail/${encodeURIComponent (plantId)}/`,
      {
        headers: {
          Authorization: `Bearer ${accessToken}`,
        },
      }
    )
    return response.data
  } catch (error) {
    console.error (
      'Error fetching plant data:',
      error.response ? error.response.data : error.message
    )
    return null
  }
}

plantsRouter.get ('/list', async (req, res) => {
  const accessToken = await getAccessToken ()
  if (!accessToken) {
    res.status (500).send ({message: 'Error obtaining access token'})
    return
  }
  try {
    const alias = req.query.alias || 'monstera'
    const response = await axios.get (
      'https://open.plantbook.io/api/v1/plant/search',
      {
        headers: {
          Authorization: `Bearer ${accessToken}`,
        },
        params: {
          alias: alias,
        },
      }
    )

    const plantsList = response.data.results

    const plants = await Promise.all (
      plantsList.map (async plant => {
        const plantDetails = await fetchPlantData (plant.pid)
        return {
          id: plant.pid,
          alias: plant.alias,
          display_name: plant.display_name,
          image_url: plantDetails ? plantDetails.image_url : null,
          max_light: plantDetails ? plantDetails.max_light : null,
          min_light: plantDetails ? plantDetails.min_light : null,
          max_temp: plantDetails ? plantDetails.max_temp : null,
          min_temp: plantDetails ? plantDetails.min_temp : null,
          max_env_humid: plantDetails ? plantDetails.max_env_humid : null,
          min_env_humid: plantDetails ? plantDetails.min_env_humid : null,
          max_soil_moist: plantDetails ? plantDetails.max_soil_moist : null,
          min_soil_moist: plantDetails ? plantDetails.min_soil_moist : null,
          max_soil_ec: plantDetails ? plantDetails.max_soil_ec : null,
          min_soil_ec: plantDetails ? plantDetails.min_soil_ec : null,
        }
      })
    )

    res.send ({results: plants})
  } catch (error) {
    console.error (
      'Error fetching plant list:',
      error.response ? error.response.data : error.message
    )
    res.status (500).send ({message: 'Error fetching plant list'})
  }
})

plantsRouter.get ('/:id', async (req, res) => {
  const plantId = req.params.id
  const plantData = await fetchPlantData (plantId)

  if (plantData) {
    const detailedPlantData = {
      id: plantData.pid,
      display_name: plantData.display_name,
      alias: plantData.alias,
      max_light: plantData.max_light,
      min_light: plantData.min_light,
      max_temperature: plantData.max_temp,
      min_temperature: plantData.min_temp,
      max_humidity: plantData.max_env_humid,
      min_humidity: plantData.min_env_humid,
      max_soil_moisture: plantData.max_soil_moist,
      min_soil_moisture: plantData.min_soil_moist,
      max_soil_ec: plantData.max_soil_ec,
      min_soil_ec: plantData.min_soil_ec,
      image_url: plantData.image_url,
    }

    res.send (detailedPlantData)
  } else {
    res.status (404).send ({message: 'Plant not found'})
  }
})

module.exports = plantsRouter