require "test_helper"
require "fileutils"
require "tmpdir"

class Pressa::Posts::PostRepoTest < Minitest::Test
  def repo
    @repo ||= Pressa::Posts::PostRepo.new
  end

  def test_read_posts_reads_and_organizes_posts_by_year_and_month
    Dir.mktmpdir do |tmpdir|
      posts_dir = File.join(tmpdir, "posts", "2025", "11")
      FileUtils.mkdir_p(posts_dir)

      post_content = <<~MARKDOWN
        ---
        Title: Shredding in November
        Author: Shaun White
        Date: 5th November, 2025
        Timestamp: 2025-11-05T10:00:00-08:00
        ---

        Had an epic day at Whistler. The powder was deep and the lines were short.
      MARKDOWN

      File.write(File.join(posts_dir, "shredding.md"), post_content)

      posts_by_year = repo.read_posts(File.join(tmpdir, "posts"))

      assert_equal(1, posts_by_year.all_posts.length)

      post = posts_by_year.all_posts.first
      assert_equal("Shredding in November", post.title)
      assert_equal("Shaun White", post.author)
      assert_equal("shredding", post.slug)
      assert_equal(2025, post.year)
      assert_equal(11, post.month)
      assert_equal("/posts/2025/11/shredding", post.path)
    end
  end

  def test_read_posts_generates_excerpts_from_post_content
    Dir.mktmpdir do |tmpdir|
      posts_dir = File.join(tmpdir, "posts", "2025", "11")
      FileUtils.mkdir_p(posts_dir)

      post_content = <<~MARKDOWN
        ---
        Title: Test Post
        Author: Greg Graffin
        Date: 5th November, 2025
        Timestamp: 2025-11-05T10:00:00-08:00
        ---

        This is a test post with some content. It should generate an excerpt.

        ![Image](image.png)

        More content with a [link](https://example.net).
      MARKDOWN

      File.write(File.join(posts_dir, "test.md"), post_content)

      posts_by_year = repo.read_posts(File.join(tmpdir, "posts"))
      post = posts_by_year.all_posts.first

      assert_includes(post.excerpt, "test post")
      refute_includes(post.excerpt, "![")
      assert_includes(post.excerpt, "link")
      refute_includes(post.excerpt, "[link]")
    end
  end

  def test_read_posts_merges_multiple_posts_in_same_month
    Dir.mktmpdir do |tmpdir|
      posts_dir = File.join(tmpdir, "posts", "2025", "11")
      FileUtils.mkdir_p(posts_dir)

      File.write(File.join(posts_dir, "first.md"), <<~MARKDOWN)
        ---
        Title: First Post
        Author: Sami Samhuri
        Date: 5th November, 2025
        Timestamp: 2025-11-05T10:00:00-08:00
        ---

        First
      MARKDOWN

      File.write(File.join(posts_dir, "second.md"), <<~MARKDOWN)
        ---
        Title: Second Post
        Author: Sami Samhuri
        Date: 6th November, 2025
        Timestamp: 2025-11-06T10:00:00-08:00
        ---

        Second
      MARKDOWN

      posts_by_year = repo.read_posts(File.join(tmpdir, "posts"))
      month_posts = posts_by_year.by_year.fetch(2025).by_month.fetch(11)

      assert_equal(2, month_posts.posts.length)
      assert_equal(["Second Post", "First Post"], month_posts.sorted_posts.map(&:title))
    end
  end
end
