<?php

namespace App\Services;

use App\Models\Bank;
use App\Models\PenempatanBank;
use App\Repositories\PenempatanBankRepository;
use Illuminate\Database\Eloquent\Collection;
use Exception;

class PenempatanBankService
{
    protected $penempatanRepository;

    public function __construct(PenempatanBankRepository $penempatanRepository)
    {
        $this->penempatanRepository = $penempatanRepository;
    }

    public function getAllPenempatanBank(): Collection
    {
        return $this->penempatanRepository->getAll();
    }

    public function findById(string $id): ?PenempatanBank
    {
        return $this->penempatanRepository->findById($id);
    }

    public function findByNama(string $nama): ?PenempatanBank
    {
        return $this->penempatanRepository->findByNama($nama);
    }

    public function createPenempatanBank(array $data): PenempatanBank
    {
        $count = $this->penempatanRepository->count();
        $data['id'] = "ABA" . str_pad($count + 1, 5, "0", STR_PAD_LEFT);

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

    public function updatePenempatanBank(string $id, array $data): ?PenempatanBank
    {
        $role = $this->penempatanRepository->findById($id);
        if ($role->nama != $data['nama']) {
            $role_nama = $this->penempatanRepository->findByNama($data['nama']);
            if ($role_nama) {
                throw new \Exception("Duplikat nama");
            };
        }

        if (!$role) {
            throw new Exception("Rekening tidak ditemukan");
        }

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

    public function deletePenempatanBank(string $id): bool
    {
        $role = $this->penempatanRepository->findById($id);
        if (!$role) {
            throw new Exception('Rekening tidak ditemukan.');
        }

        return $this->penempatanRepository->delete($role);
    }

    public function getAllBank(): Collection
    {
        return $this->penempatanRepository->getAllBank();
    }

    public function getBankById($id): ?Bank
    {
        return $this->penempatanRepository->findBankById($id);
    }

    public function createBank(array $data): Bank
    {
        return $this->penempatanRepository->createBank($data);
    }

    public function updateBank(int $id, array $data): ?Bank
    {
        $bank = $this->penempatanRepository->findBankById($id);
        if (!$bank) {
            throw new Exception("Bank tidak ditemukan");
        }

        if ($data['nama'] && $data['nama'] != $bank->nama) {
            $bank = $this->penempatanRepository->findBankByName($data['nama']);
            if ($bank) {
                throw new \Exception('duplikat nama bank');
            };
        }

        return $this->penempatanRepository->updateBank($id, $data);
    }

    public function deleteBank($id)
    {
        $bank = $this->penempatanRepository->findBankById($id);
        if (!$bank) {
            throw new Exception('Bank tidak ditemukan.');
        }

        return $this->penempatanRepository->deleteBank($id);
    }
}
