import { IncomingMessage } from "http";
import { parse } from "url";
import { ParsedRequest } from "./types";

export function parseRequest(req: IncomingMessage) {
  console.log("HTTP " + req.url);
  const { pathname, query } = parse(req.url || "/", true);
  const {
    fontSize,
    images,
    widths,
    heights,
    theme,
    md,

    // Attributes for Manifold card:
    question,
    probability,
    metadata,
    creatorName,
    creatorUsername,
    creatorAvatarUrl,
  } = query || {};

  if (Array.isArray(fontSize)) {
    throw new Error("Expected a single fontSize");
  }
  if (Array.isArray(theme)) {
    throw new Error("Expected a single theme");
  }

  const arr = (pathname || "/").slice(1).split(".");
  let extension = "";
  let text = "";
  if (arr.length === 0) {
    text = "";
  } else if (arr.length === 1) {
    text = arr[0];
  } else {
    extension = arr.pop() as string;
    text = arr.join(".");
  }

  // Take a url query param and return a single string
  const getString = (stringOrArray: string[] | string | undefined): string => {
    if (Array.isArray(stringOrArray)) {
      // If the query param is an array, return the first element
      return stringOrArray[0];
    }
    return stringOrArray || "";
  };

  const parsedRequest: ParsedRequest = {
    fileType: extension === "jpeg" ? extension : "png",
    text: decodeURIComponent(text),
    theme: theme === "dark" ? "dark" : "light",
    md: md === "1" || md === "true",
    fontSize: fontSize || "96px",
    images: getArray(images),
    widths: getArray(widths),
    heights: getArray(heights),

    question:
      getString(question) || "Will you create a prediction market on Manifold?",
    probability: getString(probability) || "85%",
    metadata: getString(metadata) || "Jan 1  •  M$ 123 pool",
    creatorName: getString(creatorName) || "Manifold Markets",
    creatorUsername: getString(creatorUsername) || "ManifoldMarkets",
    creatorAvatarUrl: getString(creatorAvatarUrl) || "",
  };
  parsedRequest.images = getDefaultImages(parsedRequest.images);
  return parsedRequest;
}

function getArray(stringOrArray: string[] | string | undefined): string[] {
  if (typeof stringOrArray === "undefined") {
    return [];
  } else if (Array.isArray(stringOrArray)) {
    return stringOrArray;
  } else {
    return [stringOrArray];
  }
}

function getDefaultImages(images: string[]): string[] {
  const defaultImage = "https://manifold.markets/logo.png";

  if (!images || !images[0]) {
    return [defaultImage];
  }
  return images;
}