import { defineEventHandler, readBody, getQuery  } from 'h3'
import { useRuntimeConfig } from '#imports'
import axios from 'axios'

export default defineEventHandler(async (event) => {
  const config = useRuntimeConfig()
  const API_BASE_URL = config.public.apiBaseUrl
  //const table = event.context.params?.table
  //const apiUrl = `${API_BASE_URL}${table}`

  //const basePath = event.context.params?.basePath  // dynamic part like "administrator"
  const resource = event.context.params?.resource  // e.g., "roles"
 
  const query = getQuery(event)
  const queryString = new URLSearchParams(query).toString()


  const token = getHeaders(event)['authorization']
  const route_id = getHeaders(event)['route_id']
  const download = getHeaders(event)['download']
  const content_type = getHeaders(event)['content-type'] == null ? 'application/json' : getHeaders(event)['content-type'];

  
  if (!resource) {
    return { error: 'Invalid API route parameters' }
  }

  const apiUrl = `${API_BASE_URL}${resource}`

  const method = event.node.req.method
  const body = method !== 'GET' ? await readBody(event) : null


  if(resource != "login" && !token){
    return { statusCode: 401, message: 'Unauthorized: No token provided',errors: [] }
  }

  const headerData = {
    //'Content-Type': content_type, // Ensures JSON data
    //'Content-Type': 'multipart/form-data',
     Authorization: token, // Include token
     'route_id': route_id
  };


  try {
    let response
    if (method === 'GET') response = await axios.get(`${apiUrl}?${queryString}`,{headers: headerData})
    else if (download === 'yes') {
      console.log("download connected........");
      response = await axios.post(`${apiUrl}`,body,{
        responseType: 'blob',
        headers: {
          Authorization: token,
          Accept: 'application/pdf'
        }
      })
    }
    else if (method === 'POST' && download == undefined) response = await axios.post(apiUrl, body,{headers: headerData})
    else if (method === 'PUT') response = await axios.put(`${apiUrl}`, body, {headers: headerData})
    else if (method === 'DELETE') response = await axios.delete(`${apiUrl}`,{headers: headerData})
    
    return response?.data

  } catch (error ) {
    
    if (axios.isAxiosError(error) && error.response) {
      return {
        statusCode: error.response.status,
        message: error.response.data.message || 'An error occurred',
        errors: error.response.data.errors || null, // Include validation errors
      }
    }else{
      return {
        statusCode: 500,
        message: 'Internal Server Error',
        errors: []
      }
    }

  }
})