From fc73f30dd06f3a386d195dbbee909734dcfad162 Mon Sep 17 00:00:00 2001
From: Joao P Dubas <joao.dubas@gmail.com>
Date: Tue, 22 Jun 2021 01:56:14 +0000
Subject: [PATCH] [day-01] setup imc calc and route

---
 lib/wabanex/imc.ex                            | 32 +++++++++++++++++++
 lib/wabanex_web/controllers/imc_controller.ex | 20 ++++++++++++
 lib/wabanex_web/router.ex                     |  2 ++
 students.csv                                  |  5 +++
 4 files changed, 59 insertions(+)
 create mode 100644 lib/wabanex/imc.ex
 create mode 100644 lib/wabanex_web/controllers/imc_controller.ex
 create mode 100644 students.csv

diff --git a/lib/wabanex/imc.ex b/lib/wabanex/imc.ex
new file mode 100644
index 0000000..ef14632
--- /dev/null
+++ b/lib/wabanex/imc.ex
@@ -0,0 +1,32 @@
+defmodule Wabanex.IMC do
+  def calculate(%{"filename" => filename}) do
+    filename
+    |> File.read()
+    |> handle_file()
+  end
+
+  defp handle_file({:ok, content}) do
+    data =
+      content
+      |> String.trim()
+      |> String.split("\n")
+      |> Enum.map(&parse_line/1)
+      |> Enum.into(%{})
+
+    {:ok, data}
+  end
+
+  defp handle_file({:error, _reason}) do
+    {:error, "Error while opening the file"}
+  end
+
+  defp parse_line(line) do
+    line
+    |> String.split(",")
+    |> List.update_at(1, &String.to_float/1)
+    |> List.update_at(2, &String.to_float/1)
+    |> calculate_imc()
+  end
+
+  defp calculate_imc([name, height, weight]), do: {name, weight / :math.pow(height / 100, 2)}
+end
diff --git a/lib/wabanex_web/controllers/imc_controller.ex b/lib/wabanex_web/controllers/imc_controller.ex
new file mode 100644
index 0000000..8defa75
--- /dev/null
+++ b/lib/wabanex_web/controllers/imc_controller.ex
@@ -0,0 +1,20 @@
+defmodule WabanexWeb.IMCController do
+  use WabanexWeb, :controller
+
+  alias Wabanex.IMC
+
+  def index(conn, params) do
+    params
+    |> IMC.calculate()
+    |> handle_response(conn)
+  end
+
+  def handle_response({:ok, result}, conn), do: render_response(conn, :ok, result)
+  def handle_response({:error, result}, conn), do: render_response(conn, :bad_request, result)
+
+  defp render_response(conn, status, result) do
+    conn
+    |> put_status(status)
+    |> json(%{result: result})
+  end
+end
diff --git a/lib/wabanex_web/router.ex b/lib/wabanex_web/router.ex
index 8804679..4608f2b 100644
--- a/lib/wabanex_web/router.ex
+++ b/lib/wabanex_web/router.ex
@@ -7,6 +7,8 @@ defmodule WabanexWeb.Router do
 
   scope "/api", WabanexWeb do
     pipe_through :api
+
+    get "/", IMCController, :index
   end
 
   # Enables LiveDashboard only for development
diff --git a/students.csv b/students.csv
new file mode 100644
index 0000000..162f5b0
--- /dev/null
+++ b/students.csv
@@ -0,0 +1,5 @@
+João,168.0,90.0
+Claudio,172.0,90.0
+Americo,169.0,70.0
+Ana,165.0,58.0
+Luiz,180.0,90.0