<?php

    namespace Modules\Lpj\Http\Controllers;

    use Exception;
    use Illuminate\Http\Request;
    use Illuminate\Routing\Controller;
    use Illuminate\Support\Facades\Auth;
    use Illuminate\Support\Facades\DB;
    use Maatwebsite\Excel\Facades\Excel;
    use Modules\Lpj\Exports\JenisLampiranExport;
    use Modules\Lpj\Http\Requests\JenisLampiranRequest;
    use Modules\Lpj\Models\JenisLampiran;

    class JenisLampiranController extends Controller
    {
        public function index()
        {
            $jenisLampirans = JenisLampiran::all();
            return view('lpj::jenis_lampiran.index', compact('jenisLampirans'));
        }

        public function store(JenisLampiranRequest $request)
        {
            DB::beginTransaction();
            try {
                $validated               = $request->validated();
                $validated['created_by'] = Auth::id();

                $jenisLampiran = JenisLampiran::create($validated);

                DB::commit();
                return redirect()
                    ->route('basicdata.jenis-lampiran.index')
                    ->with('success', 'Jenis Lampiran berhasil ditambahkan.');
            } catch (Exception $e) {
                DB::rollBack();
                return redirect()
                    ->back()
                    ->with('error', 'Gagal menambahkan Jenis Lampiran: ' . $e->getMessage())
                    ->withInput();
            }
        }

        public function create()
        {
            return view('lpj::jenis_lampiran.create');
        }

        public function show($id)
        {
            $jenisLampiran = JenisLampiran::findOrFail($id);
            return view('lpj::jenis_lampiran.show', compact('jenisLampiran'));
        }

        public function edit($id)
        {
            $jenisLampiran = JenisLampiran::findOrFail($id);
            return view('lpj::jenis_lampiran.create', compact('jenisLampiran'));
        }

        public function update(JenisLampiranRequest $request, $id)
        {
            DB::beginTransaction();
            try {
                $jenisLampiran           = JenisLampiran::findOrFail($id);
                $validated               = $request->validated();
                $validated['updated_by'] = Auth::id();

                $jenisLampiran->update($validated);

                DB::commit();
                return redirect()
                    ->route('basicdata.jenis-lampiran.index')
                    ->with('success', 'Jenis Lampiran berhasil diperbarui.');
            } catch (Exception $e) {
                DB::rollBack();
                return redirect()
                    ->back()
                    ->with('error', 'Gagal memperbarui Jenis Lampiran: ' . $e->getMessage())
                    ->withInput();
            }
        }

        public function destroy($id)
        {
            DB::beginTransaction();
            try {
                $jenisLampiran             = JenisLampiran::findOrFail($id);
                $jenisLampiran->deleted_by = Auth::id();
                $jenisLampiran->save();

                $jenisLampiran->delete();

                DB::commit();
                echo json_encode(['success' => true, 'message' => 'Jenis Lampiran berhasil dihapus.']);

            } catch (Exception $e) {
                DB::rollBack();
                echo json_encode([
                    'success' => false,
                    'message' => 'Gagal menghapus Jenis Lampiran: ' . $e->getMessage()
                ]);
            }
        }

        public function dataForDatatables(Request $request)
        {
            // Retrieve data from the database
            $query = JenisLampiran::query();

            // Apply search filter if provided
            if ($request->has('search') && !empty($request->get('search'))) {
                $search = $request->get('search');
                $query->where(function ($q) use ($search) {
                    $q->where('nama', 'LIKE', "%$search%")
                      ->orWhere('deskripsi', 'LIKE', "%$search%");
                });
            }

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

            // Get the total count of records
            $totalRecords = $query->count();

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

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

            // Get the filtered count of records
            $filteredRecords = $query->count();

            // Get the data for the current page
            $data = $query->get();

            // Calculate the page count
            $pageCount = ceil($totalRecords / $request->get('size'));

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

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

        public function export()
        {
            if (is_null($this->user) || !$this->user->can('jenis_lampiran.export')) {
                abort(403, 'Sorry! You are not allowed to export jenis lampiran.');
            }

            return Excel::download(new JenisLampiranExport, 'jenis_lampiran.xlsx');
        }
    }
