<?php

namespace App\Http\Controllers\Admin\Course;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Http\Requests\CourseCreateFormRequest;
use App\Models\Course;
use App\Models\CourseCategory;
use App\Models\CourseLevel;
use App\Models\Universities;
use App\Models\StudyArea;
use App\Models\SubStudyArea;
use Illuminate\Support\Facades\DB;

class CourseController extends Controller
{

    public function index(Request $request)
    {
        try {
            abort_if(!userCan('course.view'), 403);

            $course_levels = CourseLevel::get(['id', 'name']);

            $Currency = Course::distinct()
                ->select('courses.Currency', 'countries.name')
                ->join('universities', 'courses.university_id', '=', 'universities.id')
                ->join('countries', 'universities.country_id', '=', 'countries.id')
                ->get();


            $query = Course::query();
            $conditions = [];

            $filters = [
                'name' => 'LIKE',
                'deliveryMethod' => 'LIKE',
                'educationType' => 'LIKE',
                'status' => '=',
                'url' => '=',
                'InrAmount' => '=',
                'suggestion_data' => '!=',
                'course_level_id' => '=',
                'university_id' => '=',
                'Currency' => '=',
            ];


            foreach ($filters as $filterName => $operator) {
                if ($request->filled($filterName)) {
                    $value = $request->$filterName;

                    if ($value === 'null') {
                        $conditions[] = [$filterName, '=', null];
                    } else {
                        $decodedValue = urldecode($value);
                        $conditions[] = [$filterName, $operator, ($operator === 'LIKE') ? "%{$decodedValue}%" : $decodedValue];
                    }
                }
            }



            $courses = $query->where($conditions)->orderByDesc('id')->with(['university.countries'])->paginate(50);
            
            $courses->appends($request->except('page'));
            
            // Process course updates if the 'courseUpdate' key is present in the request
            if ($request->has('courseUpdate') && isset($request->courseUpdate['courseId'])) {
                $courseUpdateData = $request->input('courseUpdate');

                $courseIds = $courseUpdateData['courseId'];
                $courseLevelId = $courseUpdateData['course_level_id'];
                $courseLevel = $courseUpdateData['course_level'];

                $updatedCount = Course::whereIn('id', $courseIds)->update([
                    'course_level_id' => $courseLevelId,
                    'course_level' => $courseLevel,
                ]);

                return redirect()->route('course.index')->with('success', "courses updated successfully. Count: $updatedCount");
            }

            // Process to update Inramount present in the request
            if ($request->has('InrAmtUpdate') && ($inrUpdate = $request->InrAmtUpdate) && isset($inrUpdate['courseId'], $inrUpdate['currency'], $inrUpdate['rate'])) {
                $currency = $inrUpdate['currency'];
                $conversionRate = $inrUpdate['rate'];
                $courseIds = $inrUpdate['courseId'];

                $updatedCount = 0;

                foreach ($courseIds as $courseId) {
                    $courseAmt = Course::where('id', $courseId)->where('Currency', $currency)->first(['id', 'Amount']);

                    if ($courseAmt) {
                        $inrAmount = $courseAmt->Amount * $conversionRate;

                        try {
                            $courseAmt->update(['InrAmount' => $inrAmount]);
                            $updatedCount++;
                        } catch (\Exception $e) {
                            // Handle the exception if needed
                        }
                    }
                }
                // echo '<pre>';print_r($courses->all());die;
                if ($updatedCount > 0) {
                    $successMessage = "Updated $updatedCount records successfully.";
                    return redirect()->back()->with('success', $successMessage);
                } else {
                    $errorMessage = "No records were updated.";
                    return redirect()->back()->with('error', $errorMessage);
                }
            }

            return view('admin.course.index', compact('courses', 'course_levels', 'Currency'));
        } catch (\Exception $e) {

            return redirect()->route('course.index')->with('error', 'Failed . Please try again.');
        }
    }



    public function create()
    {
        abort_if(!userCan('course.create'), 403);

        $course_categories = CourseCategory::where('status', 1)->get(['id', 'name']);
        $course_levels = CourseLevel::get(['id', 'name']);
        $study_area = StudyArea::all('id', 'name');

        $Currency = Course::distinct()
            ->select('courses.Currency', 'countries.name')
            ->join('universities', 'courses.university_id', '=', 'universities.id')
            ->join('countries', 'universities.country_id', '=', 'countries.id')
            ->get();
        return view('admin.course.edit', compact('course_categories', 'course_levels', 'study_area', 'Currency'));
    }


    public function store(CourseCreateFormRequest $request)
    {
        try {
            abort_if(!userCan('course.create'), 403);

            $request['study_area_id'] = implode(',', $request->input('study_area_id'));
            $request['study_area_sub_id'] = implode(',', $request->input('study_area_sub_id'));
            $request['Intakes'] = implode(',', $request->input('Intakes'));
            $course = Course::create($request->all());

            $courseId = $course->id;

            return redirect()->route('course.index')->with('success', "Course created successfully. Course ID: $courseId");
        } catch (\Exception $e) {
            return redirect()->route('course.index')->with('error', 'Failed to create course. Please try again.');
        }
    }

    public function edit($id)
    {
        abort_if(!userCan('course.update'), 403);

        $courses = Course::where('id', $id)->first();
        $course_categories = CourseCategory::where('status', 1)->get(['id', 'name']);
        $course_levels = CourseLevel::get(['id', 'name']);
        $study_area = StudyArea::all('id', 'name');
        $subId =  explode(',', $courses->study_area_sub_id);
        $study_area_sub = SubStudyArea::whereIn('id', $subId)->get(['id', 'name']);

        $Currency = Course::distinct()
            ->select('courses.Currency', 'countries.name')
            ->join('universities', 'courses.university_id', '=', 'universities.id')
            ->join('countries', 'universities.country_id', '=', 'countries.id')
            ->get();

        return view('admin.course.edit', compact('courses', 'course_categories', 'course_levels', 'study_area', 'study_area_sub', 'Currency'));
    }



    public function update(CourseCreateFormRequest $request, $id)
    {
        
        try {
            abort_if(!userCan('course.update'), 403);
            
            $request['study_area_id'] = implode(',', $request->input('study_area_id'));
            $request['study_area_sub_id'] = implode(',', $request->input('study_area_sub_id'));
            $request['Intakes'] = implode(',', $request->input('Intakes')) ?? Null;
            $course = Course::findOrFail($id);
            $course->update($request->all());

            return redirect()->route('course.index')->with('success', "Course updated successfully. Course ID: $id");
        } catch (\Exception $e) {
            return redirect()->route('course.index')->with('error', 'Failed to update course. Please try again.');
        }
    }

    public function destroy($id)
    {
        try {
            $course = Course::findOrFail($id);
            $course->delete();

            return redirect()->route('course.index')->with('success', "Course deleted successfully. Course ID: $id");
        } catch (\Exception $e) {
            return redirect()->route('course.index')->with('error', 'Failed to delete course. Please try again.');
        }
    }


    public function getUniversityId(Request $request)
    {
        $term = $request->term;
        $results = [];
        if ($term != "") {
            $results = Universities::select('id', 'name', 'city_id')->where('status', 1)->where('id', 'like', '%' . $term . '%')->orWhere('name', 'like', '%' . $term . '%')->get();
        }
        return response()->json($results);
    }

    public function getSubStudyId(Request $request)
    {
        $subStudyArea = SubStudyArea::whereIn("study_area_id", $request->input('study_area_id'))->get(["name", "id"]);
        return response()->json(['data' => $subStudyArea]);
    }

    public function deleteSuggestion(Request $request)
    {
        $suggestionId = $request->suggestionId;
        $courseId = $request->courseId;
        $course = Course::where('id', $courseId)->value('suggestion_data');
        $suggestions = json_decode($course, true);
        $indexToRemove = array_search($suggestionId, array_column($suggestions, 'id'));

        if ($indexToRemove !== false) {
            unset($suggestions[$indexToRemove]);
        }

        if (empty($suggestions)) {
            $updatedSuggestionData = null; 
        } else {
            $updatedSuggestionData = json_encode(array_values($suggestions));
        }
        // echo '<pre>';print_r($updatedSuggestionData);die;
        Course::where('id', $courseId)->update(['suggestion_data' => $updatedSuggestionData]);
        return response()->json(['success' => true]);
    }
}
