<?php

namespace App\Repositories;

use App\Models\ProdukTabungan;
use App\Models\Tabungan;
use App\Models\TransaksiTabungan;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Collection;

class TabunganRepository
{
    protected $tabungan;

    public function __construct(Tabungan $tabungan)
    {
        $this->tabungan = $tabungan;
    }

    public function getAll(): Collection
    {
        return $this->tabungan->with(['anggota', 'produk'])->get();
    }

    public function findByAnggotaId($anggotaId): Collection
    {
        return $this->tabungan->where('anggota_id', $anggotaId)->all();
    }

    public function findByRekening($rekening): ?Tabungan
    {
        return $this->tabungan->where('rekening', $rekening)->first();
    }

    public function findById($id): ?Tabungan
    {
        return $this->tabungan->with(['anggota', 'produk'])->find($id);
    }

    public function updateTabungan($id, array $data): Tabungan
    {
        $tabungan = $this->findById($id);
        $tabungan->update($data);
        return $tabungan;
    }

    public function getLastest(): ?Tabungan
    {
        return $this->tabungan->latest()->first();
    }

    public function createTabungan(array $data): Tabungan
    {
        return $this->tabungan->create($data);
    }

    public function getRiwayatTransaksiTabungan($rekening, $tgl_awal, $tgl_akhir): Collection
    {
        return TransaksiTabungan::where('rekening', $rekening)->whereBetween('trans_tglbuku', $tgl_awal, $tgl_akhir)->all();
    }

    public function transaksiTabungan(array $data): TransaksiTabungan
    {
        return TransaksiTabungan::create($data);
    }

    public function deleteTransaksiTabungan($id)
    {
        $transaksi = TransaksiTabungan::find($id);
        if ($transaksi) {
            return $transaksi->delete();
        }
        return false;
    }

    public function penutupanTabungan(string $rekening): Tabungan
    {
        $tabungan = Tabungan::find($rekening);
        if ($tabungan) {
            $tabungan->update([
                'status' => 3,
                'saldo' => 0,
                'tgl_tutup' => Carbon::now()
            ]);
            TransaksiTabungan::create([
                'rekening' => $rekening,
                'tarik' => $tabungan->saldo,
            ]);
        }
        return $tabungan;
    }

    public function getAllProduk(): Collection
    {
        return ProdukTabungan::with('akun_simpanan', 'akun_biaya_bunga')->get();
    }

    public function findProdukById($id): ?ProdukTabungan
    {
        return ProdukTabungan::find($id);
    }

    public function findProdukByName($nama): ?ProdukTabungan
    {
        return ProdukTabungan::where('nama', $nama)->first();
    }

    public function createProduk(array $data): ProdukTabungan
    {
        return ProdukTabungan::create($data);
    }

    public function updateProduk($id, array $data): ProdukTabungan
    {
        $produk = ProdukTabungan::find($id);
        $produk->update($data);
        return $produk;
    }

    public function deleteProdukTabungan($id)
    {
        $produk = ProdukTabungan::find($id);
        return $produk->delete();
    }
}
