<?php

namespace App\Services;

use App\Repositories\CategoryRepo;

class CategoryService
{
  private CategoryRepo $categoryRepo;

  public function __construct()
  {
    $this->categoryRepo = new CategoryRepo();
  }

  public function findAll()
  {
    return $this->categoryRepo->findAll();
  }

  public function findById(int $id)
  {
    return $this->categoryRepo->findById($id);
  }

  public function save(string $namaKategori, ?string $deskripsi = null)
  {
    $this->isValid($namaKategori);

    return $this->categoryRepo->save($namaKategori, $deskripsi);
  }

  public function update(int $id, string $namaKategori, ?string $deskripsi = null)
  {
    // find by id
    $kategori = $this->categoryRepo->findById($id);

    if (empty($kategori)) {
      throw new \Exception('Kategori tidak ditemukan.');
    }

    $this->isValid($namaKategori, $id);

    return $this->categoryRepo->update($id, $namaKategori, $deskripsi);
  }

  public function delete(int $id)
  {
    return $this->categoryRepo->delete($id);
  }

  // validation
  private function validate(string $namaKategori, ?int $id = null): array
  {
    $errors = [];

    if (trim($namaKategori) === '') {
      $errors['namaKategori'] = 'Nama kategori wajib diisi.';
    }

    // nama kategori harus unik
    $kategori = $this->categoryRepo->findByNamaKategori($namaKategori);

    if ($kategori !== null && count($kategori) > 0 && $kategori[0]->getId() !== $id) {
      $errors['namaKategori'] = 'Nama kategori sudah ada.';
    }

    return $errors;
  }

  private function isValid(string $namaKategori, ?int $id = null): void
  {
    $errors = $this->validate($namaKategori, $id);

    if (count($errors) > 0) {
      throw new \Exception(implode(', ', $errors));
    }
  }
}
