defmodule TasksComponent do
  use PlannerWeb, :live_component

  alias Planner.Tasks
  alias Planner.Tasks.Task

  def update(%{:changeset => changeset, :id => _id}, socket) do
    {:ok, assign(socket, :changeset, changeset)}
  end

  def update(assigns, socket) do
    socket =
      socket
      |> assign(assigns)
      |> assign(:changeset, Tasks.change_task(%Task{}))

    {:ok, socket}
  end

  def render(assigns) do
    ~L"""
    <div class="content">
      <%= f = form_for(@changeset, "#", [phx_submit: "new-task"]) %>
        <div id="adder" class="field">
          <div class="control">
            <%= text_input(f,
              :value,
              placeholder: "add new task",
              class: "input", autocomplete: "off"
            )%>
          </div>
          <%= error_tag(f, :value) %>
        </div>
      </form>

      <%= if(!is_nil(@active_plan)) do %>
        <div
          id="deleter"
          phx-hook="DeleteDropper"
          data-drop="<%= @active_plan.id %>"
          class="has-background-danger"
          style="height: 38px; width: 100%"
          hidden=true
        ></div>
      <% end %>

      <ul class="tasks">
        <%= for task <- @tasks do %>
          <%= live_component(@socket,
            TaskComponent,
            id: "task:#{task.id}",
            task: task,
            plans: @plans,
            live_action: @live_action,
            is_active: @active_task == task.id,
            route_show_task: @route_show_task,
            route_edit_task: @route_edit_task,
            route_index_tasks: @route_index_tasks
          )%>
        <% end %>
      </ul>
    </div>
    """
  end
end

defmodule TaskComponent do
  use Phoenix.LiveComponent

  alias Planner.Tasks.Task

  import PlannerWeb.Util

  def render(assigns) do
    ~L"""
    <li>
      <div>
        <div class="is-pulled-left">
          <%= case @task.finished_at do %>
            <% nil -> %>
              <button
                type="button"
                role="checkbox"
                class="doit"
                phx-click="finish-task"
                phx-value-task-id="<%= @task.id %>">
              </button>
            <% _ -> %>
              !
            <% end %>
        </div>
        <div class="ml-5-5">
          <%= if(@is_active) do %>
            <%= case @live_action do %>
              <% :show_task -> %>
                <%= live_component(@socket,
                  TaskDetailsComponent,
                  id: "task_details:#{@task.id}",
                  task: @task,
                  route_index_tasks: @route_index_tasks,
                  route_edit_task: @route_edit_task
                )%>
              <% :edit_task -> %>
                 <%= live_component(@socket,
                  TaskEditComponent,
                  id: "task_edit:#{@task.id}",
                  task: @task,
                  plans: @plans
                )%>
              <% end %>
          <% else %>
            <%= live_patch(to: @route_show_task.(@socket, @task.id),
              style: "display: block;"
            ) do %>
              <div class="value">
                <%= md_to_html(Task.preview(@task)) %>
              </div>
            <% end %>
            <%= if(not is_nil(@task.due_at)) do %>
              <div class="tags mb-0">
                <span class="tag">
                  due: <%= @task.due_at %>
                </span>
              </div>
            <% end %>
          <% end %>
        </div>
      </div>
    </li>
    """
  end
end

defmodule TaskDetailsComponent do
  use PlannerWeb, :live_component

  def render(assigns) do
    ~L"""
    <div class="box" id="task-details-<%= @task.id %>" draggable="true" phx-hook="Dragger" data-task-id="<%= @task.id %>">
      <%= live_patch("",
        to: @route_index_tasks.(@socket),
        class: "delete is-pulled-right"
      ) %>
      <%= if(not is_nil(@task.due_at) or not is_nil(@task.finished_at) or length(@task.plans) == 0) do %>
        <div class="tags">
          <%= if(not is_nil(@task.due_at)) do %>
            <span class="tag is-warning">
              due: <%= @task.due_at %>
            </span><% end %>
          <%= if(not is_nil(@task.finished_at)) do %>
            <span class="tag is-success">
              completed
            </span><% end %>
          <%= if(length(@task.plans) == 0) do %>
            <span class="tag is-danger">
              unfiled
            </span>
          <% end %>
        </div>
      <% end %>

      <div class="mb-5">
        <%= md_to_html(@task.value) %>
      </div>

      <div class="tags">
        <span class="tag is-light">updated: <%= @task.updated_at %></span>
        <span class="tag is-light">created: <%= @task.inserted_at %></span>
      </div>

      <div class="buttons has-addons">
        <%= live_patch("edit",
          to: @route_edit_task.(@socket, @task.id),
          class: "button is-dark is-small"
        ) %>
      </div>
    </div>
    """
  end
end

defmodule TaskEditComponent do
  use PlannerWeb, :live_component

  alias Planner.Tasks

  def update(%{:changeset => changeset, :id => _id}, socket) do
    {:ok, assign(socket, :changeset, changeset)}
  end

  def update(assigns, socket) do
    socket =
      socket
      |> assign(assigns)
      |> assign(:changeset, Tasks.change_task(assigns.task))

    {:ok, socket}
  end

  def render(assigns) do
    ~L"""
    <div class="box">
      <%= f = form_for(@changeset, "#", [phx_submit: "save-task"]) %>
       <%= hidden_input(f, :id) %>

        <div class="field">
          <div class="control">
            <%= textarea(f,
              :value,
              required: true,
              class: "textarea",
              placeholder: "task",
              autocomplete: "off"
            ) %>
          </div>
          <%= error_tag(f, :value) %>
        </div>

        <div class="field">
          <%= label(f, :due_at, class: "label") do %>
            due (YYYY-MM-DD HH:MM)
          <% end %>
          <div class="control">
            <%= text_input(f,
              :due_at,
              class: "input",
              placeholder: "YYYY-MM-DD HH:MM",
              autocomplete: "off"
            ) %>
          </div>
          <%= error_tag(f, :due_at) %>
        </div>

        <div class="field">
          <label class="label">plans</label>
          <div class="control">
            <div class="select is-multiple is-dark">
            <%= multiple_select(f,
              :plans,
              Enum.map(@plans, &({&1.name, &1.id})),
              selected: Enum.map(@task.plans, &(&1.id))
            ) %>
            </div>
          </div>
        </div>

        <div class="field">
          <div class="control">
            <%= submit("save", class: "button is-dark is-small") %>
          </div>
        </div>
      </form>
    </div>
    """
  end
end