<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Models\Post;
use App\Models\PostCategory;
use Illuminate\Http\Request;

class PostController extends Controller
{
    public function index(Request $request)
    {
        $posts = Post::with('post_categories.category.country_locale')->orderBy('created_at', 'desc')->paginate();

        return view('admin.posts.manage', compact('posts'));
    }

    public function new(Request $request)
    {
        $post = null;

        return view('admin.posts.upsert', compact('post'));

    }

    public function edit(Request $request, $post_id)
    {
        $post = Post::find($post_id);

        if (! is_null($post)) {
            return view('admin.posts.upsert', compact('post'));
        }

        return redirect()->back()->with('error', 'Post does not exist.');
    }

    public function postUpsert(Request $request)
    {

        $post_data = [
            'id' => $request->input('id', null),
            'publish_date' => $request->input('publish_date', null),
            'title' => $request->input('title'),
            'slug' => $request->input('slug'),
            'excerpt' => $request->input('excerpt'),
            'author_id' => intval($request->input('author_id', 1)),
            'featured' => filter_var($request->input('featured'), FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE),
            'featured_image' => $request->input('featured_image'),
            'editor' => 'editorjs',
            'body' => json_decode($request->input('body')),
            'post_format' => 'standard',
            'comment_count' => 0,
            'likes_count' => 0,
            'status' => $request->input('status'),
        ];

        $post_categories = $this->normalizeCategories($request->input('categories'));

        if (! empty($post_data['id'])) {
            // It's an update - find the existing post by its ID
            $existingPost = Post::find($post_data['id']);

            // Check if the post with the given ID exists
            if ($existingPost) {
                // Update the existing post with the new data
                $existingPost->update($post_data);

                // Handle PostCategory records for the existing post
                $existingPostCategoryIds = $existingPost?->post_categories->pluck('id')->toArray();

                // Find the IDs of PostCategory records that should be removed
                $postCategoriesToRemove = array_diff($existingPostCategoryIds, $post_categories);

                // Remove the unwanted PostCategory records
                if (! empty($postCategoriesToRemove)) {
                    PostCategory::whereIn('id', $postCategoriesToRemove)->delete();
                }

                // Find the new PostCategory records that should be added
                $postCategoriesToAdd = array_diff($post_categories, $existingPostCategoryIds);

                // Create the new PostCategory records
                foreach ($postCategoriesToAdd as $categoryId) {
                    PostCategory::create([
                        'post_id' => $existingPost->id,
                        'category_id' => $categoryId,
                    ]);
                }

                // Return a response indicating a successful update
                return response()->json(['message' => 'Post updated successfully', 'action' => 'redirect_back']);
            } else {
                // If the post with the given ID doesn't exist, you can handle the error as per your requirement
                return response()->json(['error' => 'Post not found'], 404);
            }
        } else {
            // It's a new post - create a new record using Post::create
            $newPost = Post::create($post_data);

            // Create the new PostCategory records for the new post
            foreach ($post_categories as $categoryId) {
                PostCategory::create([
                    'post_id' => $newPost->id,
                    'category_id' => $categoryId,
                ]);
            }

            // Return a response indicating a successful creation
            return response()->json(['message' => 'Post created successfully', 'action' => 'redirect_back']);
        }
    }

    private function normalizeCategories($categories)
    {
        if (empty($categories) || is_null($categories)) {
            // If the input is empty or null, return an empty array
            return [];
        } elseif (is_numeric($categories)) {
            // If the input is a numeric value (integer or string), return an array with the integer value
            return [(int) $categories];
        } else {
            // If the input is a string with separated commas or a JSON string that becomes an array of integers, return an array of integers
            if (is_string($categories)) {
                // Attempt to convert the string to an array of integers
                $categoryIds = json_decode($categories, true);

                // Check if the decoding was successful and the result is an array of integers
                if (is_array($categoryIds) && ! empty($categoryIds)) {
                    $categoryIds = array_map('intval', $categoryIds);

                    return $categoryIds;
                }
            }

            // If the input format doesn't match any of the above cases, return an empty array
            return [];
        }
    }
}
