<?php

// app/Services/TabunganService.php
namespace App\Services;

use App\Models\ProdukTabungan;
use App\Models\Tabungan;
use App\Repositories\TabunganRepository;
use Carbon\Carbon;
use Exception;
use Illuminate\Database\Eloquent\Collection;

class TabunganService
{
    protected $tabunganRepository;
    protected $jurnalService;

    public function __construct(TabunganRepository $tabunganRepository, JurnalService $jurnalService)
    {
        $this->tabunganRepository = $tabunganRepository;
        $this->jurnalService = $jurnalService;
    }

    public function getAllTabungan(): Collection
    {
        return $this->tabunganRepository->getAll();
    }

    public function createTabungan(array $data): Tabungan
    {
        $latset_tabungan = $this->tabunganRepository->getLastest();
        // format tabungan id = T00001
        // Ambil angka dari id terakhir, misal "T00005" -> 5
        if ($latset_tabungan && preg_match('/T(\d{5})/', $latset_tabungan->rekening, $matches)) {
            $latest_id = (int)$matches[1];
        } else {
            $latest_id = 0;
        }
        $data['rekening'] = "T" . str_pad($latest_id + 1, 5, "0", STR_PAD_LEFT);
        $data['tgl_buka'] = Carbon::now();

        return $this->tabunganRepository->createTabungan($data);
    }

    public function updateTabungan($id, array $data): Tabungan
    {
        $tabungan = $this->tabunganRepository->findById($id);
        if (!$tabungan) {
            throw new \Exception('Tabungan tidak ditemukan');
        }

        unset($data['saldo']);

        return $this->tabunganRepository->updateTabungan($id, $data);
    }

    public function findById($id): ?Tabungan
    {
        return $this->tabunganRepository->findById($id);
    }

    public function deleteTabungan($id) {}

    public function findByAnggotaId($anggotaId): Collection
    {
        return $this->tabunganRepository->findByAnggotaId($anggotaId);
    }

    public function getRiwayatTransaksiTabungan($rekening, $tgl_awal, $tgl_akhir)
    {
        return $this->tabunganRepository->getRiwayatTransaksiTabungan($rekening, $tgl_awal, $tgl_akhir);
    }

    public function getAllProduk()
    {
        return $this->tabunganRepository->getAllProduk();
    }

    public function findProdukById($id): ?ProdukTabungan
    {
        return $this->tabunganRepository->findProdukById($id);
    }

    public function createProduk(array $data)
    {
        return $this->tabunganRepository->createProduk($data);
    }

    public function updateProduk($id, array $data)
    {

        $produk = $this->tabunganRepository->findProdukById($id);
        if (!$produk) {
            throw new \Exception('Produk tabungan tidak ditemukan');
        }

        if ($data['nama'] && $data['nama'] != $produk->nama) {
            $produk = $this->tabunganRepository->findProdukByName($data['nama']);
            if ($produk) {
                throw new \Exception('duplikat nama produk');
            };
        }

        return $this->tabunganRepository->updateProduk($id, $data);
    }

    public function deleteProdukTabungan($id)
    {
        $produk = $this->tabunganRepository->findProdukById($id);
        if (!$produk) {
            throw new \Exception('Produk tabungan tidak ditemukan');
        }
        return $this->tabunganRepository->deleteProdukTabungan($id);
    }
}
