<?php

namespace App\Repositories;

use App\Models\TransaksiPenempatanBank;
use App\Services\JurnalService;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Support\Facades\DB;

class TransaksiPenempatanRepository
{
    protected $transaksiPenempatan;
    protected $jurnalService;

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

    public function getAllTransaksi($tgl_awal, $tgl_akhir, $rekening = null): Collection
    {
        $transaksi = $this->transaksiPenempatan->with('penempatan')
            ->whereBetween('trans_tglbuku', [$tgl_awal, $tgl_akhir]);

        if ($rekening) {
            $transaksi->where('penempatan_id', $rekening);
        }
        return $transaksi->orderBy('trans_date')->get();
    }

    public function getLastTransaksi($data): ?TransaksiPenempatanBank
    {
        $date = $data['trans_tglbuku'];
        return $this->transaksiPenempatan
            ->where('trans_tglbuku', $date)
            ->where('trans_kode', $data['trans_kode'])
            ->orderBy('trans_date', 'desc')
            ->first();
    }

    public function findTransaksiById(string $id): ?TransaksiPenempatanBank
    {
        return $this->transaksiPenempatan->find($id);
    }

    public function createTransaksi(array $data): TransaksiPenempatanBank
    {
        $transaksiPenempatan = $this->transaksiPenempatan->create($data);
        $penempatan_bank = $transaksiPenempatan->penempatan;
        $penempatan_bank->saldo += $transaksiPenempatan->debet - $transaksiPenempatan->kredit;
        $penempatan_bank->save();
        return $transaksiPenempatan;
    }

    public function validasiTransaksi(string $id)
    {
        try {
            DB::transaction(function () use ($id) {
                $transaksiPenempatan = $this->transaksiPenempatan->find($id);
                $transaksiPenempatan->status = 1;
                $transaksiPenempatan->save();

                $penempatan_bank = $transaksiPenempatan->penempatan;
                $penempatan_bank->saldo += $transaksiPenempatan->debet - $transaksiPenempatan->kredit;
                $penempatan_bank->save();

                $jurnal = $this->jurnalService->findByTransId($transaksiPenempatan->trans_id);
                if ($jurnal instanceof Collection) {
                    $jurnal->each(function ($item) {
                        $item->status = 1;
                        $item->save();
                    });
                } elseif ($jurnal) {
                    $jurnal->status = 1;
                    $jurnal->save();
                }

                return $transaksiPenempatan;
            });
            return response()->json(['message' => 'Transaksi berhasil divalidasi'], 200);
        } catch (\Exception $e) {
            throw new \Exception('Error Validating transaction: ' . $e->getMessage());
        }
    }

    public function deleteTransaksi(string $id)
    {
        try {
            DB::transaction(function () use ($id) {
                $transaksiPenempatan = $this->transaksiPenempatan->find($id);
                $transaksiPenempatan->status = 9;
                $transaksiPenempatan->save();

                $penempatan_bank = $transaksiPenempatan->penempatan;
                $penempatan_bank->saldo -= $transaksiPenempatan->debet - $transaksiPenempatan->kredit;
                $penempatan_bank->save();

                $jurnal = $this->jurnalService->findByTransId($transaksiPenempatan->trans_id);
                if ($jurnal instanceof Collection) {
                    $jurnal->each(function ($item) {
                        $item->status = 1;
                        $item->save();
                    });
                } elseif ($jurnal) {
                    $jurnal->status = 1;
                    $jurnal->save();
                }

                return $transaksiPenempatan;
            });
            return response()->json(['message' => 'Transaksi berhasil dihapus'], 200);
        } catch (\Exception $e) {
            throw new \Exception('Error Deleting transaction: ' . $e->getMessage());
        }
    }
}
