shell bypass 403

UnknownSec Shell


name : WebsiteApiController.php
<?php

namespace App\Http\Controllers\Api;

use App\BillingDetails;
use App\Http\Controllers\Controller;
use App\Http\Controllers\PaymentController;
use App\Jobs\SendGeneralEmail;
use App\LessonComplete;
use App\User;
use App\UserLogin;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Modules\Blog\Entities\Blog;
use Modules\Blog\Entities\UserBlog;
use Modules\Certificate\Entities\CertificateRecord;
use Modules\Coupons\Entities\Coupon;
use Modules\Coupons\Entities\UserWiseCoupon;
use Modules\Coupons\Entities\UserWiseCouponSetting;
use Modules\CourseSetting\Entities\Course;
use Modules\CourseSetting\Entities\CourseComment;
use Modules\CourseSetting\Entities\CourseCommentReply;
use Modules\CourseSetting\Entities\CourseEnrolled;
use Modules\CourseSetting\Entities\CourseReveiw;
use Modules\CourseSetting\Entities\Notification;
use Modules\FrontendManage\Entities\Slider;
use Modules\Org\Entities\OrgRecentActivity;
use Modules\OrgSubscription\Entities\OrgAttendance;
use Modules\OrgSubscription\Entities\OrgCourseSubscription;
use Modules\OrgSubscription\Entities\OrgSubscriptionCheckout;
use Modules\Payment\Entities\Cart;
use Modules\Payment\Entities\Checkout;
use Modules\Payment\Entities\InstructorPayout;
use Modules\PaymentMethodSetting\Entities\PaymentMethod;
use Modules\Quiz\Entities\OnlineExamQuestionAssign;
use Modules\Quiz\Entities\OnlineQuiz;
use Modules\Quiz\Entities\QuestionBankMuOption;
use Modules\Quiz\Entities\QuizMarking;
use Modules\Quiz\Entities\QuizTest;
use Modules\Quiz\Entities\QuizTestDetails;
use Modules\Quiz\Entities\QuizTestDetailsAnswer;
use Modules\Setting\Model\GeneralSetting;
use Modules\VirtualClass\Entities\VirtualClass;
use paytm\paytmchecksum\PaytmChecksum;
use JoisarJignesh\Bigbluebutton\Facades\Bigbluebutton;
use Modules\BBB\Entities\BbbMeeting;
use App\Traits\ImageStore;
use Modules\Certificate\Entities\Certificate;
use Modules\Certificate\Http\Controllers\CertificateController;

/**
 * @group  Frontend Api
 *
 * APIs for managing frontend api
 */
class WebsiteApiController extends Controller
{

    use ImageStore;

    /**
     * Cart List
     * @response {
     * "success": true,
     * "data": [
     * {
     * "id": 1,
     * "course_id": 1,
     * "user_id": 6,
     * "instructor_id": 2,
     * "tracking": "MQKR46KB7JJP",
     * "price": 10,
     * "created_at": "2020-11-17T06:29:05.000000Z",
     * "updated_at": "2020-11-17T06:29:05.000000Z",
     * "course": {
     * "id": 1,
     * "category_id": 1,
     * "subcategory_id": 1,
     * "quiz_id": null,
     * "user_id": 2,
     * "lang_id": 1,
     * "title": "Managerial Accounting Advance Course",
     * "slug": "managerial-accounting",
     * "duration": "5H",
     * "image": "public/demo/course/image/1.png",
     * "thumbnail": "public/demo/course/thumb/1.png",
     * "price": 20,
     * "discount_price": 10,
     * "publish": 1,
     * "status": 1,
     * "level": 2,
     * "trailer_link": "https://www.youtube.com/watch?v=mlqWUqVZrHA",
     * "host": "Youtube",
     * "meta_keywords": null,
     * "meta_description": null,
     * "about": "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text\r\n            ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book",
     * "special_commission": null,
     * "total_enrolled": 1,
     * "reveune": 50,
     * "reveiw": 0,
     * "type": 1,
     * "created_at": null,
     * "updated_at": null,
     * "dateFormat": "17th November 2020",
     * "publishedDate": "17th November 2020 12:28 pm",
     * "sumRev": 2,
     * "purchasePrice": 21,
     * "enrollCount": 1,
     * "user": {
     * "id": 2,
     * "role_id": 2,
     * "name": "Teacher",
     * "photo": "public/infixlms/img/admin.png",
     * "image": "public/infixlms/img/admin.png",
     * "avatar": "public/infixlms/img/admin.png",
     * "mobile_verified_at": null,
     * "email_verified_at": "2020-09-09T10:52:36.000000Z",
     * "notification_preference": "mail",
     * "is_active": 1,
     * "username": "teacher@infixedu.com",
     * "email": "teacher@infixedu.com",
     * "email_verify": "0",
     * "phone": null,
     * "address": null,
     * "city": "1374",
     * "country": "19",
     * "zip": null,
     * "dob": null,
     * "about": null,
     * "facebook": null,
     * "twitter": null,
     * "linkedin": null,
     * "instagram": null,
     * "subscribe": 0,
     * "provider": null,
     * "provider_id": null,
     * "status": 1,
     * "balance": 0,
     * "currency_id": 112,
     * "special_commission": 1,
     * "payout": "Paypal",
     * "payout_icon": "/uploads/payout/pay_1.png",
     * "payout_email": "demo@paypal.com",
     * "referral": "4MLV6zZjd9",
     * "added_by": 0,
     * "created_at": "2020-11-16T04:39:07.000000Z",
     * "updated_at": "2020-11-16T04:39:07.000000Z"
     * }
     * }
     * }
     * ],
     * "message": "Getting Cart info"
     * }
     *
     */

    public function __construct()
    {
        config(['auth.defaults.guard' => 'api']);
    }

    public function cartList()
    {

        try {

            $carts = Cart::where('user_id', Auth::id())->with('course', 'course.user')->get();

            if (count($carts) != 0) {
                $response = [
                    'success' => true,
                    'data' => $carts,
                    'message' => 'Getting Cart info',
                ];
            } else {
                $response = [
                    'success' => false,
                    'message' => 'Cart is empty ',
                ];
            }

            return response()->json($response, 200);
        } catch (\Exception $exception) {
            $response = [
                'success' => false,
                'message' => $exception->getMessage()
            ];
            return response()->json($response, 500);
        }
    }

    /**
     * Add to cart
     *
     * @queryParam id required The id of Cart Example:1.
     * @response  {
     * "success": false,
     * "message": "Course already added in your cart"
     * }
     */

    public function addToCart($id)
    {
        try {
            $user = Auth::user();
            if (Auth::check() && ($user->role_id != 1)) {

                $exist = Cart::where('user_id', $user->id)->where('course_id', $id)->first();
                $oldCart = Cart::where('user_id', $user->id)->first();

                if (isset($exist)) {
                    $message = 'Course already added in your cart';
                    $success = false;
                } elseif (Auth::check() && ($user->role_id == 1)) {
                    $message = 'You logged in as admin so can not add cart !';
                    $success = false;
                } else {

                    if (isset($oldCart)) {
                        $course = Course::find($id);
                        $cart = new Cart();
                        $cart->user_id = $user->id;
                        $cart->instructor_id = $course->user_id;
                        $cart->course_id = $id;
                        $cart->tracking = $oldCart->tracking;
                        if ($course->discount_price != null) {
                            $cart->price = $course->discount_price;
                        } else {
                            $cart->price = $course->price;
                        }
                        $cart->save();
                    } else {

                        $course = Course::find($id);
                        $cart = new Cart();
                        $cart->user_id = $user->id;
                        $cart->instructor_id = $course->user_id;
                        $cart->course_id = $id;
                        $cart->tracking = getTrx();
                        if ($course->discount_price != null) {
                            $cart->price = $course->discount_price;
                        } else {
                            $cart->price = $course->price;
                        }
                        $cart->save();
                    }

                    $message = 'Course Added to your cart';
                    $success = true;
                }
            } //If user not logged in then cart added into session

            else {
                $message = 'Only student can add to cart';
                $success = true;
            }
            $response = [
                'success' => $success,
                'message' => $message,
            ];

            return response()->json($response, 200);
        } catch (\Exception $exception) {
            $response = [
                'success' => false,
                'message' => $exception->getMessage()
            ];
            return response()->json($response, 500);
        }
    }

    /**
     * Remove cart
     * @queryParam id required The id of course/quiz Example:1.
     * @response  {
     * "success": false,
     * "message": "Course removed from your cart"
     * }
     */

    public function removeCart($id)
    {

        try {

            if (Auth::check()) {
                $item = Cart::find($id);
                if ($item) {
                    $item->delete();
                    $success = true;
                    $message = 'Course removed from your cart';
                } else {
                    $success = false;
                    $message = 'Something went wrong';
                }
            } else {
                $success = false;
                $message = 'Something went wrong';
            }

            $response = [
                'success' => $success,
                'message' => $message,
            ];

            return response()->json($response, 200);
        } catch (\Exception $exception) {
            $response = [
                'success' => false,
                'message' => $exception->getMessage()
            ];
            return response()->json($response, 500);
        }
    }


    /**
     * Apply Coupon
     * @bodyParam code string required The code of coupon Example:newyear2020
     * @bodyParam total number required The total of Amount Example:5000
     * @response  {
     * "success": true,
     * "total":30,
     * "message": "Coupon Successful Applied"
     * }
     */
    public function applyCoupon(Request $request)
    {

        try {

            $code = $request->code;

            $coupon = Coupon::where('code', $code)->whereDate('start_date', '<=', Carbon::now())
                ->whereDate('end_date', '>=', Carbon::now())->where('status', 1)->first();


            $tracking = Cart::where('user_id', Auth::id())->first()->tracking;


            $couponApply = false;


            $checkout = Checkout::where('tracking', $tracking)->first();

            if (empty($checkout)) {
                $checkout = new Checkout();
            }

            if (isset($coupon)) {
                if ($coupon->limit != 0) {
                    if ($coupon->limit <= $coupon->loginUserTotalUsed()) {

                        return response()->json([
                            'success' => false,
                            "message" => "Already used this coupon",
                        ], 200);
                    }
                }


                $total = $request->total;
                $max_dis = $coupon->max_discount;
                $min_purchase = $coupon->min_purchase;
                $type = $coupon->type;
                $value = $coupon->value;

                $checkTrackingId = Checkout::where('tracking', $tracking)->where('coupon_id', $coupon)->first();

                if ($checkTrackingId) {
                    return response()->json([
                        'success' => false,
                        'total' => $total,
                        "message" => "Already used this coupon",
                    ], 200);
                }

                if ($total >= $min_purchase) {


                    if ($coupon->category == 1) {
                        $couponApply = true;
                    } elseif ($coupon->category == 2) {

                        if (count($checkout->carts) != 1) {
                            return response()->json([
                                'success' => false,
                                'total' => $total,
                                "message" => "This coupon apply for single course",
                            ], 200);
                        }

                        if ($checkout->carts[0]->course_id == $coupon->course_id) {
                            $couponApply = true;
                        } else {
                            return response()->json([
                                'success' => false,
                                'total' => $total,
                                "message" => "This coupon is not valid for this course.",
                            ], 200);
                        }
                    } elseif ($coupon->category == 3) {
                        //                        dd();
                        if ($coupon->coupon_user_id != $checkout->user_id) {
                            return response()->json([
                                'success' => false,
                                'total' => $total,
                                "message" => "This coupon not for you.",
                            ], 200);
                        } else {
                            $couponApply = true;
                        }
                        //                        $couponApply=true;
                    }

                    $final = $total;
                    if ($couponApply) {
                        if ($type == 0) {
                            $discount = (($total * $value) / 100);
                            if ($discount >= $max_dis) {

                                $final = ($total - $max_dis);
                                $checkout->discount = $max_dis;
                                $checkout->purchase_price = $final;
                            } else {

                                $final = ($total - $discount);
                                $checkout->discount = $discount;
                                $checkout->purchase_price = $final;
                            }
                        } else {
                            $discount = $value;
                            if ($discount >= $max_dis) {
                                $final = ($total - $max_dis);

                                $checkout->discount = $max_dis;
                                $checkout->purchase_price = $final;
                            } else {
                                $final = ($total - $discount);
                                $checkout->discount = $discount;
                                $checkout->purchase_price = $final;
                            }
                        }
                    }
                    if ($discount > $total) {
                        return response()->json([
                            'success' => false,
                            'total' => $total,
                            "message" => "Invalid Request",
                        ], 200);
                    }
                    if (hasTax()) {
                        $tax = taxAmount($final);
                        $final = applyTax($final);
                        $checkout->tax = $tax;
                        $checkout->purchase_price = $final;
                    } else {
                        $tax = 0;
                    }
                    $checkout->tracking = $tracking;
                    $checkout->purchase_price = getPriceAsNumber($final);
                    $checkout->user_id = Auth::id();
                    $checkout->coupon_id = $coupon->id;
                    $checkout->price = $total;
                    $checkout->status = 0;
                    $checkout->save();
                    return response()->json([
                        'success' => true,
                        'total' => number_format($final, 2),
                        "message" => trans("frontend.Coupon Successfully Applied"),
                    ], 200);
                } else {
                    return response()->json([
                        'success' => false,
                        'total' => $total,
                        "message" => trans('frontend.Coupon Minimum Purchase Does Not Match'),
                    ], 200);
                }
            } else {
                $checkout->discount = 0;
                $checkout->coupon_id = null;
                $checkout->purchase_price = $request->total;
                $checkout->save();
                return response()->json([
                    'success' => false,
                    "message" => trans('frontend.Invalid Coupon')
                ], 200);
            }
            /*  $code = $request->code;

              $coupon = Coupon::where('code', $code)->whereDate('start_date', '<=', Carbon::now())
                  ->whereDate('end_date', '>=', Carbon::now())->where('status', 1)->first();
              if (isset($coupon)) {

                  $tracking = Cart::where('user_id', Auth::id())->first()->tracking;
                  $total = $request->total;
                  $max_dis = $coupon->max_discount;
                  $min_purchase = $coupon->min_purchase;
                  $type = $coupon->type;
                  $value = $coupon->value;

                  $couponApply = false;


                  $checkout = Checkout::where('tracking', $tracking)->first();
                  if (empty($checkout)) {
                      $checkout = new Checkout();
                  }

                  $checkTrackingId = Checkout::where('tracking', $tracking)->where('coupon_id', $coupon)->first();

                  if ($checkTrackingId) {
                      $response = [
                          'success' => false,
                          'message' => "Already used this coupon",
                      ];
                      return response()->json($response, 200);

                  }

                  if ($total >= $min_purchase) {


                      if ($coupon->category == 1) {
                          $couponApply = true;
                      } elseif ($coupon->category == 2) {

                          if (count($checkout->carts) != 1) {
                              return response()->json([
                                  'error' => "This coupon apply for single course",
                                  'total' => $total,
                              ], 200);
                          }

                          if ($checkout->carts[0]->course_id == $coupon->course_id) {
                              $couponApply = true;
                          } else {
                              return response()->json([
                                  'error' => "This coupon is not valid for this course.",
                                  'total' => $total,
                              ], 200);
                          }
                      } elseif ($coupon->category == 3) {
  //                        dd();
                          if ($coupon->coupon_user_id != $checkout->user_id) {
                              return response()->json([
                                  'error' => "This coupon not for you.",
                                  'total' => $total,
                              ], 200);
                          } else {
                              $couponApply = true;
                          }
  //                        $couponApply=true;
                      }

                      $final = $total;
                      if ($couponApply) {
                          if ($type == 0) {

                              $discount = (($total * $value) / 100);
                              if ($discount >= $max_dis) {

                                  $final = ($total - $max_dis);
                                  $checkout->discount = $max_dis;
                                  $checkout->purchase_price = $final;
                              } else {

                                  $final = ($total - $discount);
                                  $checkout->discount = $discount;
                                  $checkout->purchase_price = $final;

                              }
                          } else {

                              $discount = $value;

                              if ($discount >= $max_dis) {
                                  $final = ($total - $max_dis);

                                  $checkout->discount = $max_dis;
                                  $checkout->purchase_price = $final;
                              } else {
                                  $final = ($total - $discount);
                                  $checkout->discount = $discount;
                                  $checkout->purchase_price = $final;
                              }
                          }
                      }
                      if ($discount > $total) {
                          return response()->json([
                              'success' => false,
                              "message" => "Invalid Request"
                          ], 200);
                      }

                      $checkout->tracking = $tracking;
                      $checkout->user_id = Auth::id();
                      $checkout->coupon_id = $coupon->id;
                      $checkout->price = $final;
                      $checkout->status = 0;
                      $checkout->save();
                      $response = [
                          'success' => true,
                          'total' => number_format($final, 2),
                          'message' => "Coupon Successful Applied",
                      ];
                      return response()->json($response, 200);

                  } else {

                      $response = [
                          'success' => false,
                          'message' => "Coupon Minimum Purchase Does Not Match",
                      ];
                      return response()->json($response, 200);

                  }

              } else {
                  $response = [
                      'success' => false,
                      'message' => "Invalid Coupon",
                  ];
                  return response()->json($response, 200);

              }*/
        } catch (\Exception $e) {
            $response = [
                'success' => false,
                'message' => "Operation Failed",
            ];
            return response()->json($response, 500);
        }
    }


    /**
     * My Courses
     * @response
     * {
     * "success": true,
     * "data": [
     * {
     * "id": 1,
     * "category_id": 1,
     * "subcategory_id": 1,
     * "quiz_id": null,
     * "user_id": 2,
     * "lang_id": 1,
     * "title": "Managerial Accounting Advance Course",
     * "slug": "managerial-accounting",
     * "duration": "5H",
     * "image": "public/demo/course/image/1.png",
     * "thumbnail": "public/demo/course/thumb/1.png",
     * "price": 20,
     * "discount_price": 10,
     * "publish": 1,
     * "status": 1,
     * "level": 2,
     * "trailer_link": "https://www.youtube.com/watch?v=mlqWUqVZrHA",
     * "host": "Youtube",
     * "meta_keywords": null,
     * "meta_description": null,
     * "about": "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text\r\n            ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book",
     * "special_commission": null,
     * "total_enrolled": 1,
     * "reveune": 50,
     * "reveiw": 0,
     * "type": 1,
     * "created_at": null,
     * "updated_at": null,
     * "dateFormat": "17th November 2020",
     * "publishedDate": "17th November 2020 10:40 am",
     * "sumRev": 2,
     * "purchasePrice": 21,
     * "enrollCount": 1
     * }
     * ],
     * "total": 11,
     * "message": "Getting Courses Data"
     * }
     */
    public function myCourses()
    {
        try {
            $courses = CourseEnrolled::where('course_enrolleds.user_id', Auth::user()->id)
                ->leftjoin('courses', 'courses.id', 'course_enrolleds.course_id')
                ->where('courses.type', 1)
                ->select('courses.*')
                ->with('user')
                ->get();

            foreach ($courses as $course) {
                $user = User::where('id', $course->user_id)->first();
                $complete = Course::where('id', $course->id)->with('completeLessons')->first();
                $course->totalCompletePercentage = $complete->LoginUserTotalPercentage;
                $course->title = json_decode($course->title, true);
                $course->about = json_decode($course->about, true);
                $course->requirements = json_decode($course->requirements, true);
                $course->outcomes = json_decode($course->outcomes, true);
                $course->user = $user;
            }
            $response = [
                'success' => true,
                'data' => $courses,
                'message' => "Getting my courses",
            ];
            return response()->json($response, 200);
        } catch (\Exception $e) {
            $response = [
                'success' => false,
                'message' => $e->getMessage(),
            ];
            return response()->json($response, 500);
        }
    }


    public function myQuizzes()
    {
        try {
            $courses = CourseEnrolled::where('course_enrolleds.user_id', Auth::user()->id)
                ->leftjoin('courses', 'courses.id', 'course_enrolleds.course_id')
                ->where('courses.type', 2)
                ->with('user', 'course')
                ->get();
            foreach ($courses as $course) {
                $user = User::where('id', $course->user_id)->first();
                $tests = QuizTest::where('user_id', Auth::user()->id)->get();
                $course->user = $user;
                $course->about = json_decode($course->about, true);
                $course->requirements = json_decode($course->requirements, true);
                $course->outcomes = json_decode($course->outcomes, true);
                $course->tests = $tests;
            }

            $response = [
                'success' => true,
                'data' => $courses,
                'message' => "Getting my Quiz",
            ];
            return response()->json($response, 200);
        } catch (\Exception $e) {
            $response = [
                'success' => false,
                'message' => "Something went wrong",
            ];
            return response()->json($response, 500);
        }
    }

    public function myClasses()
    {
        try {
            $courses = CourseEnrolled::where('course_enrolleds.user_id', Auth::user()->id)
                ->leftjoin('courses', 'courses.id', 'course_enrolleds.course_id')
                ->where('courses.type', 3)
                ->with('user', 'course')
                ->get();
            foreach ($courses as $course) {
                $class = VirtualClass::where('id', $course->class_id)->first();
                $course->class = $class;
                $course->about = json_decode($course->about, true);
                $course->requirements = json_decode($course->requirements, true);
                $course->outcomes = json_decode($course->outcomes, true);
                $user = User::where('id', $course->user_id)->first();
                $course->user = $user;
            }
            $response = [
                'success' => true,
                'data' => $courses,
                'message' => "Getting my Classes",
            ];
            return response()->json($response, 200);
        } catch (\Exception $e) {
            $response = [
                'success' => false,
                'message' => "Something went wrong",
            ];
            return response()->json($response, 500);
        }
    }

    /**
     * Update Profile
     * @bodyParam name string required The name of User Example:Student
     * @bodyParam email string required The email of User Example:user@email.com
     * @bodyParam phone string required The phone number of User Example:01711223344
     * @bodyParam address string required The address of User Example:Dhaka,Bangladesh
     * @bodyParam city string required The city of User Example:Dhaka
     * @bodyParam country string required The country of User Example:Bangladesh
     * @bodyParam zip string required The zip of User Example:1200
     * @bodyParam about string required The about of User Example:something.....
     * @bodyParam image file  The profile image of User Example:image.png
     * @response  {
     * "success": true,
     * "message": "Password has been changed"
     * }
     */

    public function updateProfile(Request $request)
    {
        /*   if (Auth::user()->role_id == 1) {
               $request->validate([
                   'name' => 'required',
                   'email' => 'required|email',

               ]);
           } else {
               $request->validate([
                   'name' => 'required',
                   'email' => 'required|email',
                   'phone' => 'nullable|string|regex:/^([0-9\s\-\+\(\)]*)$/|min:1|unique:users',
                   'address' => 'required',
                   'city' => 'required',
                   'country' => 'required',
                   'zip' => 'required',
               ]);
           }*/


        try {

            $user = Auth::user();
            $user->name = $request->name;
            $user->email = $request->email;
            $user->phone = $request->phone;
            $user->address = $request->address;
            $user->language_id = $request->language;
            $user->state = $request->state;
            $user->city = $request->city;
            $user->country = $request->country;
            $user->zip = $request->zip;
            $user->currency_id = 112;
            $user->facebook = $request->facebook;
            $user->twitter = $request->twitter;
            $user->linkedin = $request->linkedin;
            $user->instagram = $request->instagram;
            $user->about = $request->about;

            if ($request->file('image') != "") {
                $user->image = $this->saveImage($request->file('image'));
            }
            $user->save();
            $response = [
                'success' => true,
                'message' => "Profile has been updated",
            ];
            return response()->json($response, 200);
        } catch (\Exception $e) {
            $response = [
                'success' => false,
                'message' => "Something went wrong",
            ];
            return response()->json($response, 500);
        }
    }

    /**
     * Review Course
     *
     * @bodyParam course_id  integer required The course_id of course/quiz Example:1
     * @bodyParam review string required The review  of course/quiz Example:Something
     * @bodyParam rating integer required The rating  of course/quiz Example:5
     * @response  {
     * "success": true,
     * "message": "Review Submit Successful"
     * }
     */
    public function submitReview(Request $request)
    {
        $this->validate($request, [
            'review' => 'required',
            'course_id' => 'required',
            'rating' => 'required'
        ]);

        try {
            $user_id = Auth::user()->id;
            $review = CourseReveiw::where('user_id', $user_id)->where('course_id', $request->course_id)->first();
            // return $review;
            if (is_null($review)) {
                $newReview = new CourseReveiw();
                $newReview->user_id = $user_id;
                $newReview->course_id = $request->course_id;
                $newReview->comment = $request->review;
                $newReview->star = $request->rating;
                $newReview->save();

                $course = Course::find($request->course_id);
                $total = CourseReveiw::where('course_id', $course->id)->sum('star');
                $count = CourseReveiw::where('course_id', $course->id)->where('status', 1)->count();
                $average = $total / $count;
                $course->reveiw = $average;
                $course->save();


                if (UserEmailNotificationSetup('Course_Review', $course->user)) {
                    SendGeneralEmail::dispatch($course->user, 'Course_Review', [
                        'time' => Carbon::now()->format('d-M-Y, g:i A'),
                        'course' => $course->title,
                        'review' => $newReview->comment,
                        'star' => $newReview->star,
                    ]);
                }
                if (UserBrowserNotificationSetup('Course_Review', $course->user)) {
                    send_browser_notification(
                        $course->user,
                        'Course_Review', [
                        'time' => Carbon::now()->format('d-M-Y, g:i A'),
                        'course' => $course->title,
                        'review' => $newReview->comment,
                        'star' => $newReview->star,
                    ],
                        trans('common.View'),
                        courseDetailsUrl(@$course->id, @$course->type, @$course->slug),
                    );
                }

                if (UserMobileNotificationSetup('Course_Review', $course->user) && !empty($course->user->device_token)) {
                    send_mobile_notification($course->user, 'Course_Review', [
                        'time' => Carbon::now()->format('d-M-Y, g:i A'),
                        'course' => $course->title,
                        'review' => $newReview->comment,
                        'star' => $newReview->star,
                    ]);
                }
                $success = true;
                $message = 'Review Submit Successful';
            } else {

                $review->update([
                    'comment' => $request->review,
                    'star' => $request->rating,
                ]);

                $course = Course::find($request->course_id);
                $total = CourseReveiw::where('course_id', $course->id)->sum('star');
                $count = CourseReveiw::where('course_id', $course->id)->where('status', 1)->count();
                $average = $total / $count;
                $course->reveiw = $average;
                $course->save();

                if (UserEmailNotificationSetup('Course_Review', $course->user)) {
                    SendGeneralEmail::dispatch($course->user, 'Course_Review', [
                        'time' => Carbon::now()->format('d-M-Y, g:i A'),
                        'course' => $course->title,
                        'review' => $review->comment,
                        'star' => $review->star,
                    ]);
                }
                if (UserBrowserNotificationSetup('Course_Review', $course->user)) {

                    send_browser_notification(
                        $course->user, 'Course_Review', [
                        'time' => Carbon::now()->format('d-M-Y, g:i A'),
                        'course' => $course->title,
                        'review' => $review->comment,
                        'star' => $review->star,
                    ],
                        trans('common.View'),
                        courseDetailsUrl(@$course->id, @$course->type, @$course->slug),
                    );
                }

                if (UserMobileNotificationSetup('Course_Review', $course->user) && !empty($course->user->device_token)) {
                    send_mobile_notification($course->user, 'Course_Review', [
                        'time' => Carbon::now()->format('d-M-Y, g:i A'),
                        'course' => $course->title,
                        'review' => $review->comment,
                        'star' => $review->star,
                    ]);
                }
                $success = true;
                $message = 'Review Edit Successful';
            }

            $response = [
                'success' => $success,
                'message' => $message
            ];
            return response()->json($response, 200);
        } catch (\Exception $e) {
            $response = [
                'success' => false,
                'error' => $e->getMessage(),
                'message' => "Something went wrong",
            ];
            return response()->json($response, 500);
        }
    }

    /**
     * Comment Course
     *
     * @bodyParam course_id integer required The course_id of course/quiz Example:1
     * @bodyParam comment string required The comment  of course/quiz Example:Something
     * @response  {
     * "success": true,
     * "message": "Operation Successful"
     * }
     */
    public function comment(Request $request)
    {
        $this->validate($request, [
            'comment' => 'required',
            'course_id' => 'required',
        ]);

        try {
            $course = Course::where('id', $request->course_id)->where('status', 1)->first();

            if (isset($course)) {

                $comment = new CourseComment();
                $comment->user_id = Auth::user()->id;
                $comment->course_id = $request->course_id;
                $comment->instructor_id = $course->user_id;
                $comment->comment = $request->comment;
                $comment->status = 1;
                $comment->save();

                // $notification = new Notification();
                // $notification->author_id = Auth::user()->id;
                // $notification->user_id = $course->user_id;
                // $notification->course_id = $course->id;
                // $notification->course_comment_id = $comment->id;
                // $notification->save();


                if (UserEmailNotificationSetup('Course_comment', $course->user)) {
                    SendGeneralEmail::dispatch($course->user, 'Course_comment', [
                        'time' => Carbon::now()->format('d-M-Y, g:i A'),
                        'course' => $course->title,
                        'comment' => $comment->comment,
                    ]);
                }
                if (UserBrowserNotificationSetup('Course_comment', $course->user)) {
                    send_browser_notification($course->user, 'Course_comment', [
                        'time' => Carbon::now()->format('d-M-Y, g:i A'),
                        'course' => $course->title,
                        'comment' => $comment->comment,
                    ],
                        trans('common.View'),
                        courseDetailsUrl(@$course->id, @$course->type, @$course->slug),
                    );
                }

                if (UserMobileNotificationSetup('Course_comment', $course->user) && !empty($course->user->device_token)) {
                    send_mobile_notification($course->user, 'Course_comment', [
                        'time' => Carbon::now()->format('d-M-Y, g:i A'),
                        'course' => $course->title,
                        'comment' => $comment->comment,
                    ]);
                }

                $success = true;
                $message = 'Operation successful';
            } else {
                $success = false;
                $message = 'Invalid Action !';
            }
            $response = [
                'success' => $success,
                'message' => $message
            ];
            return response()->json($response, 200);
        } catch (\Exception $e) {
            $response = [
                'success' => false,
                'message' => "Something went wrong",
            ];
            return response()->json($response, 500);
        }
    }

    /**
     * Comment Reply Course
     *
     * @bodyParam comment_id integer required The comment id of Comment Example:1
     * @bodyParam reply string required The reply  of Comment Example:Something
     * @response  {
     * "success": true,
     * "message": "Operation Successful"
     * }
     */
    public function commentReply(Request $request)
    {
        $this->validate($request, [
            'comment_id' => 'required',
            'reply' => 'required',
        ]);

        try {
            $comment = CourseComment::find($request->comment_id);
            $course = $comment->course;


            if (isset($course)) {

                $comment = new CourseCommentReply();
                $comment->user_id = Auth::user()->id;
                $comment->course_id = $course->id;
                if (!empty($request->reply_id)) {
                    $comment->reply_id = $request->reply_id;
                } else {
                    $comment->reply_id = null;
                }
                $comment->comment_id = $request->comment_id;
                $comment->reply = $request->reply;
                $comment->status = 1;
                $comment->save();


                if (UserEmailNotificationSetup('Course_comment_Reply', $course->user)) {
                    SendGeneralEmail::dispatch($course->user, 'Course_comment_Reply', [
                        'time' => Carbon::now()->format('d-M-Y, g:i A'),
                        'course' => $course->title,
                        'comment' => $comment->comment,
                        'reply' => $comment->reply,
                    ]);
                }
                if (UserBrowserNotificationSetup('Course_comment_Reply', $course->user)) {

                    send_browser_notification($course->user, 'Course_comment_Reply', [
                        'time' => Carbon::now()->format('d-M-Y, g:i A'),
                        'course' => $course->title,
                        'comment' => $comment->comment,
                        'reply' => $comment->reply,
                    ],
                        trans('common.View'),
                        courseDetailsUrl(@$course->id, @$course->type, @$course->slug),
                    );
                }

                if (UserMobileNotificationSetup('Course_comment_Reply', $course->user) && !empty($course->user->device_token)) {
                    send_mobile_notification($course->user, 'Course_comment_Reply', [
                        'time' => Carbon::now()->format('d-M-Y, g:i A'),
                        'course' => $course->title,
                        'comment' => $comment->comment,
                        'reply' => $comment->reply,
                    ]);
                }


                $success = true;
                $message = 'Operation successful';
            } else {
                $success = false;
                $message = 'Invalid Action !';
            }
            $response = [
                'success' => $success,
                'message' => $message
            ];
            return response()->json($response, 200);
        } catch (\Exception $e) {
            $response = [
                'success' => false,
                'message' => "Something went wrong",
            ];
            return response()->json($response, 500);
        }
    }


    /**
     * Checkout
     *
     * @bodyParam billing_address  string required  Select "new" || "previous"
     * @bodyParam old_billing  integer required  If select Previous billing Address
     * @bodyParam first_name  string required  If select New billing Address
     * @bodyParam last_name  string required  If select New billing Address
     * @bodyParam country  string required  If select New billing Address
     * @bodyParam address1  string required  If select New billing Address
     * @bodyParam city  string required  If select New billing Address
     * @bodyParam phone  string required  If select New billing Address
     * @bodyParam email  string required  If select New billing Address
     * @response  {
     * "success": true,
     * "message": "Operation Successful"
     * }
     */
    public function makeOrder(Request $request)
    {
        $response = array('response' => '', 'success' => false);
        /* $validator = Validator::make($request->all(), [
             'billing_address' => 'required',
             'old_billing' => 'required_if:billing_address,previous',
             'first_name' => 'required_if:billing_address,new',
             'last_name' => 'required_if:billing_address,new',
             'country' => 'required_if:billing_address,new',
             'address1' => 'required_if:billing_address,new',
             'city' => 'required_if:billing_address,new',
             'phone' => 'required_if:billing_address,new',
             'email' => 'required_if:billing_address,new',
         ]);
         if ($validator->fails()) {
             return $response['response'] = $validator->messages();
         }*/

        try {
            $profile = Auth::user();
            $tracking = Cart::where('user_id', Auth::id())->first()->tracking;
            if ($profile->role_id == 3) {
                /* if (isSubscribe()) {
                     $total = 0;
                 } else {
                     $total = Cart::where('user_id', Auth::user()->id)->sum('price');
                 }*/
                $total = Cart::where('user_id', Auth::user()->id)->sum('price');
            }

            $checkout = Checkout::where('tracking', $tracking)->where('user_id', Auth::id())->latest()->first();
            if (!$checkout) {
                $checkout = new Checkout();
                $checkout->discount = 0.00;
                $checkout->purchase_price = $total;
                $checkout->tracking = $tracking;
                $checkout->user_id = Auth::id();
                $checkout->price = $total;
                $checkout->status = 0;
                $checkout->save();
            }


            if ($request->billing_address == 'new') {
                $bill = BillingDetails::where('tracking_id', $tracking)->first();

                if (empty($bill)) {
                    $bill = new BillingDetails();
                }

                $bill->user_id = Auth::id();
                $bill->tracking_id = $tracking;
                $bill->first_name = $request->first_name;
                $bill->last_name = $request->last_name;
                $bill->company_name = $request->company_name;
                $bill->country = $request->country;
                $bill->address1 = $request->address1;
                $bill->address2 = $request->address2;
                $bill->city = $request->city;
                $bill->state = $request->state;
                $bill->zip_code = $request->zip_code;
                $bill->phone = $request->phone;
                $bill->email = $request->email;
                $bill->details = $request->details;
                $bill->payment_method = null;
                $bill->save();
            } else {
                $bill = BillingDetails::where('id', $request->old_billing)->first();
            }

            $checkout_info = $checkout;
            if ($checkout_info) {
                $checkout_info->billing_detail_id = $bill->id;
                $checkout_info->save();

                if ($checkout_info->purchase_price == 0) {
                    $checkout_info->payment_method = 'None';
                    $bill->payment_method = 'None';
                    $checkout_info->save();
                    $carts = Cart::where('tracking', $checkout_info->tracking)->get();

                    foreach ($carts as $cart) {

                        $payment = new PaymentController();
                        $payment->directEnroll($cart->course_id, $checkout_info->tracking);
                        $cart->delete();
                    }


                    $response = [
                        'success' => true,
                        'type' => 'Free',
                        'message' => 'Operation successful'
                    ];
                    return response()->json($response, 200);
                } else {
                    $response = [
                        'success' => true,
                        'type' => 'Paid',
                        'message' => 'Operation successful. Go to Payment page'
                    ];
                    return response()->json($response, 200);
                }
            } else {
                $response = [
                    'success' => false,
                    'message' => 'Operation Failed.'
                ];
                return response()->json($response, 500);
            }
        } catch (\Exception $e) {
            $response = [
                'success' => false,
                'message' => $e->getMessage()
            ];
            return response()->json($response, 500);
        }
    }

    /**
     * Payment
     *
     * @queryParam response  required array Response Form Gateway.
     * @queryParam gateWayName  required string Gateway Name.
     * @response  {
     * "success": true,
     * "message": "Successfully Done"
     * }
     */
    public static function payWithGateWay(Request $request, $gateWayName)
    {
        try {
            if (isset($request->response)) {
                $response = $request->response;
            } else {
                $response = null;
            }


            if (Auth::check()) {
                $user = Auth::user();
                $track = Cart::where('user_id', $user->id)->first()->tracking;
                $total = Cart::where('user_id', Auth::user()->id)->sum('price');
                $checkout_info = Checkout::where('tracking', $track)->where('user_id', $user->id)->latest()->first();

                if ($gateWayName == "Wallet") {
                    if ($user->balance < $checkout_info->purchase_price) {

                        $response = [
                            'success' => false,
                            'message' => 'Insufficient balance'
                        ];
                        return response()->json($response, 200);
                    } else {
                        $newBal = ($user->balance - $checkout_info->purchase_price);
                        $user->balance = $newBal;
                        $user->save();
                    }
                }


                if (isset($checkout_info)) {

                    $discount = $checkout_info->discount;

                    $carts = Cart::where('tracking', $track)->get();

                    foreach ($carts as $cart) {


                        $course = Course::find($cart->course_id);
                        $enrolled = $course->total_enrolled;
                        $course->total_enrolled = ($enrolled + 1);

                        //==========================Start Referral========================
                        $purchase_history = CourseEnrolled::where('user_id', Auth::user()->id)->first();
                        $referral_check = UserWiseCoupon::where('invite_accept_by', Auth::user()->id)->where('category_id', null)->where('course_id', null)->first();
                        $referral_settings = UserWiseCouponSetting::where('role_id', Auth::user()->role_id)->first();

                        if ($purchase_history == null && $referral_check != null) {
                            $referral_check->category_id = $course->category_id;
                            $referral_check->subcategory_id = $course->subcategory_id;
                            $referral_check->course_id = $course->id;
                            $referral_check->save();
                            $percentage_cal = ($referral_settings->amount / 100) * $checkout_info->price;

                            if ($referral_settings->type == 1) {
                                if ($checkout_info->price > $referral_settings->max_limit) {
                                    $bonus_amount = $referral_settings->max_limit;
                                } else {
                                    $bonus_amount = $referral_settings->amount;
                                }
                            } else {
                                if ($percentage_cal > $referral_settings->max_limit) {
                                    $bonus_amount = $referral_settings->max_limit;
                                } else {
                                    $bonus_amount = $percentage_cal;
                                }
                            }

                            $referral_check->bonus_amount = $bonus_amount;
                            $referral_check->save();

                            $invite_by = User::find($referral_check->invite_by);
                            $invite_by->balance += $bonus_amount;
                            $invite_by->save();

                            $invite_accept_by = User::find($referral_check->invite_accept_by);
                            $invite_accept_by->balance += $bonus_amount;
                            $invite_accept_by->save();
                        }
                        //==========================End Referral========================
                        if ($discount != 0 || !empty($discount)) {
                            $itemPrice = $cart->price - ($discount / count($carts));
                            $discount_amount = $cart->price - $itemPrice;
                        } else {
                            $itemPrice = $cart->price;
                            $discount_amount = 0.00;
                        }
                        $enroll = new CourseEnrolled();
                        $instractor = User::find($cart->instructor_id);
                        $enroll->user_id = $user->id;
                        $enroll->tracking = $track;
                        $enroll->course_id = $course->id;
                        $enroll->purchase_price = $itemPrice;
                        $enroll->coupon = null;
                        $enroll->discount_amount = $discount_amount;
                        $enroll->status = 1;


                        if (!is_null($course->special_commission)) {
                            $commission = $course->special_commission;
                            $reveune = ($cart->price * $commission) / 100;
                            $enroll->reveune = $reveune;
                        } elseif (!is_null($instractor->special_commission)) {
                            $commission = $instractor->special_commission;
                            $reveune = ($cart->price * $commission) / 100;
                            $enroll->reveune = $reveune;
                        } else {

                            $commission = Settings('commission');
                            $reveune = ($cart->price * $commission) / 100;
                            $enroll->reveune = $reveune;
                        }

                        $payout = new InstructorPayout();
                        $payout->instructor_id = $course->user_id;
                        $payout->reveune = $reveune;

                        $payout->status = 0;
                        $payout->save();


                        if (UserEmailNotificationSetup('Course_Enroll_Payment', $checkout_info->user)) {
                            SendGeneralEmail::dispatch($checkout_info->user, 'Course_Enroll_Payment', [
                                'time' => \Illuminate\Support\Carbon::now()->format('d-M-Y, g:i A'),
                                'course' => $course->title,
                                'currency' => $checkout_info->user->currency->symbol ?? '$',
                                'price' => ($checkout_info->user->currency->conversion_rate * $cart->price),
                                'instructor' => $course->user->name,
                                'gateway' => 'Sslcommerz',
                            ]);
                        }
                        if (UserBrowserNotificationSetup('Course_Enroll_Payment', $checkout_info->user)) {
                            send_browser_notification($checkout_info->user, 'Course_Enroll_Payment', [
                                'time' => \Illuminate\Support\Carbon::now()->format('d-M-Y, g:i A'),
                                'course' => $course->title,
                                'currency' => $checkout_info->user->currency->symbol ?? '$',
                                'price' => ($checkout_info->user->currency->conversion_rate * $cart->price),
                                'instructor' => $course->user->name,
                                'gateway' => 'Sslcommerz',
                            ],
                                trans('common.View'),
                                courseDetailsUrl(@$course->id, @$course->type, @$course->slug),
                            );
                        }

                        if (UserMobileNotificationSetup('Course_Enroll_Payment', $checkout_info->user) && !empty($checkout_info->user->device_token)) {
                            send_mobile_notification($checkout_info->user, 'Course_Enroll_Payment', [
                                'time' => \Illuminate\Support\Carbon::now()->format('d-M-Y, g:i A'),
                                'course' => $course->title,
                                'currency' => $checkout_info->user->currency->symbol ?? '$',
                                'price' => ($checkout_info->user->currency->conversion_rate * $cart->price),
                                'instructor' => $course->user->name,
                                'gateway' => 'Sslcommerz',
                            ]);
                        }
                        if (UserEmailNotificationSetup('Enroll_notify_Instructor', $instractor)) {
                            SendGeneralEmail::dispatch($instractor, 'Enroll_notify_Instructor', [
                                'time' => Carbon::now()->format('d-M-Y, g:i A'),
                                'course' => $course->title,
                                'currency' => $instractor->currency->symbol ?? '$',
                                'price' => ($instractor->currency->conversion_rate * $cart->price),
                                'rev' => @$reveune,
                            ]);
                        }
                        if (UserBrowserNotificationSetup('Enroll_notify_Instructor', $instractor)) {

                            send_browser_notification($instractor, 'Enroll_notify_Instructor', [
                                'time' => Carbon::now()->format('d-M-Y, g:i A'),
                                'course' => $course->title,
                                'currency' => $instractor->currency->symbol ?? '$',
                                'price' => ($instractor->currency->conversion_rate * $cart->price),
                                'rev' => @$reveune,
                            ],
                                trans('common.View'),
                                courseDetailsUrl(@$course->id, @$course->type, @$course->slug),
                            );
                        }

                        if (UserMobileNotificationSetup('Course_Chapter_Added', $instractor) && !empty($instractor->device_token)) {
                            send_mobile_notification($instractor, 'Course_Chapter_Added', [
                                'time' => Carbon::now()->format('d-M-Y, g:i A'),
                                'course' => $course->title,
                                'currency' => $instractor->currency->symbol ?? '$',
                                'price' => ($instractor->currency->conversion_rate * $cart->price),
                                'rev' => @$reveune,
                            ]);
                        }


                        $enroll->save();

                        $course->reveune = (($course->reveune) + ($enroll->reveune));

                        $course->save();


                    }

                    $checkout_info->payment_method = $gateWayName;
                    $checkout_info->status = 1;
                    $checkout_info->response = json_encode($response);
                    $checkout_info->save();


                    if ($checkout_info->user->status == 1) {

                        foreach ($carts as $old) {
                            $old->delete();
                        }
                    }
                    $response = [
                        'success' => true,
                        'message' => 'Operation successful.'
                    ];
                    return response()->json($response, 200);
                } else {
                    $response = [
                        'success' => false,
                        'message' => 'Operation Failed.'
                    ];
                    return response()->json($response, 500);
                }
            } else {
                $response = [
                    'success' => false,
                    'message' => 'Operation Failed.'
                ];
                return response()->json($response, 500);
            }
        } catch (\Exception $e) {
            $response = [
                'success' => false,
                'message' => $e->getMessage()
            ];
            return response()->json($response, 500);
        }
    }

    /**
     * Available Payment Methods
     * @response {
     * "success": true,
     * "data": [
     * {
     * "method": "PayPal",
     * "logo": "public/demo/gateway/paypal.png"
     * },
     * {
     * "method": "Stripe",
     * "logo": "public/demo/gateway/stripe.png"
     * },
     * {
     * "method": "PayStack",
     * "logo": "public/demo/gateway/paystack.png"
     * },
     * {
     * "method": "RazorPay",
     * "logo": "public/demo/gateway/razorpay.png"
     * },
     * {
     * "method": "PayTM",
     * "logo": "public/demo/gateway/paytm.png"
     * },
     * {
     * "method": "Bank Payment",
     * "logo": ""
     * },
     * {
     * "method": "Offline Payment",
     * "logo": ""
     * },
     * {
     * "method": "Wallet",
     * "logo": ""
     * }
     * ],
     * "message": "Operation successful"
     * }
     */
    public function paymentMethods()
    {
        try {
            $methods = PaymentMethod::where('active_status', 1)->get(['method', 'logo']);
            $response = [
                'success' => true,
                'data' => $methods,
                'message' => "Operation successful"
            ];
            return response()->json($response, 200);
        } catch (\Exception $e) {
            $response = [
                'success' => false,
                'message' => "Operation Failed!"
            ];
            return response()->json($response, 200);
        }
    }


    /**
     * Billing Address
     * @response {
     * "success": true,
     * "data": [
     * {
     * "id": 1,
     * "tracking_id": "K3USKPJBC5U8",
     * "user_id": 3,
     * "first_name": "Student",
     * "last_name": "",
     * "company_name": "Spondon IT",
     * "country": {
     * "id": 19,
     * "name": "Bangladesh",
     * "iso3": "BGD",
     * "iso2": "BD",
     * "phonecode": "880",
     * "currency": "BDT",
     * "capital": "Dhaka",
     * "active_status": 1,
     * "created_at": "2018-07-20T08:41:03.000000Z",
     * "updated_at": "2018-07-20T08:41:03.000000Z"
     * },
     * "address1": "Dhaka",
     * "address2": "",
     * "city": "Dhaka",
     * "zip_code": "1200",
     * "phone": "01723442233",
     * "email": "student@infixedu.com",
     * "details": "add here additional info.",
     * "payment_method": null,
     * "created_at": "2021-03-03T11:21:01.000000Z",
     * "updated_at": "2021-03-03T11:21:01.000000Z"
     * },
     * {
     * "id": 2,
     * "tracking_id": "765A3UJ7B11M",
     * "user_id": 3,
     * "first_name": "Student",
     * "last_name": "",
     * "company_name": "Spondon IT",
     * "country": {
     * "id": 19,
     * "name": "Bangladesh",
     * "iso3": "BGD",
     * "iso2": "BD",
     * "phonecode": "880",
     * "currency": "BDT",
     * "capital": "Dhaka",
     * "active_status": 1,
     * "created_at": "2018-07-20T08:41:03.000000Z",
     * "updated_at": "2018-07-20T08:41:03.000000Z"
     * },
     * "address1": "Dhaka",
     * "address2": "",
     * "city": "Dhaka",
     * "zip_code": "1200",
     * "phone": "01723442233",
     * "email": "student@infixedu.com",
     * "details": "add here additional info.",
     * "payment_method": null,
     * "created_at": "2021-03-03T11:21:01.000000Z",
     * "updated_at": "2021-03-03T11:21:01.000000Z"
     * }
     * ],
     * "message": "Operation successful"
     * }
     */
    public function billingAddress(Request $request)
    {
        try {
            $bills = BillingDetails::with('country')->where('user_id', $request->user()->id)->get();

            $response = [
                'success' => true,
                'data' => $bills,
                'message' => "Operation successful"
            ];
            return response()->json($response, 200);
        } catch (\Exception $e) {
            $response = [
                'success' => false,
                'message' => "Operation Failed!"
            ];
            return response()->json($response, 200);
        }
    }


    /**
     * Countries
     * @response {
     * "success": true,
     * "data": [
     * {
     * "id": 1,
     * "name": "Afghanistan"
     * }
     * ],
     * "message": "Operation successful"
     * }
     */
    public function countries()
    {
        try {
            $countries = DB::table('countries')->select('id', 'name')->get();
            $response = [
                'success' => true,
                'data' => $countries,
                'message' => "Operation successful"
            ];
            return response()->json($response, 200);
        } catch (\Exception $e) {
            $response = [
                'success' => false,
                'message' => "Operation Failed!"
            ];
            return response()->json($response, 200);
        }
    }


    /**
     * Cities
     * @queryParam country_id required The id of course/quiz Example:1.
     * @response {
     * "success": true,
     * "data": [
     * {
     * "id": 1,
     * "name": "Dhaka"
     * }
     * ],
     * "message": "Operation successful"
     * }
     */
    public function states($country_id)
    {
        try {
            $states = DB::table('states')->where('country_id', $country_id)->select('id', 'name')->get();
            $response = [
                'success' => true,
                'data' => $states,
                'message' => "Operation successful"
            ];
            return response()->json($response, 200);
        } catch (\Exception $e) {
            $response = [
                'success' => false,
                'message' => "Operation Failed!"
            ];
            return response()->json($response, 200);
        }
    }


    /**
     * Cities
     * @queryParam country_id required The id of course/quiz Example:1.
     * @response {
     * "success": true,
     * "data": [
     * {
     * "id": 1,
     * "name": "Dhaka"
     * }
     * ],
     * "message": "Operation successful"
     * }
     */
    public function cities($state_id)
    {
        try {
            $cities = DB::table('spn_cities')->where('state_id', $state_id)->select('id', 'name')->get();
            $response = [
                'success' => true,
                'data' => $cities,
                'message' => "Operation successful"
            ];
            return response()->json($response, 200);
        } catch (\Exception $e) {
            $response = [
                'success' => false,
                'message' => "Operation Failed!"
            ];
            return response()->json($response, 200);
        }
    }


    /**
     * Payment Gateways
     * @response {
     * "success": true,
     * "data": [
     * {
     * "id": 1,
     * "method": "method-name",
     * "logo": "image.png"
     * }
     * ],
     * "message": "Operation successful"
     * }
     */
    public function paymentGateways()
    {
        try {
            $methods = PaymentMethod::where('active_status', 1)->get(['method', 'logo']);

            $response = [
                'success' => true,
                'data' => $methods,
                'message' => "Operation successful"
            ];
            return response()->json($response, 200);
        } catch (\Exception $e) {
            $response = [
                'success' => false,
                'message' => "Operation Failed!"
            ];
            return response()->json($response, 200);
        }
    }


    /**
     * My Billing Address
     * @response {
     * "success": true,
     * "data": [
     * {
     * "success": true,
     * "data": [
     * {
     * "id": 1,
     * "tracking_id": "K3USKPJBC5U8",
     * "user_id": 3,
     * "first_name": "Student",
     * "last_name": "",
     * "company_name": "Spondon IT",
     * "country": {
     * "id": 19,
     * "name": "Bangladesh",
     * "iso3": "BGD",
     * "iso2": "BD",
     * "phonecode": "880",
     * "currency": "BDT",
     * "capital": "Dhaka",
     * "active_status": 1,
     * "created_at": "2018-07-20T08:41:03.000000Z",
     * "updated_at": "2018-07-20T08:41:03.000000Z"
     * }
     * ],
     * "message": "Operation successful"
     * }
     * ],
     * "message": "Operation successful"
     * }
     */

    public function myBilling()
    {
        try {
            $bills = BillingDetails::with('country')->where('user_id', Auth::id())->latest()->get();

            $response = [
                'success' => true,
                'data' => $bills,
                'message' => "Operation successful"
            ];
            return response()->json($response, 200);
        } catch (\Exception $e) {
            $response = [
                'success' => false,
                'message' => "Operation Failed!"
            ];
            return response()->json($response, 200);
        }
    }

    public function paytmOrderGenerate(Request $request)
    {

        try {
            $paytmParams = array();
            $user = Auth::user();
            $track = Cart::where('user_id', $user->id)->first()->tracking ?? '';
            $paytmParams["MID"] = getPaymentEnv('PAYTM_MERCHANT_ID');
            $paytmParams["ORDERID"] = $track;


            $body['mid'] = getPaymentEnv('PAYTM_MERCHANT_ID');
            $body['key_secret'] = getPaymentEnv('PAYTM_MERCHANT_KEY');
            $body['website'] = getPaymentEnv('PAYTM_MERCHANT_WEBSITE');
            $body['orderId'] = $track;
            $body['amount'] = $request->amount;
            $body['callbackUrl'] = $request->callbackUrl;
            $body['mode'] = $request->mode;
            $body['testing'] = $request->testing;

            $paytmChecksum = PaytmChecksum::generateSignature(json_encode($body), getPaymentEnv('PAYTM_MERCHANT_KEY'));

            $response = [
                'success' => true,
                'tracking' => $track,
                'paytmChecksum' => $paytmChecksum,
                'message' => "Operation successful"
            ];
            return response()->json($response, 200);
        } catch (\Exception $e) {
            $response = [
                'success' => false,
                'message' => "Operation Failed!"
            ];
            return response()->json($response, 200);
        }
    }


    public function paytmOrderVerify(Request $request)
    {

        try {

            $paytmParams = array();

            $user = Auth::user();
            $track = Cart::where('user_id', $user->id)->first()->tracking;

            $paytmParams["MID"] = getPaymentEnv('PAYTM_MERCHANT_ID');
            $paytmParams["ORDERID"] = $track;

            $isVerifySignature = PaytmChecksum::verifySignature($paytmParams, getPaymentEnv('PAYTM_MERCHANT_KEY'), $request->paytmChecksum);
            if ($isVerifySignature) {
                $result = "Checksum Matched";
            } else {
                $result = "Checksum Mismatched";
            }

            $response = [
                'success' => true,
                'result' => $result,
                'message' => "Operation successful"
            ];
            return response()->json($response, 200);
        } catch (\Exception $e) {


            return response()->json($e, 200);
        }
    }

    public function getBbbMeetingUrl($meeting_id, $user_name)
    {
        try {
            Bigbluebutton::getMeetingInfo([
                'meetingID' => $meeting_id,
            ]);
            $localBbbMeeting = BbbMeeting::where('meeting_id', $meeting_id)->first();

            if (!$localBbbMeeting->isRunning()) {
                $status = 'Not running';
            } else {
                $status = 'running';
            }
            $url = Bigbluebutton::start([
                'meetingID' => $meeting_id,
                'password' => $localBbbMeeting->attendee_password,
                'userName' => $user_name,
            ]);
            $data['url'] = $url;
            $data['status'] = $status;
            return $data;
        } catch (\Exception $e) {
            return null;
        }
    }

    public function quizStart($courseId, $quizId)
    {
        try {
            $userId = Auth::id();
            $quiz = new QuizTest();
            $quiz->user_id = $userId;
            $quiz->course_id = $courseId;
            $quiz->quiz_id = $quizId;
            $quiz->quiz_type = 2;
            $quiz->start_at = now();
            $quiz->end_at = null;
            $quiz->duration = 0.00;

            $quiz->save();

            $return['result'] = true;
            $return['data'] = $quiz;
        } catch (\Exception $e) {
            $return['result'] = true;
            $return['data'] = null;
        }

        return $return;
    }

    public function singleQusSubmit(Request $request)
    {

        try {
            //            parameters
            //            type -> String example:M
            //            assign_id -> integer
            //            quiz_test_id -> integer
            //            ans ->array
            $answer = $request->ans;
            $type = $request->get('type');
            $assign_id = $request->get('assign_id');
            $quiz_test_id = $request->get('quiz_test_id');
            $assign = OnlineExamQuestionAssign::with('questionBank')->find($assign_id);
            $qus = $assign->question_bank_id;
            $quizTest = QuizTest::find($quiz_test_id);


            $start_at = Carbon::parse($quizTest->start_at);
            $end_at = Carbon::now();


            $quizTest->end_at = $end_at;
            $quizTest->duration = number_format(abs(strtotime($start_at) - strtotime($end_at)) / 60, 2) ?? 0.00;
            $quizTest->save();

            $check_details = QuizTestDetails::where('quiz_test_id', $quiz_test_id)->where('qus_id', $qus)->first();
            if ($check_details) {
                $quizDetails = $check_details;
            } else {
                $quizDetails = new QuizTestDetails();
                $quizDetails->quiz_test_id = $quiz_test_id;
                $quizDetails->qus_id = $qus;
                $quizDetails->status = 0;
                $quizDetails->mark = $assign->questionBank->marks;
                $quizDetails->save();
            }

            if ($type == "M") {

                $alreadyAns = QuizTestDetailsAnswer::where('quiz_test_details_id', $quizDetails->id)->get();
                $totalCorrectAns = QuestionBankMuOption::where('status', 1)->where('question_bank_id', $assign->question_bank_id)->count();

                foreach ($alreadyAns as $already) {
                    $already->delete();
                }
                $wrong = 0;
                $userCorrectAns = 0;
                if (!empty($answer)) {
                    foreach ($answer as $ans) {
                        $setAns = new QuizTestDetailsAnswer();
                        $option = QuestionBankMuOption::with('question')->find($ans);
                        if ($option) {
                            $setAns->quiz_test_details_id = $quizDetails->id;
                            $setAns->ans_id = $ans;
                            $setAns->status = $option->status;
                            $setAns->save();

                            if ($setAns->status == 0) {
                                $wrong++;
                            } elseif ($setAns->status == 1) {
                                $userCorrectAns++;
                            }
                        }
                    }
                    if ($wrong == 0) {
                        if ($userCorrectAns == $totalCorrectAns) {
                            $quizDetails->status = 1;
                        } else {
                            $quizDetails->status = 0;
                        }
                    } else {
                        $quizDetails->status = 0;
                    }
                    $quizDetails->save();
                }
            } else {

                $quizDetails->quiz_test_id = $quiz_test_id;
                $quizDetails->qus_id = $qus;
                $quizDetails->answer = $answer;
                $quizDetails->status = 0;
                $quizDetails->mark = 0;

                $quizDetails->save();
            }

            return true;
        } catch (\Exception $e) {
            return false;
        }
    }

    public function finalQusSubmit(Request $request)
    {
        //        quiz_test_id
        //type
        $userId = Auth::id();
        $quiz_test = QuizTest::with('quiz', 'details')->find($request->quiz_test_id);

        if ($quiz_test->quiz_id) {
            $marking = QuizMarking::where('quiz_id', $quiz_test->quiz_id)->where('quiz_test_id', $quiz_test->id)->where('student_id', $userId)->first();
        }

        if ($marking) {
            $quiz_marking = $marking;
        } else {
            $quiz_marking = new QuizMarking();
        }

        $quiz_marking->quiz_id = $quiz_test->quiz_id;
        $quiz_marking->quiz_test_id = $quiz_test->id;
        $quiz_marking->student_id = $userId;

        if (in_array('L', $request->type) || in_array('S', $request->type)) {
            $quiz_marking->marking_status = 0;
            $quiz_test->publish = 0;
        } else {
            $score = 0;
            if ($quiz_test->details) {
                foreach ($quiz_test->details as $test) {
                    $score += $test->mark ?? 1;
                }
            }
            $quiz_marking->marked_by = 0;
            $quiz_marking->marking_status = 1;
            $quiz_marking->marks = $score;
            $quiz_test->publish = 1;
        }
        $quiz_marking->save();

        $start_at = Carbon::parse($quiz_test->start_at);
        $end_at = Carbon::now();


        $quiz_test->end_at = $end_at;
        $quiz_test->duration = number_format(abs(strtotime($start_at) - strtotime($end_at)) / 60, 2) ?? 0.00;
        $quiz_test->save();

        return true;
    }

    public function quizResults()
    {
        $quiz = QuizTest::with('quiz')->where('user_id', Auth::user()->id)->get();

        $response = [
            'success' => true,
            'data' => $quiz,
            'message' => "Operation successful"
        ];
        return $response;
    }

    public function quizResult($course_id, $quiz_id)
    {
        $quizzes = QuizTest::with('quiz', 'details')->where('course_id', $course_id)->where('quiz_id', $quiz_id)->get();


        foreach ($quizzes as $key => $i) {
            $onlineQuiz = OnlineQuiz::find($i->quiz_id);
            $date = showDate($i->created_at);
            $totalQus = totalQuizQus($i->quiz_id);
            $totalAns = count($i->details);
            $totalCorrect = 0;
            $totalScore = totalQuizMarks($i->quiz_id);
            $score = 0;
            if ($totalAns != 0) {
                foreach ($i->details as $test) {
                    if ($test->status == 1) {
                        $score += $test->mark ?? 1;
                        $totalCorrect++;
                    }
                }
            }


            $preResult[$key]['quiz_test_id'] = $i->id;
            $preResult[$key]['totalQus'] = $totalQus;
            $preResult[$key]['date'] = $date;
            $preResult[$key]['totalAns'] = $totalAns;
            $preResult[$key]['totalCorrect'] = $totalCorrect;
            $preResult[$key]['totalWrong'] = $totalAns - $totalCorrect;
            $preResult[$key]['score'] = $score;
            $preResult[$key]['totalScore'] = $totalScore;
            $preResult[$key]['passMark'] = $onlineQuiz->percentage ?? 0;
            $preResult[$key]['mark'] = $score > 0 ? round($score / $totalScore * 100) : 0;;
            $preResult[$key]['publish'] = $i->publish;
            $preResult[$key]['status'] = $preResult[$key]['mark'] >= $preResult[$key]['passMark'] ? "Passed" : "Failed";
            $preResult[$key]['text_color'] = $preResult[$key]['mark'] >= $preResult[$key]['passMark'] ? "success_text" : "error_text";
            $i->pass = $preResult[$key]['mark'] >= $preResult[$key]['passMark'] ? "1" : "0";
            $i->save();

            $i->result = $preResult;
        }

        $response = [
            'success' => true,
            'data' => $quizzes,
            'message' => "Operation successful"
        ];
        return $response;
    }

    public function quizResultPreview($quiz_id)
    {
        $quizTest = QuizTest::with('quiz', 'quiz.assign', 'quiz.assign.questionBank', 'quiz.assign.questionBank.questionMu')->findOrFail($quiz_id);

        $questions = [];

        foreach ($quizTest->quiz->assign as $key => $assign) {
            $questions[$key]['qus'] = $assign->questionBank->question;
            $questions[$key]['type'] = $assign->questionBank->type;

            $test = QuizTestDetails::where('quiz_test_id', $quizTest->id)->where('qus_id', $assign->questionBank->id)->first();
            $questions[$key]['isSubmit'] = false;
            $questions[$key]['isWrong'] = false;

            if ($assign->questionBank->type != "M") {

                if ($test) {
                    $questions[$key]['isSubmit'] = true;
                    if ($test->status == 0) {
                        $questions[$key]['isWrong'] = true;
                    }
                    $questions[$key]['answer'] = $test->answer;
                }
            } else {
                foreach (@$assign->questionBank->questionMu as $key2 => $option) {
                    $questions[$key]['option'][$key2]['title'] = $option->title;
                    $questions[$key]['option'][$key2]['right'] = $option->status == 1 ? true : false;
                }

                if ($test) {
                    $questions[$key]['isSubmit'] = true;
                    if ($test->status == 0) {
                        $questions[$key]['option'][$key2]['wrong'] = $test->status == 0 ? true : false;
                        $questions[$key]['isWrong'] = true;
                    }
                }
            }
            if (!$questions[$key]['isSubmit']) {
                $questions[$key]['isWrong'] = true;
            }
        }


        $quizTest->questions = $questions;
        $response = [
            'success' => true,
            'data' => $quizTest,
            'message' => "Operation successful"
        ];
        return $response;
    }


    public function quizTestResult($quiz_test_id)
    {
        $quizTest = QuizTest::with('quiz', 'quiz.assign', 'quiz.assign.questionBank', 'quiz.assign.questionBank.questionMu')->findOrFail($quiz_test_id);

        $questions = [];

        foreach ($quizTest->quiz->assign as $key => $assign) {
            $questions[$key]['qus'] = $assign->questionBank->question;
            $questions[$key]['type'] = $assign->questionBank->type;

            $test = QuizTestDetails::where('quiz_test_id', $quizTest->id)->where('qus_id', $assign->questionBank->id)->first();
            $questions[$key]['isSubmit'] = false;
            $questions[$key]['isWrong'] = false;

            if ($assign->questionBank->type != "M") {

                if ($test) {
                    $questions[$key]['isSubmit'] = true;
                    if ($test->status == 0) {
                        $questions[$key]['isWrong'] = true;
                    }
                    $questions[$key]['answer'] = $test->answer;
                }
            } else {
                foreach (@$assign->questionBank->questionMu as $key2 => $option) {
                    $questions[$key]['option'][$key2]['title'] = $option->title;
                    $questions[$key]['option'][$key2]['right'] = $option->status == 1 ? true : false;
                }

                if ($test) {
                    $questions[$key]['isSubmit'] = true;
                    if ($test->status == 0) {
                        $questions[$key]['option'][$key2]['wrong'] = $test->status == 0 ? true : false;
                        $questions[$key]['isWrong'] = true;
                    }
                }
            }
            if (!$questions[$key]['isSubmit']) {
                $questions[$key]['isWrong'] = true;
            }
        }


        $quizTest->questions = $questions;
        $response = [
            'success' => true,
            'data' => $quizTest,
            'message' => "Operation successful"
        ];
        return $response;
    }

    public function quizHistory($quiz_id)
    {
        $preResult = [];
        $user = Auth::user();
        $all = QuizTest::with('details')->where('quiz_id',$quiz_id)->where('user_id', $user->id)->get();


        foreach ($all as $key => $i) {
            $onlineQuiz = OnlineQuiz::find($i->quiz_id);
            $date = showDate($i->created_at);
            $totalQus = totalQuizQus($i->quiz_id);
            $totalAns = count($i->details);
            $totalCorrect = 0;
            $totalScore = totalQuizMarks($i->quiz_id);
            $score = 0;
            if ($totalAns != 0) {
                foreach ($i->details as $test) {
                    if ($test->status == 1) {
                        $score += $test->mark ?? 1;
                        $totalCorrect++;
                    }

                }
            }


            $preResult[$key]['quiz_test_id'] = $i->id;
            $preResult[$key]['totalQus'] = $totalQus;
            $preResult[$key]['date'] = $date;
            $preResult[$key]['totalAns'] = $totalAns;
            $preResult[$key]['totalCorrect'] = $totalCorrect;
            $preResult[$key]['totalWrong'] = $totalAns - $totalCorrect;
            $preResult[$key]['score'] = $score;
            $preResult[$key]['totalScore'] = $totalScore;
            $preResult[$key]['passMark'] = $onlineQuiz->percentage ?? 0;
            $preResult[$key]['mark'] = $score > 0 && $totalScore>0 ? round($score / $totalScore * 100) : 0;
            $preResult[$key]['publish'] = $i->publish;
            $preResult[$key]['status'] = $preResult[$key]['mark'] >= $preResult[$key]['passMark'] ? "Passed" : "Failed";
            $preResult[$key]['text_color'] = $preResult[$key]['mark'] >= $preResult[$key]['passMark'] ? "success_text" : "error_text";
            $i->pass = $preResult[$key]['mark'] >= $preResult[$key]['passMark'] ? "1" : "0";
            $i->save();


        }


        $response = [
            'success' => true,
            'data' => $preResult,
            'message' => "Operation successful"
        ];
        return $response;
    }

    /**
     * Lesson Complete
     * @bodyParam course_id string required The id of Course Example:1
     * @bodyParam lesson_id string required The id of Lesson Example:1
     * @bodyParam status string required The status of Lesson Example:1
     * @response  {
     * "success": true,
     * "message": "Lesson complete successfully"
     * }
     */
    public function lessonComplete(Request $request)
    {


        try {
            $lesson = LessonComplete::where('course_id', $request->course_id)->where('lesson_id', $request->lesson_id)->where('user_id', Auth::id())->first();

            if (!$lesson) {
                $lesson = new LessonComplete();
                $lesson->user_id = Auth::id();
                $lesson->course_id = $request->course_id;
                $lesson->lesson_id = $request->lesson_id;
            }
            $lesson->status = $request->status;
            $lesson->save();
            $course = Course::find($request->course_id);
            if ($course) {
                $percentage = round($course->loginUserTotalPercentage);
                if ($percentage >= 100) {
                    $this->getCertificateRecord($course->id);


                    if (UserEmailNotificationSetup('Complete_Course', Auth::user())) {
                        SendGeneralEmail::dispatch(Auth::user(), 'Complete_Course', [
                            'time' => Carbon::now()->format('d-M-Y, g:i A'),
                            'course' => $course->title
                        ]);
                    }
                    if (UserBrowserNotificationSetup('Complete_Course', Auth::user())) {
                        send_browser_notification(Auth::user(), 'Complete_Course', [
                            'time' => Carbon::now()->format('d-M-Y, g:i A'),
                            'course' => $course->title
                        ],
                            trans('common.View'),
                            courseDetailsUrl(@$course->id, @$course->type, @$course->slug),
                        );
                    }

                    if (UserMobileNotificationSetup('Course_Chapter_Added', Auth::user()) && !empty(Auth::user()->device_token)) {
                        send_mobile_notification(Auth::user(), 'Course_Chapter_Added', [
                            'time' => Carbon::now()->format('d-M-Y, g:i A'),
                            'course' => $course->title
                        ]);
                    }
                }
            }

            $response = [
                'success' => true,
                'message' => "Lesson complete successfully"
            ];
            return $response;
        } catch (\Exception $e) {
            return false;
        }
    }

    public function getCertificateRecord($course_id)
    {

        try {
            $course = Course::find($course_id);

            if (!empty($course->certificate_id)) {
                $certificate = Certificate::find($course->certificate_id);
            } else {
                if ($course->type == 1) {
                    $certificate = Certificate::where('for_course', 1)->first();
                } elseif ($course->type == 2) {
                    $certificate = Certificate::where('for_quiz', 1)->first();
                } elseif ($course->type == 3) {
                    $certificate = Certificate::where('for_class', 1)->first();
                } else {
                    $certificate = null;
                }
            }
            if ($certificate) {
                $certificate_record = CertificateRecord::where('student_id', Auth::user()->id)->where('course_id', $course_id)->first();
                if (!$certificate_record) {
                    $certificate_record = new CertificateRecord();
                    $certificate_record->certificate_id = $this->generateUniqueCode();
                    $certificate_record->student_id = Auth::user()->id;
                    $certificate_record->course_id = $course_id;
                    $certificate_record->created_by = Auth::user()->id;
                    if (isModuleActive('Org')) {
                        if ($course->required_type == 1) {
                            $enrolls = $course->enrolls->where('user_id', Auth::id());
                            if (isset($enrolls[0])) {
                                $plan_id = $enrolls[0]->org_subscription_plan_id;
                                $checkout = OrgSubscriptionCheckout::where('plan_id', $plan_id)->where('user_id', \auth()->id())->latest()->first();
                                $certificate_record->start_date = $checkout->start_date;
                                $certificate_record->end_date = $checkout->end_date;
                            }

                        } else {
                            $certificate_record->start_date = $course->created_at;
                            $certificate_record->end_date = '';
                        }
                        addOrgRecentActivity(\auth()->id(), $course->id, 'Complete');
                    }


                    $certificate_record->save();
                }

                if (isModuleActive('Org')) {

                    request()->certificate_id = $certificate_record->certificate_id;
                    request()->course = $course;
                    request()->user = Auth::user();
                    $downloadFile = new CertificateController();
                    $certificate = $downloadFile->makeCertificate($certificate->id, request())['image'] ?? '';

                    $certificate->encode('jpg');

                    $certificate->save('public/certificate/' . $certificate_record->id . '.jpg');

                }
                return $certificate_record;
            } else {
                return null;
            }

        } catch (\Exception $e) {
            return null;
        }
    }

    public function generateUniqueCode()
    {
        do {
            $referal_code = random_int(100000, 999999);
        } while (CertificateRecord::where("certificate_id", "=", $referal_code)->first());

        return $referal_code;
    }

    public function sliders()
    {
        try {
            $sliders = Slider::where('status', 1)->get();
            return [
                'success' => true,
                'data' => $sliders,
                'message' => "Operation successful"
            ];
        } catch (\Exception $e) {
            return [
                'success' => false,
                'message' => "Operation failed"
            ];
        }
    }

    public function news()
    {
        try {
            $query = Blog::where('status', 1)->with('user', 'userRead');

            if (isModuleActive('Org')) {
                $query->where(function ($q) {
                    $q->where('audience', 1)
                        ->orWhere(function ($q) {
                            $q->where('audience', 2);
                            if (Auth::check()) {
                                if (Auth::user()->role_id != 1) {
                                    $q->whereHas('branches', function ($q) {
                                        $q->whereIn('branch_id', getAllChildCodeIds(Auth::user()->branch, [Auth::user()->branch->id]));
                                    });
                                }
                            } else {
                                $q->whereHas('branches', function ($q) {
                                    $q->where('branch_id', 0);
                                });
                            }
                        });
                });
            }
            $blogs = $query->latest()->get();

            $allIds = $blogs->pluck('id')->toArray();

            $read = UserBlog::whereIn('blog_id', $allIds)->where('user_id', Auth::id())
                ->count();

            return [
                'success' => true,
                'data' => $blogs,
                'count' => count($blogs),
                'read' => $read,
                'unread' => count($blogs) - $read,
                'message' => "Operation successful"
            ];
        } catch (\Exception $e) {
            return [
                'success' => false,
                'message' => "Operation failed"
            ];
        }
    }

    public function activities()
    {
        try {
            $activities = OrgRecentActivity::with('user', 'course', 'user.position')->whereHas('user')->latest()->get();
            return [
                'success' => true,
                'data' => $activities,
                'message' => "Operation successful"
            ];
        } catch (\Exception $e) {
            return [
                'success' => false,
                'message' => "Operation failed"
            ];
        }
    }

    public function loginDevices()
    {
        try {
            $logins = UserLogin::where('user_id', auth()->id())->where('status', 1)->get();
            return [
                'success' => true,
                'data' => $logins,
                'message' => "Operation successful"
            ];
        } catch (\Exception $e) {
            return [
                'success' => false,
                'message' => "Operation failed"
            ];
        }
    }

    public function certificateRecords()
    {
        try {
            $certificate_records = CertificateRecord::where('student_id', auth('api')->user()->id)->latest()->get();

            foreach ($certificate_records as $key => $certificate) {
                $certificate->title = @$certificate->course->title;

                $certificate->start_date = showDate($certificate->start_date);
                $certificate->end_date = empty($certificate->end_date) ? trans('org.Limitless') : showDate($certificate->end_date);

                $certificate->image = asset('public/certificate/' . $certificate->id . '.jpg');
            }

            return [
                'success' => true,
                'data' => $certificate_records,
                'message' => "Operation successful"
            ];
        } catch (\Exception $e) {
            return [
                'success' => false,
                'message' => "Operation failed"
            ];
        }
    }

    public function courseList(Request $request)
    {
        try {
            if ($request->type == 'online') {
                $mode_of_delivery = 1;
            } elseif ($request->type == 'offline') {
                $mode_of_delivery = 3;
            } else {
                $mode_of_delivery = '';
            }
            $search = $request->search;
            $type = $request->type;
            $status = $request->status;
            $with = ['course', 'course.activeReviews', 'course.courseLevel', 'course.BookmarkUsers', 'course.user', 'course.reviews', 'course.enrollUsers'];
            $with[] = 'course.quiz';
            $with[] = 'course.quiz.assign';
            $with[] = 'course.chapters';
            $with[] = 'course.class';
            $with[] = 'course.category';
            $query = CourseEnrolled::where('user_id', auth('api')->user()->id)
                ->whereHas('course', function ($query) use ($type) {
                    if (\request()->type == 'class') {
                        $course_type = [3];
                    } elseif (\request()->type == 'online' || \request()->type == 'offline') {
                        $course_type = [1];
                    } else {
                        $course_type = [1, 3];
                    }
                    $query->whereIn('type', $course_type);
                });
            if (!empty($mode_of_delivery)) {
                $query->whereHas('course', function ($query) use ($mode_of_delivery) {
                    $query->where('mode_of_delivery', '=', $mode_of_delivery);
                });
            }
            if (!empty($search)) {
                $query->whereHas('course', function ($query) use ($search) {
                    $query->where('title', 'LIKE', "%{$search}%");
                });
            }
            $query->with($with);
            $courses = $query->get();

            foreach ($courses as $c) {
                $course = Course::where('id', $c->course_id)->first();

                if ($course->type == 1) {
                    $percentage = $course->userTotalPercentage(auth('api')->user()->id, $course->id);
                } else {
                    $percentage = $course->userTotalClassPercentage(auth('api')->user()->id, $course->id);
                }
                $c->percentage = $percentage;

                if ($course->type == 1) {
                    $c->duration = MinuteFormat($course->duration);
                } else {
                    $c->duration = MinuteFormat($course->class->duration);
                }

                if ($course->type == 1)
                    $c->categoryName = $course->category->name;
                else
                    $c->categoryName = $course->class->category->name;

                if ($percentage == 100) {
                    $c->courseStatus = 'completed';
                } elseif ($percentage == 0) {
                    $c->courseStatus = 'notStarted';
                } else {
                    $c->courseStatus = 'started';
                }

                if ($course->mode_of_delivery == 3) {
                    $plan = $course->orgSubscriptionCourseList->first()->plan;
                    $offline_venue = $plan->offline_venue;
                    $c->venue = $offline_venue;
                } else {
                    if ($course->type == 1) {
                        $c->totalQuiz = count($course->quiz->assign);
                        $c->totalLessons = count($course->lessons);
                    } else {
                        $c->totalClass = $course->class->totalClass();
                    }
                }

                $days = orgGetStartEndDate($c, $c->course);
                $c->startDay = $days['start'];
                $c->endDay = $days['end'];
            }

            return [
                'success' => true,
                'data' => $courses,
                'message' => "Operation successful"
            ];
        } catch (\Exception $e) {
            return [
                'success' => false,
                'message' => "Operation failed $e"
            ];
        }
    }

    public function quizList(Request $request)
    {

        try {
            if ($request->type == 'online') {
                $mode_of_delivery = 1;
            } elseif ($request->type == 'offline') {
                $mode_of_delivery = 3;
            } else {
                $mode_of_delivery = '';
            }
            $type = $request->type;
            $status = $request->status;
            $with = ['course', 'course.activeReviews', 'course.courseLevel', 'course.BookmarkUsers', 'course.user', 'course.reviews', 'course.enrollUsers'];
            $with[] = 'course.quiz';
            $with[] = 'course.quiz.assign';
            $query = CourseEnrolled::where('user_id', auth('api')->user()->id)
                ->whereHas('course', function ($query) use ($type) {
                    $query->where('type', '=', 2);
                });
            if (!empty($mode_of_delivery)) {
                $query->whereHas('course', function ($query) use ($mode_of_delivery) {
                    $query->where('mode_of_delivery', '=', $mode_of_delivery);
                });
            }
            if ($request->limit == 1) {
                $limit = true;
            } else {
                $limit = false;
            }
            $query->with($with);
            $courses = $query->get();

            foreach ($courses as $c) {
                $course = Course::where('id', $c->course_id)->first();

                $percentage = $course->userQuizPercentage(auth('api')->user()->id, $course->id);

                $c->percentage = $percentage;

                if ($course->mode_of_delivery == 1) {
                    $c->venue = null;
                } else {
                    $c->venue = $c->orgSubscriptionPlan->offline_venue;
                }


                if ($percentage == 100) {
                    $c->courseStatus = 'completed';
                } elseif ($percentage == 0) {
                    $c->courseStatus = 'notStarted';
                } else {
                    $c->courseStatus = 'started';
                }

                $c->quizCount = count($course->quiz->assign);
                $c->quizPercentage = $course->quiz->percentage . "%";
                $c->quizRetestNumber = count($c->quizCompletes);
                if ($course->quiz->question_time_type == 0) {
                    $c->duration = MinuteFormat($course->quiz->question_time * count($course->quiz->assign));
                } else {
                    $c->duration = MinuteFormat($course->quiz->question_time);
                }
                $pass = count($course->quizCompletes->where('pass', 1)) != 0 ? true : false;
                if ($c->quizRetestNumber != 0) {
                    if ($pass) {
                        $c->quizStatus = __('org.Pass');
                    } else {
                        $c->quizStatus = __('org.Fail');
                    }
                } else {
                    $c->quizStatus = __('org.Not attempt');
                }

                $days = orgGetStartEndDate($c, $c->course);
                $c->startDay = $days['start'];
                $c->endDay = $days['end'];
            }

            return [
                'success' => true,
                'data' => $courses,
                'message' => "Operation successful"
            ];
        } catch (\Exception $e) {
            return [
                'success' => false,
                'message' => "Operation failed $e"
            ];
        }
    }

    public function learningSchedulePlans(Request $request)
    {
        try {
            if ($request->type == 'all') {
                $query = OrgSubscriptionCheckout::where('user_id', auth('api')->user()->id)->with('plan', 'plan.assign');


                $plans = $query->get();

                foreach ($plans as $plan) {
                    $p = $plan->plan;
                    $plan->position = json_decode($plan->position);
                    $p->total = round($p->totalCompleted()['totalProgress']);
                    $p->remaining = $p->remaining();

                    if ($p->type == 1) {
                        $p->start = showDate($p->join_date);
                        $p->end = showDate($plan->end_date);
                    } else {
                        $p->start = showDate($p->subscription->start_date);
                        $p->end = showDate($p->subscription->end_date);
                    }

                    $p->totalComplete = $p->totalCompleted()['completed_course'];
                }
                return [
                    'success' => true,
                    'data' => $plans,
                    'message' => "Operation successful"
                ];
            } else {
                $collection = collect();
                $month = $request->month;
                $year = $request->year;

                $open_started = CourseEnrolled::whereYear('created_at', '=', $year)
                    ->whereMonth('created_at', '=', $month)
                    ->with('course')
                    ->whereHas('course', function ($q) {
                        $q->where('required_type', 0);
                    })
                    ->where('user_id', auth('api')->user()->id)->orderBy('created_at')
                    ->get();

                $close_started = CourseEnrolled::with('orgSubscriptionPlan', 'course')
                    ->whereHas('course', function ($q) {
                        $q->where('required_type', 1);
                    })
                    ->whereHas('orgSubscriptionPlan', function ($q) use ($month, $year) {
                        $q->whereHas('checkouts', function ($q2) use ($month, $year) {
                            $q2->whereMonth('start_date', '=', $month);
                            $q2->whereYear('start_date', '=', $year);
                            $q2->whereYear('user_id', '=', auth('api')->user()->id);
                        });
                    })
                    ->where('user_id', auth('api')->user()->id)
                    ->get();

                $ended = CourseEnrolled::whereYear('subscription_validity_date', '=', $year)
                    ->whereMonth('subscription_validity_date', '=', $month)
                    ->with('orgSubscriptionPlan', 'course')
                    ->where('user_id', auth('api')->user()->id)
                    ->get();


                foreach ($open_started as $open) {
                    $course = Course::where('id', $open->course_id)->first();
                    $open->date = \Carbon\Carbon::parse($open->created_at)->format('Y-m-d');
                    $open->course_data_type = 'start';
                    $open->course_date = \Carbon\Carbon::parse($open->created_at)->format('d-m-Y');
                    $open->course_type = $this->getCourseType($open);
                    $open->course_title = $course->title . ' ' . '(' . (trans('common.Start Date')) . ')';
                    $open->course_day_month = \Carbon\Carbon::parse($open->created_at)->format('d-M');
                    $open->venue = $open->orgSubscriptionPlan->offline_venue ?? "";

                    $collection->push($open);
                }

                foreach ($close_started as $close) {
                    $course = Course::where('id', $close->course_id)->first();
                    $close->date = \Carbon\Carbon::parse($close->created_at)->format('Y-m-d');
                    $close->course_data_type = 'start';
                    $close->course_date = \Carbon\Carbon::parse($close->created_at)->format('d-m-Y');
                    $close->course_type = $this->getCourseType($close);
                    $close->course_title = $course->title . ' ' . '(' . (trans('common.Start Date')) . ')';
                    $close->course_day_month = \Carbon\Carbon::parse($close->created_at)->format('d-M');
                    $close->venue = $close->orgSubscriptionPlan->offline_venue ?? "";
                    $collection->push($close);
                }


                foreach ($ended as $end) {
                    $course = Course::where('id', $end->course_id)->first();
                    $end->date = $end->subscription_validity_date;
                    $end->course_data_type = 'end';
                    $end->course_date = \Carbon\Carbon::parse($end->subscription_validity_date)->format('d-m-Y');
                    $end->course_type = $this->getCourseType($end);
                    $end->course_title = $course->title . ' ' . '(' . (trans('common.End Date')) . ')';
                    $end->course_day_month = \Carbon\Carbon::parse($end->created_at)->format('d-M');
                    $end->venue = $end->orgSubscriptionPlan->offline_venue ?? "";
                    $collection->push($end);
                }

                $count = [
                    'open' => count($open_started),
                    'close' => count($close_started),
                    'end' => count($ended),
                    'collection' => count($collection),
                ];

                return [
                    'success' => true,
                    'data' => $collection,
                    'message' => "Operation successful"
                ];
            }
        } catch (\Exception $e) {
            return [
                'success' => false,
                'message' => "$e"
            ];
        }
    }

    public function learningSchedulePlanList($plan_id)
    {
        try {
            $orgSub = OrgCourseSubscription::with('assign.course.user')->with('assign.course.category')->find($plan_id);
            $courses = $orgSub->assign;
            foreach ($courses as $c) {
                $course = Course::where('id', $c->course_id)->first();

                if ($course->quiz_id != null) {
                    $percentage = $course->userQuizPercentage(auth('api')->user()->id, $course->id);

                    $c->percentage = $percentage;

                    if ($course->mode_of_delivery == 1) {
                        $c->venue = null;
                    } else {
                        $c->venue = $c->plan->offline_venue;
                    }


                    if ($percentage == 100) {
                        $c->courseStatus = 'completed';
                    } elseif ($percentage == 0) {
                        $c->courseStatus = 'notStarted';
                    } else {
                        $c->courseStatus = 'started';
                    }

                    $c->quizCount = count($course->quiz->assign);
                    $c->quizPercentage = $course->quiz->percentage . "%";
                    $c->quizRetestNumber = count($course->quizCompletes);
                    if ($course->quiz->question_time_type == 0) {
                        $c->duration = MinuteFormat($course->quiz->question_time * count($course->quiz->assign));
                    } else {
                        $c->duration = MinuteFormat($course->quiz->question_time);
                    }
                    $pass = count($course->quizCompletes->where('pass', 1)) != 0 ? true : false;
                    if ($c->quizRetestNumber != 0) {
                        if ($pass) {
                            $c->quizStatus = __('org.Pass');
                        } else {
                            $c->quizStatus = __('org.Fail');
                        }
                    } else {
                        $c->quizStatus = __('org.Not attempt');
                    }
                } else {
                    if ($course->type == 1) {
                        $percentage = $course->userTotalPercentage(auth('api')->user()->id, $course->id);
                    } else {
                        $percentage = $course->userTotalClassPercentage(auth('api')->user()->id, $course->id);
                    }

                    $c->percentage = $percentage;


                    if ($course->type == 1) {
                        $c->duration = MinuteFormat($course->duration);
                    } else {
                        $c->duration = MinuteFormat($course->class->duration);
                    }

                    if ($course->type == 1)
                        $c->categoryName = $course->category->name;
                    else
                        $c->categoryName = $course->class->category->name;

                    if ($percentage == 100) {
                        $c->courseStatus = 'completed';
                    } elseif ($percentage == 0) {
                        $c->courseStatus = 'notStarted';
                    } else {
                        $c->courseStatus = 'started';
                    }

                    if ($course->mode_of_delivery == 3) {
                        $plan = $course->orgSubscriptionCourseList->first()->plan;
                        $offline_venue = $plan->offline_venue;
                        $c->venue = $offline_venue;
                    } else {
                        if ($course->type == 1) {
                            $c->totalQuiz = count($course->quiz->assign);
                            $c->totalLessons = count($course->lessons);
                        } else {
                            $c->totalClass = $course->class->totalClass();
                        }
                    }
                }
                $days = orgGetStartEndDate($c, $c->course);
                $c->startDay = $days['start'];
                $c->endDay = $days['end'];
            }

            return [
                'success' => true,
                'data' => $orgSub,
                'message' => "Operation successful"
            ];
        } catch (\Exception $e) {
            return [
                'success' => false,
                'message' => "$e"
            ];
        }
    }

    public function courseReport()
    {
        try {
            $courses = CourseEnrolled::where('user_id', auth('api')->user()->id)->with('course')->latest()->get();
            foreach ($courses as $c) {

                $course = Course::where('id', $c->course_id)->first();

                $c->type = $course->required_type == 1 ? trans('courses.Compulsory') : trans('courses.Open');

                if ($course->mode_of_delivery == 1) {
                    $c->deliveryMode = trans('courses.Online');
                } elseif ($course->mode_of_delivery == 2) {
                    $c->deliveryMode = trans('courses.Distance Learning');
                } else {
                    if (isModuleActive('Org')) {
                        $c->deliveryMode = trans('courses.Offline');
                    } else {
                        $c->deliveryMode = trans('courses.Face-to-Face');
                    }
                }

                $c->date = showDate($course->created_at);

                if ($course->type == 1) {
                    $c->completionRate = $c->userTotalPercentage . '%';
                }
                $c->completionDate = $c->userCompleteDate;


                $percentage = $c->userTotalPercentage;
                $c->percentage = $percentage;
                if ($percentage == 0) {
                    $c->courseStatus = trans('courses.Not Started yet');
                } else {
                    if ($course->type == 1) {
                        if ($percentage == 100) {
                            $c->courseStatus = trans('courses.Completed');
                        } else {
                            $c->courseStatus = trans('courses.Studying');
                        }
                    } else {
                        if ($percentage == 100) {
                            $c->courseStatus = trans('common.Pass');
                        } else {
                            $c->courseStatus = trans('common.Fail');
                        }
                    }
                }
            }

            return [
                'success' => true,
                'data' => $courses,
                'message' => "Operation successful"
            ];
        } catch (\Exception $e) {
            return [
                'success' => false,
                'message' => "$e"
            ];
        }
    }

    public function quizReport()
    {
        try {
            $quizzes = QuizTest::with(['course', 'course.quiz', 'user'])->latest()->where('user_id', auth('api')->user()->id)->get();

            foreach ($quizzes as $key => $quiz) {

                $totalCorrect = $quiz->details->where('status', 1)->sum('mark');
                $totalMark = $quiz->quiz->totalMarks();

                $quiz->totalCorrect = $totalCorrect . '/' . $totalMark;

                if ($totalCorrect == 0 || $totalMark == 0) {
                    $result = 0;
                } else {
                    $result = ($totalCorrect / $totalMark) * 100;
                }
                $quiz->result = $result . '%';

                $quiz->duration = $quiz->duration . ' ' . trans('common.Min');

                if ($quiz->pass == 1) {
                    $quiz->passFail = trans('common.Pass');
                } else {
                    $quiz->passFail = trans('common.Fail');
                }
            }
            return [
                'success' => true,
                'data' => $quizzes,
                'message' => "Operation successful"
            ];
        } catch (\Exception $e) {
            return [
                'success' => false,
                'message' => "Operation failed"
            ];
        }
    }

    private function getCourseType($item)
    {
        $mode = $item->course->mode_of_delivery;
        if ($mode == 1) {
            $mode = 'online';
        } else {
            $mode = 'offline';
        }

        $type = $item->course->type;

        if ($type == 1) {
            $type = $mode . '-course';
        } elseif ($type == 2) {
            $type = $mode . '-quiz';
        } elseif ($type == 3) {
            $type = 'live';
        }
        return 'data-month-' . $type;
    }

    public function notifications(Request $request): array
    {
        try {

            if ($request->type == 'read') {
                auth('api')->user()->unreadNotifications->where('id', $request->id)->markAsRead();
                $data['notifications'] = auth('api')->user()->notifications;
                $data['total_unread'] = auth('api')->user()->unreadNotifications->count();
                return [
                    'success' => true,
                    'data' => $data,
                    'message' => "Operation successful"
                ];
            } else if ($request->type == 'read-all') {
                auth('api')->user()->unreadNotifications->markAsRead();
                $data['notifications'] = auth('api')->user()->notifications;
                $data['total_unread'] = auth('api')->user()->unreadNotifications->count();
                return [
                    'success' => true,
                    'data' => $data,
                    'message' => "Operation successful"
                ];
            } else {
                $data['notifications'] = auth('api')->user()->notifications;
                $data['total_unread'] = auth('api')->user()->unreadNotifications->count();
                return [
                    'success' => true,
                    'data' => $data,
                    'message' => "Operation successful"
                ];
            }

        } catch (\Exception $e) {
            return [
                'success' => false,
                'message' => "Operation failed"
            ];
        }
    }


    public function deleteComment(Request $request)
    {
        try {
            $comment = CourseComment::find($request->id);
            $user = Auth::user();
            if ($comment->user_id == $user->id || $user->role_id == 1 || $comment->instructor_id == $user->id) {
                $comment->delete();
                if (isset($comment->replies)) {
                    foreach ($comment->replies as $replay) {
                        $replay->delete();
                    }
                }
                return [
                    'success' => true,
                    'message' => "Operation successful"
                ];
            } else {
                return [
                    'success' => false,
                    'message' => "Operation un-successful"
                ];
            }
        } catch (\Exception $exception) {
            return [
                'success' => false,
                'error' => $exception,
                'message' => "Operation failed"
            ];
        }
    }

    public function deleteReview(Request $request)
    {
        try {
            $review = CourseReveiw::find($request->id);
            $course_id = $review->course_id;
            $user = Auth::user();
            if ($review->user_id == $user->id || $user->role_id == 1 || $review->instructor_id == $user->id) {
                $review->delete();

                $course = Course::find($course_id);
                $total = CourseReveiw::where('course_id', $course->id)->sum('star');
                $count = CourseReveiw::where('course_id', $course->id)->where('status', 1)->count();
                if ($total != 0) {
                    $average = $total / $count;
                } else {
                    $average = 0;
                }
                $course->reveiw = $average;
                $course->total_rating = $average;
                $course->save();


                $course_user = User::find($course->user_id);
                $user_courses = Course::where('user_id', $course_user->id)->get();
                $user_total = 0;
                $user_rating = 0;
                foreach ($user_courses as $u_course) {
                    $total = CourseReveiw::where('course_id', $u_course->id)->sum('star');
                    $count = CourseReveiw::where('course_id', $u_course->id)->where('status', 1)->count();
                    if ($total != 0) {
                        $user_total = $user_total + 1;
                        $average = $total / $count;
                        $user_rating = $user_rating + $average;
                    }
                }
                if ($user_total != 0) {
                    $user_rating = $user_rating / $user_total;
                }
                $course_user->total_rating = $user_rating;
                $course_user->save();

                $total = CourseReveiw::where('course_id', $course->id)->sum('star');
                $count = CourseReveiw::where('course_id', $course->id)->where('status', 1)->count();
                if ($total != 0) {
                    $average = $total / $count;
                } else {
                    $average = 0;
                }
                $course->reveiw = $average;
                $course->total_rating = $average;
                $course->save();


                return [
                    'success' => true,
                    'message' => "Operation successful"
                ];
            } else {
                return [
                    'success' => false,
                    'message' => "Operation un-successful"
                ];
            }
        } catch (\Exception $exception) {
            return [
                'success' => false,
                'error' => $exception,
                'message' => "Operation failed"
            ];
        }
    }

    public function deleteCommnetReply(Request $request)
    {
        try {

            $reply = CourseCommentReply::find($request->id);
            $course = Course::find($reply->course_id);
            $user = Auth::user();

            if ($reply->user_id == $user->id || $user->role_id == 1 || $course->user_id == $user->id) {
                $reply->delete();

                return [
                    'success' => true,
                    'message' => trans('common.Operation successful')
                ];
            } else {
                return [
                    'success' => false,
                    'message' => 'Invalid access'
                ];
            }
        } catch (\Exception $e) {
            return [
                'success' => false,
                'error' => $e,
                'message' => "Operation failed"
            ];
        }
    }

    public function offlineAttendanceReport()
    {
        try {
            $query = OrgAttendance::query();
            $query->with('course', 'user');
            $query->where('user_id', Auth::id());
            $attendances = $query->get();

            $data = collect();

            foreach ($attendances as $attendance) {
                $at = [
                    'course' => $attendance->course->title,
                    'class' => $attendance->class->title,
                    'start_date' => showDate($attendance->created_at),
                    'attend' => $attendance->attend,
                    'total_score' => $attendance->total_score,
                    'rate' => $attendance->pass_rate,
                    'actual_score' => $attendance->actual_score,

                ];

                $data->push($at);
            }

            return [
                'success' => true,
                'data' => $data,
                'message' => "Operation successful"
            ];
        } catch (\Exception $e) {
            return [
                'success' => false,
                'message' => "Operation failed"
            ];
        }
    }

    public function visitBlogPost($blog_id)
    {

        UserBlog::updateOrInsert([
            'user_id' => Auth::id(),
            'blog_id' => $blog_id,
        ]);

        return [
            'success' => true,
            'message' => "Operation successful"
        ];
    }

    public function enrollIAP(Request $request)
    {
        try {

            $user = auth('api')->user();

            $course = Course::find($request->id);
            $cart = new Cart();
            $cart->user_id = $user->id;
            $cart->instructor_id = $course->user_id;
            $cart->course_id = $request->id;
            $cart->tracking = getTrx();
            if ($course->discount_price != null) {
                $cart->price = $course->discount_price;
            } else {
                $cart->price = $course->price;
            }
            $cart->save();

            $tracking = Cart::where('user_id', Auth::id())->first()->tracking;

            $total = Cart::where('user_id', Auth::user()->id)->sum('price');

            $checkout = Checkout::where('tracking', $tracking)->where('user_id', Auth::id())->latest()->first();
            if (!$checkout) {
                $checkout = new Checkout();
                $checkout->discount = 0.00;
                $checkout->purchase_price = $total;
                $checkout->tracking = $tracking;
                $checkout->user_id = Auth::id();
                $checkout->price = $total;
                $checkout->status = 0;
                $checkout->save();
            }

            $checkout_info = Checkout::where('tracking', $tracking)->where('user_id', $user->id)->latest()->first();

            $checkout_info = $checkout;
            if ($checkout_info) {
                $checkout_info->billing_detail_id = 0;
                $checkout_info->payment_method = 'IAP';
                $checkout_info->save();

                $carts = Cart::where('tracking', $checkout_info->tracking)->get();

                foreach ($carts as $cart) {

                    $payment = new PaymentController();
                    $payment->directEnroll($cart->course_id, $checkout_info->tracking);
                    $cart->delete();
                }
                $response = [
                    'success' => true,
                    'type' => 'Free',
                    'message' => 'Operation successful'
                ];
                return response()->json($response, 200);
            }
        } catch (\Exception $e) {
            GettingError($e->getMessage(), url()->current(), request()->ip(), request()->userAgent());
        }
    }
}

© 2025 UnknownSec
afwwrfwafr45458465
Password