<?php

declare(strict_types=1);

namespace App\Services;

use App\Repositories\UnitRepository;
use InvalidArgumentException;
use RuntimeException;

final class UnitService
{
    public function __construct(private UnitRepository $units) {}

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

        $symbol = trim((string)($input['symbol'] ?? '')) ?: null;
        $baseUnitId = (int)($input['base_unit_id'] ?? 0);
        $baseUnitId = $baseUnitId > 0 ? $baseUnitId : null;
        $factor = (float)($input['factor_to_base'] ?? 1);
        if ($factor <= 0) {
            $factor = 1;
        }

        if ($baseUnitId === null) {
            $factor = 1;
        } else {
            if ($id > 0 && $baseUnitId === $id) {
                throw new InvalidArgumentException('لا يمكن اختيار نفس الوحدة كوحدة أساسية');
            }
            $baseUnit = $this->units->findById($baseUnitId);
            if (!$baseUnit) {
                throw new RuntimeException('الوحدة الأساسية غير موجودة');
            }
            if ($baseUnit['base_unit_id'] !== null) {
                throw new InvalidArgumentException('اختر وحدة أساسية فقط (ليست إجمالية)');
            }
            if ($factor < 1) {
                $factor = 1;
            }
        }

        $data = [
            'name' => $name,
            'symbol' => $symbol,
            'base_unit_id' => $baseUnitId,
            'factor_to_base' => $factor,
        ];

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

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

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