<?php

namespace App\Services\Posts;

use App\Models\Post;
use App\Models\PostComment;
use App\Models\PostReaction;
use Illuminate\Support\Facades\DB;

/**
 * Maintains cached counter columns on the posts table.
 * Called from controllers when reactions/comments are created or deleted.
 */
class PostCountersService
{
    public function incrementReactions(Post $post): void
    {
        $post->increment('reactions_count');
    }

    public function decrementReactions(Post $post): void
    {
        DB::table('posts')
            ->where('id', $post->id)
            ->where('reactions_count', '>', 0)
            ->decrement('reactions_count');
    }

    public function incrementComments(Post $post): void
    {
        $post->increment('comments_count');
    }

    public function decrementComments(Post $post): void
    {
        DB::table('posts')
            ->where('id', $post->id)
            ->where('comments_count', '>', 0)
            ->decrement('comments_count');
    }

    /**
     * Recompute both counters from scratch (repair tool).
     */
    public function recompute(Post $post): void
    {
        Post::withoutTimestamps(function () use ($post) {
            $post->update([
                'reactions_count' => PostReaction::where('post_id', $post->id)->count(),
                'comments_count'  => PostComment::where('post_id', $post->id)->whereNull('deleted_at')->count(),
                'saves_count'     => \App\Models\PostSave::where('post_id', $post->id)->count(),
            ]);
        });
    }

    public function incrementSaves(Post $post): void
    {
        $post->increment('saves_count');
    }

    public function decrementSaves(Post $post): void
    {
        DB::table('posts')
            ->where('id', $post->id)
            ->where('saves_count', '>', 0)
            ->decrement('saves_count');
    }
}
