defmodule Core.Posts do
  @moduledoc false

  alias Core.Posts.Post

  def get!(id) do
    Core.Repo.get!(Schema.Post, id)
  end

  def get_published_blog!(%Date{} = publish_date, slug) when is_binary(slug) do
    Post.Query.published()
    |> Post.Query.where_publish_date_and_slug(publish_date, slug)
    |> Core.Repo.one!()
  end

  def get_published_status!(id) do
    Post.Query.published()
    |> Post.Query.where_kind(:status)
    |> Core.Repo.get!(id)
  end

  @recent_posts_count 10

  def get_all_recent_blogs do
    Post.Query.recent_blogs(@recent_posts_count)
    |> Core.Repo.all()
  end

  def get_all_recent_statuses do
    Post.Query.recent_statuses(@recent_posts_count)
    |> Core.Repo.all()
  end

  def change_post(%Schema.Post{} = post \\ %Schema.Post{}, attrs) do
    Post.content_changeset(post, attrs)
  end

  def create_post(attrs) do
    attrs
    |> change_post()
    |> Core.Repo.insert()
  end

  def update_post(%Schema.Post{} = post, attrs) do
    post
    |> change_post(attrs)
    |> Core.Repo.update()
  end

  def create_or_update_post(%Schema.Post{} = post, attrs) do
    post
    |> change_post(attrs)
    |> Core.Repo.insert_or_update()
  end

  def publish_post(%Schema.Post{} = post, published_at \\ DateTime.utc_now()) do
    post
    |> Post.publish_changeset(published_at)
    |> Core.Repo.update()
  end

  def delete_post(%Schema.Post{} = post, deleted_at \\ DateTime.utc_now()) do
    post
    |> Post.delete_changeset(deleted_at)
    |> Core.Repo.update()
  end

  def unpublish_post(%Schema.Post{} = post) do
    post
    |> Post.unpublish_changeset()
    |> Core.Repo.update()
  end

  def undelete_post(%Schema.Post{} = post) do
    post
    |> Post.undelete_changeset()
    |> Core.Repo.update()
  end
end