defmodule Blogex.Test.PostBuilder do
  @moduledoc """
  Builds `%Blogex.Post{}` structs for tests.

  Call `build/0` for a post with sensible defaults, or `build/1`
  with a keyword list to override only the fields that matter for
  your specific test.

      build()                                    # generic post
      build(title: "Specific Title")             # override one field
      build(tags: ~w(elixir otp), blog: :eng)    # override several
      build(published: false)                    # draft post
  """

  @defaults %{
    id: "a-blog-post",
    title: "A Blog Post",
    author: "Test Author",
    body: "<p>Post body.</p>",
    description: "A test post",
    date: ~D[2026-01-15],
    tags: ["general"],
    blog: :test_blog,
    published: true
  }

  @doc "Build a post with defaults, merging any overrides."
  def build(overrides \\ []) do
    attrs = Map.merge(@defaults, Map.new(overrides))
    struct!(Blogex.Post, attrs)
  end

  @doc "Build a list of n posts with sequential dates (newest first)."
  def build_many(n, overrides \\ []) do
    Enum.map(1..n, fn i ->
      build(
        Keyword.merge(
          [
            id: "post-#{i}",
            title: "Post #{i}",
            date: Date.add(~D[2026-01-01], n - i)
          ],
          overrides
        )
      )
    end)
  end
end
