<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Models\BorrowTransaction;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Mail;
use App\Mail\BukuSiapDiambilMail;
use App\Mail\PeminjamanDitolakMail;
use App\Mail\BukuDikembalikanMail;
use App\Mail\PerpanjanganDisetujuiMail;
use App\Mail\PerpanjanganDitolakMail;
use Carbon\Carbon;

class PeminjamanController extends Controller
{
    
    public function index()
    {
        $transactions = BorrowTransaction::with(['anggota', 'koleksi'])
            ->orderBy('created_at', 'desc')
            ->get();

        return view('admin.peminjaman', compact('transactions'));
    }

    
    public function downloadSuratPengantar($id)
    {
        $transaction = BorrowTransaction::findOrFail($id);

        if (!$transaction->surat_pengantar) {
            return back()->with('error', 'File surat pengantar tidak tersedia.');
        }

        $filePath = 'public/surat_pengantar/' . $transaction->surat_pengantar;

        if (!Storage::exists($filePath)) {
            return back()->with('error', 'File surat pengantar tidak ditemukan.');
        }

        return Storage::download($filePath, $transaction->surat_pengantar);
    }

  
    public function kembalikan($id)
    {
        $transaction = BorrowTransaction::findOrFail($id);

        if (!in_array($transaction->status, ['dipinjam', 'pengembalian_menunggu'])) {
            return redirect()->route('admin.peminjaman')
                ->with('error', 'Transaksi ini belum dipinjam atau sudah dikembalikan.');
        }

        $transaction->markAsDikembalikan();

        if ($transaction->anggota && $transaction->anggota->email) {
            try {
                Mail::to($transaction->anggota->email)->send(new BukuDikembalikanMail($transaction));
            } catch (\Exception $e) {
            }
        }

        return redirect()->route('admin.peminjaman')
            ->with('success', 'Buku berhasil ditandai sebagai dikembalikan.');
    }

    
    public function setujui(Request $request, $id)
    {
        $transaction = BorrowTransaction::findOrFail($id);

        if (!in_array($transaction->status, ['menunggu', 'pending'])) {
            return redirect()->back()->with('error', 'Transaksi ini sudah diproses.');
        }

        $request->validate([
            'pickup_date' => 'required|date',
            'pickup_time' => 'required|date_format:H:i',
            'tanggal_kembali' => 'nullable|date|after_or_equal:pickup_date',
        ]);

        $tanggalKembali = $request->tanggal_kembali
            ? Carbon::parse($request->tanggal_kembali)
            : Carbon::parse($request->pickup_date)->addDays(7);

        $transaction->pickup_date = $request->pickup_date;
        $transaction->pickup_time = $request->pickup_time;
        $transaction->tanggal_kembali = $tanggalKembali;
        $transaction->status = 'disetujui';
        $transaction->save();

        if ($transaction->anggota && $transaction->anggota->email) {
            try {
                Mail::to($transaction->anggota->email)
                    ->send(new BukuSiapDiambilMail($transaction));
            } catch (\Exception $e) {
            }
        }

        return redirect()->route('admin.peminjaman')
            ->with('success', 'Peminjaman disetujui. Email pemberitahuan telah dikirim ke anggota.');
    }

  
    public function ambilBuku($id)
    {
        $transaction = BorrowTransaction::findOrFail($id);

        if ($transaction->status !== 'disetujui') {
            return redirect()->route('admin.peminjaman')
                ->with('error', 'Buku belum disetujui atau sudah diambil.');
        }

        $transaction->markAsDipinjam();

        return redirect()->route('admin.peminjaman')
            ->with('success', 'Buku berhasil diambil. Status transaksi: Dipinjam.');
    }

   
    public function tolak($id)
    {
        $transaction = BorrowTransaction::findOrFail($id);

        if (!in_array($transaction->status, ['menunggu', 'pending'])) {
            return redirect()->back()->with('error', 'Transaksi ini sudah diproses.');
        }

        $transaction->markAsDitolak();

        if ($transaction->anggota && $transaction->anggota->email) {
            try {
                Mail::to($transaction->anggota->email)
                    ->send(new PeminjamanDitolakMail($transaction));
            } catch (\Exception $e) {
            }
        }

        return redirect()->route('admin.peminjaman')
            ->with('success', 'Peminjaman ditolak dan email pemberitahuan dikirim.');
    }

    
    public function setujuiPengembalian($id)
    {
        $transaction = BorrowTransaction::findOrFail($id);

        if ($transaction->status !== 'pengembalian_menunggu') {
            return back()->with('error', 'Transaksi ini tidak menunggu pengembalian.');
        }

        $transaction->markAsDikembalikan();

        if ($transaction->anggota && $transaction->anggota->email) {
            try {
                Mail::to($transaction->anggota->email)->send(new BukuDikembalikanMail($transaction));
            } catch (\Exception $e) {
            }
        }

        return redirect()->route('admin.peminjaman')
            ->with('success', 'Pengembalian buku telah disetujui oleh admin.');
    }

    
    public function store(Request $request)
    {
        $request->validate([
            'anggota_id' => 'required|exists:anggota,id',
            'koleksi_id' => 'required|exists:koleksis,biblio_id',
            'tanggal_pinjam' => 'required|date',
            'surat_pengantar' => 'nullable|file|mimes:pdf|max:2048',
        ]);

        $data = $request->only('anggota_id', 'koleksi_id', 'tanggal_pinjam');

        if ($request->hasFile('surat_pengantar')) {
            $file = $request->file('surat_pengantar');
            $filename = time() . '_' . $file->getClientOriginalName();
            $file->storeAs('public/surat_pengantar', $filename);
            $data['surat_pengantar'] = $filename;
        }

        $data['status'] = 'menunggu';

        BorrowTransaction::create($data);

        return redirect()->route('admin.peminjaman')
            ->with('success', 'Transaksi peminjaman berhasil dibuat dan menunggu persetujuan.');
    }

   
    public function setujuiPerpanjangan($id)
    {
        $transaction = BorrowTransaction::findOrFail($id);

        if ($transaction->status !== 'perpanjangan_menunggu') {
            return back()->with('error', 'Transaksi ini tidak menunggu perpanjangan.');
        }

        $transaction->tanggal_kembali = Carbon::parse($transaction->tanggal_kembali)->addDays(7);
        $transaction->status = 'dipinjam';
        $transaction->save();

        if ($transaction->anggota && $transaction->anggota->email) {
            try {
                Mail::to($transaction->anggota->email)
                    ->send(new PerpanjanganDisetujuiMail($transaction));
            } catch (\Exception $e) {
            }
        }

        return back()->with('success', 'Perpanjangan disetujui dan email telah dikirim ke anggota.');
    }

    public function tolakPerpanjangan($id)
    {
        $transaction = BorrowTransaction::findOrFail($id);

        if ($transaction->status !== 'perpanjangan_menunggu') {
            return back()->with('error', 'Transaksi ini tidak menunggu perpanjangan.');
        }

        $transaction->status = 'dipinjam';
        $transaction->save();

        if ($transaction->anggota && $transaction->anggota->email) {
            try {
                Mail::to($transaction->anggota->email)
                    ->send(new PerpanjanganDitolakMail($transaction));
            } catch (\Exception $e) {
            }
        }

        return back()->with('success', 'Perpanjangan ditolak dan email pemberitahuan telah dikirim.');
    }
}
