<?php

namespace Modules\Lpj\Http\Controllers;

use Exception;
use Modules\Lpj\Models\Noc;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Modules\Lpj\Models\Permohonan;
use Illuminate\Support\Facades\Log;
use App\Http\Controllers\Controller;
use Barryvdh\DomPDF\Facade\Pdf;
use Illuminate\Support\Facades\Storage;

class MemoController extends Controller
{
    public $user;

    /**
     * Menampilkan halaman index memo penyelesaian
     *
     * @return \Illuminate\View\View
     */
    public function index()
    {
        Log::info('MemoController: Mengakses halaman index memo penyelesaian');
        return view('lpj::memo.index');
    }

    /**
     * Menampilkan form untuk membuat memo penyelesaian dengan data yang dipilih
     *
     * @param Request $request
     * @return \Illuminate\View\View
     */
    public function create(Request $request)
    {
        Log::info('MemoController: Mengakses halaman create memo penyelesaian');

        $selectedIds = $request->get('selected_ids', []);

        // Pastikan $selectedIds selalu berupa array
        if (is_string($selectedIds)) {
            $selectedIds = explode(',', $selectedIds);
        }

        // Filter array untuk menghilangkan nilai kosong
        $selectedIds = array_filter($selectedIds, function($id) {
            return !empty(trim($id));
        });

        $permohonanList = [];
        $totalBiayaPJ = 0;

        if (!empty($selectedIds) && count($selectedIds) > 0) {
            try {
                $permohonanList = Permohonan::with([
                    'user',
                    'debiture',
                    'branch',
                    'tujuanPenilaian',
                    'penilaian',
                    'jenisFasilitasKredit',
                    'documents.inspeksi',
                    'penilai',
                    'documents.detail',
                    'noc'
                ])->whereIn('id', $selectedIds)->get();

                // Hitung total biaya PJ dari nominal_bayar di tabel NOC
                $totalBiayaPJ = Noc::whereIn('permohonan_id', $selectedIds)
                    ->sum('nominal_bayar');

                Log::info('MemoController: Total Biaya PJ dihitung: ' . $totalBiayaPJ);

            } catch (Exception $e) {
                Log::error('MemoController: Error saat mengambil data permohonan - ' . $e->getMessage());
                return redirect()->back()->with('error', 'Terjadi kesalahan saat memuat data');
            }
        }

        return view('lpj::memo.create', compact('permohonanList', 'totalBiayaPJ'));
    }

    /**
     * Menyimpan memo penyelesaian yang telah dibuat
     *
     * @param Request $request
     * @return \Illuminate\Http\RedirectResponse
     */
    public function store(Request $request)
    {
        Log::info('MemoController: Memulai proses penyimpanan memo penyelesaian');

        DB::beginTransaction();

        try {
            // Validasi input
            $request->validate([
                'permohonan_ids' => 'required|array',
                'permohonan_ids.*' => 'exists:permohonan,id',
                'memo_number' => 'required|string|max:255',
                'payment_date' => 'required|date',
                'memo_date' => 'required|date'
            ]);

            $permohonanIds = $request->permohonan_ids;
            $memoNumber = $request->memo_number;
            $paymentDate = $request->payment_date;
            $memoDate = $request->memo_date;

            // Update status permohonan yang dipilih
            foreach ($permohonanIds as $permohonanId) {
                $permohonan = Permohonan::find($permohonanId);
                if ($permohonan) {
                    $permohonan->status = 'memo-penyelesaian';
                    $permohonan->memo_penyelesaian_number = $memoNumber;
                    $permohonan->memo_penyelesaian_date = $memoDate;
                    $permohonan->memo_penyelesaian_payment_date = $paymentDate;
                    $permohonan->memo_penyelesaian_created_at = now();
                    //$permohonan->save();

                    Log::info('MemoController: Berhasil update permohonan ID: ' . $permohonanId);
                }
            }

            DB::commit();
            Log::info('MemoController: Berhasil menyimpan memo penyelesaian untuk ' . count($permohonanIds) . ' permohonan');

            return redirect()->route('memo.index')
                ->with('success', 'Memo penyelesaian berhasil dibuat untuk ' . count($permohonanIds) . ' permohonan');

        } catch (Exception $e) {
            DB::rollback();
            Log::error('MemoController: Error saat menyimpan memo penyelesaian - ' . $e->getMessage());

            return redirect()->back()
                ->withInput()
                ->with('error', 'Terjadi kesalahan saat menyimpan memo penyelesaian: ' . $e->getMessage());
        }
    }

    /**
     * Menampilkan detail memo penyelesaian
     *
     * @param int $id
     * @return \Illuminate\View\View
     */
    public function show($id)
    {
        Log::info('MemoController: Mengakses detail memo penyelesaian ID: ' . $id);

        $permohonan = Permohonan::with([
            'user',
            'debiture',
            'branch',
            'tujuanPenilaian',
            'penilaian',
            'jenisFasilitasKredit',
            'documents.inspeksi',
            'penilai',
            'documents.detail',
            'noc'
        ])->findOrFail($id);

        return view('lpj::memo.show', compact('permohonan'));
    }

    /**
     * Mengambil data untuk datatables pada halaman memo penyelesaian
     *
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse
     */
    public function dataForDatatables(Request $request)
    {
        Log::info('MemoController: Mengambil data untuk datatables');

        if (is_null($this->user) || !$this->user->can('debitur.view')) {
            Log::warning('MemoController: User tidak memiliki permission untuk melihat data');
            // abort(403, 'Sorry! You are not allowed to view users.');
        }

        // Mengambil data dari database dengan kondisi yang sama seperti LaporanController
        $query = Permohonan::query()
            ->whereIn('status', ['proses-laporan', 'done', 'paparan', 'proses-paparan', 'memo-penyelesaian'])
            /*->whereNotNull('approval_so_at')
            ->whereNotNull('approval_eo_at')
            ->where(function ($q) {
                $q->whereIn('nilai_plafond_id', [1, 4])
                  ->whereNotNull('approval_dd_at')
                  ->orWhereIn('nilai_plafond_id', [2, 3]);
            })*/
            ->whereHas('noc'); // Hanya tampilkan permohonan yang memiliki NOC


        $query = $query->orderBy('nomor_registrasi', 'desc');

        // Apply search filter jika ada
        if ($request->has('search') && !empty($request->get('search'))) {
            $searchParams = explode('|', $request->get('search'));

            $filterJenisPenilaian = $searchParams[0] ?? '';
            $searchTerm = $searchParams[1] ?? '';

            // Filter berdasarkan jenis penilaian
            if (!empty($filterJenisPenilaian)) {
                $query->where('jenis_penilaian_id', $filterJenisPenilaian);
                Log::info('Applied jenis penilaian filter', ['filter' => $filterJenisPenilaian]);
            }

            $query->where(function ($q) use ($searchTerm) {
                $q->where('nomor_registrasi', 'LIKE', '%' . $searchTerm . '%');
                $q->orWhere('tanggal_permohonan', 'LIKE', '%' . $searchTerm . '%');
                $q->orWhereRelation('user', 'name', 'LIKE', '%' . $searchTerm . '%');
                $q->orWhereRelation('debiture', 'name', 'LIKE', '%' . $searchTerm . '%');
                $q->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $searchTerm . '%');
                $q->orWhereRelation('branch', 'name', 'LIKE', '%' . $searchTerm . '%');
                $q->orWhere('status', 'LIKE', '%' . $searchTerm . '%');
            });
        }

        // Apply sorting jika ada
        if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
            $order  = $request->get('sortOrder');
            $column = $request->get('sortField');
            $query->orderBy($column, $order);
        }

        // Mendapatkan total count records
        $totalRecords = $query->count();
        $size = $request->get('size', 10);
        if ($size == 0) {
            $size = 10;
        }

        // Apply pagination jika ada
        if ($request->has('page') && $request->has('size')) {
            $page   = $request->get('page');
            $size   = $request->get('size');
            $offset = ($page - 1) * $size;

            $query->skip($offset)->take($size);
        }

        // Mendapatkan filtered count records
        $filteredRecords = $query->count();

        // Mendapatkan data untuk halaman saat ini
        $data = $query->with([
            'user',
            'debiture',
            'branch',
            'tujuanPenilaian',
            'jenisPenilaian',
            'penilaian',
            'jenisFasilitasKredit',
            'documents.inspeksi',
            'penilai',
            'documents.detail',
            'noc'
        ])->get();

        // Menghitung page count
        $pageCount = ceil($totalRecords / $size);

        // Menghitung current page number
        $currentPage = max(1, $request->get('page', 1));

        Log::info('MemoController: Berhasil mengambil data datatables - Total: ' . $totalRecords . ', Filtered: ' . $filteredRecords);

        // Return response data sebagai JSON object
        return response()->json([
            'draw'            => $request->get('draw'),
            'recordsTotal'    => $totalRecords,
            'recordsFiltered' => $filteredRecords,
            'pageCount'       => $pageCount,
            'page'            => $currentPage,
            'totalCount'      => $totalRecords,
            'data'            => $data,
        ]);
    }

    /**
     * Mengambil total biaya PJ berdasarkan permohonan yang dipilih
     *
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse
     */
    public function getTotalBiayaPJ(Request $request)
    {
        Log::info('MemoController: Mengambil total biaya PJ');

        try {
            $permohonanIds = $request->get('permohonan_ids', []);

            // Pastikan $permohonanIds selalu berupa array
            if (is_string($permohonanIds)) {
                $permohonanIds = explode(',', $permohonanIds);
            }

            // Filter array untuk menghilangkan nilai kosong
            $permohonanIds = array_filter($permohonanIds, function($id) {
                return !empty(trim($id));
            });

            $totalBiayaPJ = 0;

            if (!empty($permohonanIds) && count($permohonanIds) > 0) {
                // Hitung total biaya PJ dari nominal_bayar di tabel NOC
                $totalBiayaPJ = \Modules\Lpj\Models\Noc::whereIn('permohonan_id', $permohonanIds)
                    ->sum('nominal_bayar');
            }

            Log::info('MemoController: Total Biaya PJ berhasil dihitung: ' . $totalBiayaPJ);

            return response()->json([
                'success' => true,
                'total_biaya_pj' => $totalBiayaPJ,
                'total_biaya_pj_formatted' => 'Rp ' . number_format($totalBiayaPJ, 0, ',', '.')
            ]);

        } catch (Exception $e) {
            Log::error('MemoController: Error saat menghitung total biaya PJ - ' . $e->getMessage());

            return response()->json([
                'success' => false,
                'message' => 'Terjadi kesalahan saat menghitung total biaya PJ'
            ], 500);
        }
    }

    /**
     * Menampilkan preview memo penyelesaian sebelum menyimpan
     *
     * @param Request $request
     * @return \Illuminate\View\View
     */
    public function preview(Request $request)
    {
        Log::info('MemoController: Mengakses halaman preview memo penyelesaian');


        $permohonanIds = $request->permohonan_ids;
        $memoNumber = $request->memo_number;
        $paymentDate = $request->payment_date;
        $memoDate = $request->memo_date;

        try {
            // Ambil data permohonan yang dipilih
            $permohonanList = Permohonan::with([
                'user',
                'debiture',
                'branch',
                'penilaian',
                'jenisPenilaian',
                'jenisFasilitasKredit',
                'documents.inspeksi',
                'penilai',
                'documents.detail',
                'noc'
            ])->whereIn('id', $permohonanIds);

            // Hitung total biaya PJ dari nominal_bayar di tabel NOC
            $totalBiayaPJ = Noc::whereIn('permohonan_id', $permohonanIds)
                ->sum('nominal_bayar');

            // Data untuk template memo
            $memoData = [
                'memo_number' => $memoNumber,
                'memo_date' => $memoDate,
                'payment_date' => $paymentDate,
                'total_biaya_pj' => $totalBiayaPJ,
                'permohonan_list' => $permohonanList->get(),
                'debitur_count' => $permohonanList->get()->count(),
                'jaminan_info' => $this->getJaminanInfo($permohonanList->get()),
                'jenisPenilaian' => $permohonanList->pluck('jenis_penilaian_id')->first()
            ];

            $permohonanList= $permohonanList->get();

            Log::info('MemoController: Data preview memo berhasil disiapkan');

            return view('lpj::memo.preview', compact('memoData', 'permohonanList', 'totalBiayaPJ'));

        } catch (Exception $e) {
            Log::error('MemoController: Error saat menyiapkan preview memo - ' . $e->getMessage());
            return redirect()->back()
                ->withInput()
                ->with('error', 'Terjadi kesalahan saat menyiapkan preview memo: ' . $e->getMessage());
        }
    }

    /**
     * Generate PDF memo penyelesaian dan simpan ke database
     *
     * @param Request $request
     * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
     */
    public function generatePdf(Request $request)
    {
        Log::info('MemoController: Memulai generate PDF memo penyelesaian');

        DB::beginTransaction();

        try {
            // Validasi input

            $permohonanIds = $request->permohonan_ids;
            $memoNumber = $request->memo_number;
            $paymentDate = $request->payment_date;
            $memoDate = $request->memo_date;

            // Ambil data permohonan yang dipilih
            $permohonanList = Permohonan::with([
                'user',
                'debiture',
                'branch',
                'penilaian',
                'jenisPenilaian',
                'jenisFasilitasKredit',
                'documents.inspeksi',
                'penilai',
                'documents.detail',
                'noc'
            ])->whereIn('id', $permohonanIds);

            // Hitung total biaya PJ dari nominal_bayar di tabel NOC
            $totalBiayaPJ = Noc::whereIn('permohonan_id', $permohonanIds)
                ->sum('nominal_bayar');

            // Data untuk template memo
            $memoData = [
                'memo_number' => $memoNumber,
                'memo_date' => $memoDate,
                'payment_date' => $paymentDate,
                'total_biaya_pj' => $totalBiayaPJ,
                'permohonan_list' => $permohonanList->get(),
                'debitur_count' => $permohonanList->get()->count(),
                'jaminan_info' => $this->getJaminanInfo($permohonanList->get()),
                'jenisPenilaian' => $permohonanList->pluck('jenis_penilaian_id')->first()
            ];

            $permohonanList= $permohonanList->get();

            // Generate PDF dari template
            $pdf = Pdf::loadView('lpj::memo.pdf-template', compact('memoData', 'permohonanList', 'totalBiayaPJ'))
                ->setPaper('a4', 'portrait')
                ->setOptions([
                    'defaultFont' => 'Times-Roman',
                    'isRemoteEnabled' => true,
                    'isHtml5ParserEnabled' => true,
                    'isPhpEnabled' => true,
                    'dpi' => 150,
                    'defaultPaperSize' => 'a4',
                    'chroot' => public_path(),
                ]);

            // Nama file PDF
            $fileName = 'memo-penyelesaian-' . str_replace(['/', ' '], ['-', '-'], $memoNumber) . '-' . date('Y-m-d-H-i-s') . '.pdf';
            $filePath = 'memo-penyelesaian/' . $fileName;

            // Simpan PDF ke storage
            Storage::disk('public')->put($filePath, $pdf->output());

            // Update status permohonan yang dipilih
            // Update data di tabel NOC untuk setiap permohonan
            foreach ($permohonanIds as $permohonanId) {
                // Cari NOC berdasarkan permohonan_id
                $noc = Noc::where('permohonan_id', $permohonanId)->first();

                if ($noc) {
                    // Update field memo penyelesaian di tabel NOC
                    $noc->memo_penyelesaian = $filePath;
                    $noc->memo_penyelesaian_number = $memoNumber;
                    $noc->memo_penyelesaian_date = $memoDate;
                    $noc->memo_penyelesaian_payment_date = $paymentDate;
                    $noc->memo_penyelesaian_created_at = now();
                    $noc->save();

                    Log::info('MemoController: Berhasil update NOC untuk permohonan ID: ' . $permohonanId);
                } else {
                    Log::warning('MemoController: NOC tidak ditemukan untuk permohonan ID: ' . $permohonanId);
                }
            }

            DB::commit();
            Log::info('MemoController: Berhasil generate PDF dan menyimpan memo penyelesaian untuk ' . count($permohonanIds) . ' permohonan');

            // Return PDF untuk download
            return $pdf->download('memo-penyelesaian-' . $memoNumber . '.pdf');

        } catch (Exception $e) {
            DB::rollback();
            Log::error('MemoController: Error saat generate PDF memo penyelesaian - ' . $e->getMessage());

            return redirect()->back()
                ->with('error', 'Terjadi kesalahan saat generate PDF memo penyelesaian: ' . $e->getMessage())
                ->withInput();
        }
    }

    /**
     * Helper function untuk mendapatkan informasi jaminan
     *
     * @param $permohonanList
     * @return string
     */
    private function getJaminanInfo($permohonanList)
    {
        $jaminanTypes = [];
        foreach ($permohonanList as $permohonan) {
            if ($permohonan->tujuanPenilaian) {
                $jaminanTypes[] = $permohonan->tujuanPenilaian->name;
            }
        }

        $uniqueJaminan = array_unique($jaminanTypes);
        return implode(' & ', $uniqueJaminan);
    }
    /**
     * Download PDF memo penyelesaian
     *
     * @param int $id - ID permohonan
     * @return \Illuminate\Http\Response
     */
    public function downloadPdf($id)
    {
        Log::info('MemoController: Download PDF memo penyelesaian untuk permohonan ID: ' . $id);

        try {
            // Cari NOC berdasarkan permohonan_id
            $noc = Noc::where('permohonan_id', $id)->first();

            if (!$noc || !$noc->memo_penyelesaian) {
                Log::warning('MemoController: PDF memo penyelesaian tidak ditemukan untuk permohonan ID: ' . $id);
                return redirect()->back()->with('error', 'File PDF memo penyelesaian tidak ditemukan.');
            }

            // Cek apakah file ada di storage
            if (!Storage::disk('public')->exists($noc->memo_penyelesaian)) {
                Log::warning('MemoController: File PDF tidak ada di storage: ' . $noc->memo_penyelesaian);
                return redirect()->back()->with('error', 'File PDF tidak ditemukan di server.');
            }

            // Download file
            $fileName = 'memo-penyelesaian-' . $noc->memo_penyelesaian_number . '.pdf';

            Log::info('MemoController: Berhasil download PDF memo penyelesaian: ' . $fileName);

            return Storage::disk('public')->download($noc->memo_penyelesaian, $fileName);

        } catch (Exception $e) {
            Log::error('MemoController: Error saat download PDF memo penyelesaian - ' . $e->getMessage());
            return redirect()->back()->with('error', 'Terjadi kesalahan saat mengunduh file PDF.');
        }
    }
}
