<?php

declare(strict_types=1);

namespace App\Services;

use App\Core\Validator;
use App\Repositories\FournisseurRepository;

final class FournisseurService extends BaseService
{
    public function __construct(
        private readonly FournisseurRepository $fournisseurs = new FournisseurRepository(),
    ) {
    }

    public function listActive(): array
    {
        return $this->fournisseurs->allActive();
    }

    public function listActiveWithStats(): array
    {
        return $this->fournisseurs->allActiveWithStats();
    }

    public function listWithStats(string $status = 'active'): array
    {
        $status = in_array($status, ['active', 'archived', 'all'], true) ? $status : 'active';
        return $this->fournisseurs->allWithStats($status);
    }

    public function formData(?int $fournisseurId = null): array
    {
        $fournisseur = $fournisseurId ? $this->fournisseurs->find($fournisseurId) : null;

        if ($fournisseurId !== null && !$fournisseur) {
            throw new \RuntimeException('Fournisseur introuvable.');
        }

        return [
            'fournisseur' => $fournisseur ?? [
                'code_fournisseur' => $this->fournisseurs->nextCode(),
                'pays' => 'Maroc',
                'actif' => 1,
                'delai_livraison' => null,
            ],
        ];
    }

    public function create(array $data): int
    {
        if (empty($data['code_fournisseur'])) {
            $data['code_fournisseur'] = $this->fournisseurs->nextCode();
        }

        return $this->fournisseurs->create($data);
    }

    public function update(int $id, array $data): void
    {
        if ($id <= 0) {
            throw new \RuntimeException('Identifiant fournisseur invalide.');
        }

        $this->fournisseurs->update($id, $data);
    }

    public function deactivate(int $id): void
    {
        if ($id <= 0) {
            throw new \RuntimeException('Identifiant fournisseur invalide.');
        }

        $this->fournisseurs->deactivate($id);
    }

    public function activate(int $id): void
    {
        if ($id <= 0) {
            throw new \RuntimeException('Identifiant fournisseur invalide.');
        }

        $this->fournisseurs->activate($id);
    }

    public function find(int $id): array
    {
        $fournisseur = $this->fournisseurs->find($id);

        if (!$fournisseur) {
            throw new \RuntimeException('Fournisseur introuvable.');
        }

        return $fournisseur;
    }

    public function findWithStats(int $id): array
    {
        $fournisseur = $this->find($id);

        return [
            'fournisseur' => $fournisseur,
            'stats' => $this->fournisseurs->stats($id),
        ];
    }

    public function validator(array $data): Validator
    {
        return (new Validator())
            ->required('code_fournisseur', $data['code_fournisseur'] ?? '', 'Code fournisseur')
            ->required('raison_sociale', $data['raison_sociale'] ?? '', 'Raison sociale')
            ->email('email', $data['email'] ?? '', 'E-mail');
    }
}
