export const ShellHttpieCodegen = {
  id: "shell-httpie",
  name: "Shell HTTPie",
  generator: ({
    url,
    pathName,
    queryString,
    auth,
    httpUser,
    httpPassword,
    bearerToken,
    method,
    rawInput,
    rawParams,
    rawRequestBody,
    contentType,
    headers,
  }) => {
    const methodsWithBody = ["POST", "PUT", "PATCH", "DELETE"]
    const includeBody = methodsWithBody.includes(method)
    const requestString = []

    let requestBody = rawInput ? rawParams : rawRequestBody
    requestBody = requestBody.replace(/'/g, "\\'")
    if (requestBody.length !== 0 && includeBody) {
      // Send request body via redirected input
      requestString.push(`echo -n $'${requestBody}' | `)
    }

    // Executable itself
    requestString.push(`http`)

    // basic authentication
    if (auth === "Basic Auth") {
      requestString.push(` -a ${httpUser}:${httpPassword}`)
    }

    // URL
    let escapedUrl = `${url}${pathName}${queryString}`
    escapedUrl = escapedUrl.replace(/'/g, "\\'")
    requestString.push(` ${method} $'${escapedUrl}'`)

    // All headers
    if (contentType) {
      requestString.push(` 'Content-Type:${contentType}; charset=utf-8'`)
    }

    if (headers) {
      headers.forEach(({ key, value }) => {
        requestString.push(` $'${key.replace(/'/g, "\\'")}:${value.replace(/'/g, "\\'")}'`)
      })
    }

    if (auth === "Bearer Token" || auth === "OAuth 2.0") {
      requestString.push(` 'Authorization:Bearer ${bearerToken}'`)
    }

    return requestString.join("")
  },
}
