<?php

declare(strict_types=1);

namespace App\Services;

/**
 * Base commune des services Darlink.
 *
 * Les Services portent la logique métier. Les contrôleurs doivent rester légers
 * et déléguer les opérations métier à ces classes.
 */
abstract class BaseService
{
    protected function text(mixed $value): string
    {
        return trim((string) ($value ?? ''));
    }

    protected function number(mixed $value): float
    {
        if ($value === null || $value === '') {
            return 0.0;
        }

        if (is_int($value) || is_float($value)) {
            return (float) $value;
        }

        if (is_numeric($value)) {
            return (float) $value;
        }

        $value = (string) $value;
        $value = str_replace(["\xc2\xa0", ' ', '%', 'MAD', 'DH', 'Dhs', 'dhs'], '', $value);
        $value = str_replace(',', '.', $value);
        $value = preg_replace('/[^0-9.\-]/', '', $value) ?? '';

        return is_numeric($value) ? (float) $value : 0.0;
    }

    protected function positiveInt(mixed $value): int
    {
        return max(0, (int) $value);
    }
}
