<?php

declare(strict_types=1);

namespace App\Services;

use App\Repositories\CategoryRepository;
use InvalidArgumentException;
use RuntimeException;

final class CategoryService
{
    public function __construct(private CategoryRepository $categories) {}

    public function save(array $input): void
    {
        $id = (int)($input['id'] ?? 0);
        $name = trim((string)($input['name'] ?? ''));
        if ($name === '') {
            throw new InvalidArgumentException('اسم الفئة مطلوب');
        }

        $parentId = (int)($input['parent_id'] ?? 0);
        $parentId = $parentId > 0 ? $parentId : null;
        $isActive = !empty($input['is_active']) ? 1 : 0;

        if ($id > 0 && $parentId === $id) {
            throw new InvalidArgumentException('لا يمكن اختيار نفس الفئة كفئة رئيسية');
        }

        $data = [
            'name' => $name,
            'parent_id' => $parentId,
            'is_active' => $isActive,
        ];

        if ($id > 0) {
            if (!$this->categories->findById($id)) {
                throw new RuntimeException('الفئة غير موجودة');
            }
            $this->categories->update($id, $data);
            return;
        }

        $this->categories->create($data);
    }

    public function delete(int $id): void
    {
        if ($id <= 0) {
            throw new InvalidArgumentException('فئة غير صالحة');
        }
        if ($this->categories->countItemsUsing($id) > 0) {
            throw new RuntimeException('لا يمكن الحذف: يوجد بيانات مرتبطة');
        }
        $this->categories->delete($id);
    }
}
