<?php
namespace App\Http\Controllers;
use App\Models\ClassSchool;
use App\Models\Subject;
use App\Repositories\Medium\MediumInterface;
use App\Rules\uniqueForSchool;
use App\Services\BootstrapTableService;
use App\Services\ResponseService;
use Illuminate\Http\Request;
use Throwable;
class MediumController extends Controller
{
private MediumInterface $medium;
public function __construct(MediumInterface $medium)
{
$this->medium = $medium;
}
public function index()
{
ResponseService::noPermissionThenRedirect('medium-list');
return view('medium.index');
}
public function store(Request $request)
{
ResponseService::noPermissionThenSendJson('medium-create');
$request->validate([
'name' => ['required', new uniqueForSchool('mediums', 'name')]
]);
try {
$this->medium->create($request->except('_token'));
ResponseService::successResponse('Data Stored Successfully');
} catch (Throwable $e) {
ResponseService::logErrorResponse($e);
ResponseService::errorResponse();
}
}
public function edit($id)
{
$medium = $this->medium->findById($id);
return response($medium);
}
public function update(Request $request, $id)
{
ResponseService::noPermissionThenSendJson('medium-edit');
$request->validate([
'name' => ['required', new uniqueForSchool('mediums', 'name', $id)]
]);
try {
$this->medium->update($id, $request->except(['_token', 'id']));
$response = ['error' => false, 'message' => trans('Data Updated Successfully'),];
} catch (Throwable $e) {
ResponseService::logErrorResponse($e, "Medium Controller -> Update method");
ResponseService::errorResponse();
}
return response()->json($response);
}
public function destroy($id)
{
ResponseService::noPermissionThenSendJson('medium-delete');
try {
// Safety Check: Prevent deletion if medium is assigned to any class or subject in any session
if (ClassSchool::where('medium_id', $id)->exists() || Subject::where('medium_id', $id)->exists()) {
return ResponseService::errorResponse("Cannot delete this medium because it is associated with classes or subjects in academic sessions. Please remove those associations first.");
}
$this->medium->deleteById($id);
ResponseService::successResponse('Data Deleted Successfully');
} catch (Throwable $e) {
ResponseService::logErrorResponse($e, "Medium Controller -> Delete Method");
ResponseService::errorResponse();
}
}
public function show(Request $request)
{
ResponseService::noPermissionThenRedirect('medium-list');
$offset = request('offset', 0);
$limit = request('limit', 10);
$sort = request('sort', 'id');
$order = request('order', 'DESC');
$search = $request->search;
$showDeleted = $request->show_deleted;
$sql = $this->medium->builder()
->where(function ($query) use ($search) {
$query->when($search, function ($q) use ($search) {
$q->where('id', 'LIKE', "%$search%")->orwhere('name', 'LIKE', "%$search%")->Owner();
});
})
->when(!empty($showDeleted), function ($q) {
$q->onlyTrashed()->Owner();
});
$total = $sql->count();
if ($offset >= $total && $total > 0) {
$lastPage = floor(($total - 1) / $limit) * $limit; // calculate last page offset
$offset = $lastPage;
}
$sql->orderBy($sort, $order)->skip($offset)->take($limit);
$res = $sql->get();
$bulkData = array();
$bulkData['total'] = $total;
$rows = array();
$no = 1;
foreach ($res as $row) {
$operate = "";
if ($request->show_deleted) {
//Show Restore and Hard Delete Buttons
$operate .= BootstrapTableService::restoreButton(route('mediums.restore', $row->id));
$operate .= BootstrapTableService::trashButton(route('mediums.trash', $row->id));
} else {
//Show Edit and Soft Delete Buttons
$operate .= BootstrapTableService::editButton(route('mediums.update', $row->id));
$operate .= BootstrapTableService::deleteButton(route('mediums.destroy', $row->id));
}
// $operate .= BootstrapTableService::viewRelatedDataButton(route('related-data.index', ['mediums', $row->id]));
// Copy Data From Row to Temp Row
$tempRow = $row->toArray();
$tempRow['no'] = $no++;
$tempRow['operate'] = $operate;
$tempRow['created_at'] = $row->created_at;
$tempRow['updated_at'] = $row->updated_at;
$rows[] = $tempRow;
}
$bulkData['rows'] = $rows;
return response()->json($bulkData);
}
public function restore(int $id)
{
ResponseService::noPermissionThenSendJson('medium-delete');
try {
$this->medium->findOnlyTrashedById($id)->restore();
ResponseService::successResponse("Data Restored Successfully");
} catch (Throwable $e) {
ResponseService::logErrorResponse($e);
ResponseService::errorResponse();
}
}
public function trash($id)
{
ResponseService::noPermissionThenSendJson('medium-delete');
try {
// Safety Check: Prevent permanent deletion if medium is assigned to any class or subject in any session
if (ClassSchool::where('medium_id', $id)->exists() || Subject::where('medium_id', $id)->exists()) {
return ResponseService::errorResponse("Cannot delete this medium permanently because it is associated with classes or subjects in academic sessions. Please remove those associations first.");
}
$this->medium->findOnlyTrashedById($id)->forceDelete();
ResponseService::successResponse("Data Deleted Permanently");
} catch (Throwable $e) {
ResponseService::logErrorResponse($e, "Medium Controller -> Trash Method", 'cannot_delete_because_data_is_associated_with_other_data');
ResponseService::errorResponse('cannot_delete_because_data_is_associated_with_other_data');
}
}
}