lib/griglia.ex

defmodule Griglia do
  @y_rows 4
  @x_cols 2

  @x_spazio 8 + 20
  @y_spazio 14 + 2

  @pt_base {0, 0}

  def crea(y_rows \\ @y_rows, x_cols \\ @x_cols) do
    for c_x <- 1..x_cols do
      for r_y <- 1..y_rows do
        elementi_in_colonna_precedenti = (c_x - 1) * y_rows
        n = (elementi_in_colonna_precedenti + r_y) |> Integer.to_string()
        %{n => %{col_x: c_x, row_y: r_y}}
      end
    end
    |> List.flatten()
  end

  def spazia(griglia \\ crea()) do
    Enum.map(griglia, fn e ->
      calcola_punto_base_griglia(e, @pt_base, @x_spazio, @y_spazio)
    end)
  end

  def calcola_punto_base_griglia(e, pt \\ @pt_base, xs \\ @x_spazio, ys \\ @y_spazio) do
    # {"1", 1,   1, {0, 0}, 28, 16}
    # {n, c_x, r_y,     pt, xs, ys}

    [{n, %{col_x: c_x, row_y: r_y}}] = Map.to_list(e)
    {pt_x, pt_y} = pt

    pt_new_x = pt_x + xs * (c_x - 1)
    pt_new_y = pt_y + ys * (r_y - 1)

    {n, c_x, r_y, pt, xs, ys, {pt_new_x, pt_new_y}}
  end

  def crea_rect(ele_grigla) do
    {n, c_x, r_y, pt, xs, ys, {pt_new_x, pt_new_y}} = ele_grigla

    {"rectangle", {n, c_x, r_y, pt, xs, ys, {pt_new_x, pt_new_y}}}
  end
end