<?php
defined('BASEPATH') or exit('No direct script access allowed');

if (file_exists("application/aws-module/aws-autoloader.php")) {
    include APPPATH . 'aws-module/aws-autoloader.php';
}
//v5.7
class Crud_model extends CI_Model
{

    function __construct()
    {
        parent::__construct();
        /*cache control*/
        $this->output->set_header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
        $this->output->set_header('Pragma: no-cache');
    }

    public function get_categories($param1 = "")
    {
        if ($param1 != "") {
            $this->db->where('id', $param1);
        }
        $this->db->where('parent', 0);
        return $this->db->get('category');
    }

    public function get_category_details_by_id($id)
    {
        return $this->db->get_where('category', array('id' => $id));
    }

    public function get_category_id($slug = "")
    {
        $category_details = $this->db->get_where('category', array('slug' => $slug))->row_array();
        return $category_details['id'];
    }

    public function add_category()
    {
        $data['code']   = html_escape($this->input->post('code'));
        $data['name']   = html_escape($this->input->post('name'));
        $data['parent'] = html_escape($this->input->post('parent'));
        $data['slug']   = slugify(html_escape($this->input->post('name')));

        // CHECK IF THE CATEGORY NAME ALREADY EXISTS
        $this->db->where('name', $data['name']);
        $this->db->or_where('slug', $data['slug']);
        $previous_data = $this->db->get('category')->num_rows();

        if ($previous_data == 0) {
            // Font awesome class adding
            if ($_POST['font_awesome_class'] != "") {
                $data['font_awesome_class'] = html_escape($this->input->post('font_awesome_class'));
            } else {
                $data['font_awesome_class'] = 'fas fa-chess';
            }

            if ($this->input->post('parent') == 0) {
                // category thumbnail adding
                if (!file_exists('uploads/thumbnails/category_thumbnails')) {
                    mkdir('uploads/thumbnails/category_thumbnails', 0777, true);
                }
                if ($_FILES['category_thumbnail']['name'] == "") {
                    $data['thumbnail'] = 'category-thumbnail.png';
                } else {
                    $data['thumbnail'] = md5(rand(10000000, 20000000)) . '.jpg';
                    move_uploaded_file($_FILES['category_thumbnail']['tmp_name'], 'uploads/thumbnails/category_thumbnails/' . $data['thumbnail']);
                }
             }

             if ($this->input->post('parent')) {
                // Check if the directory exists, if not create it
                $upload_directory = 'uploads/thumbnails/category_thumbnails';
                if (!file_exists($upload_directory)) {
                    mkdir($upload_directory, 0777, true);
                }
                
                // Check if a file is uploaded
                if ($_FILES['sub_category_thumbnail']['name'] == "") {
                    $data['sub_category_thumbnail'] = NULL;
                } else {
                    // Generate a unique filename
                    $file_extension = pathinfo($_FILES['sub_category_thumbnail']['name'], PATHINFO_EXTENSION);
                    $filename = md5(rand(10000000, 20000000)) . '.' . $file_extension;
                    $upload_path = $upload_directory . '/' . $filename;
                    if (move_uploaded_file($_FILES['sub_category_thumbnail']['tmp_name'], $upload_path)) {
                        $data['sub_category_thumbnail'] = $filename;
                    } else {
                        $error_message = "Failed to move the uploaded file.";
                    }
                }
            }
            

            $data['date_added'] = strtotime(date('D, d-M-Y'));
            $this->db->insert('category', $data);
            return true;
        }

        return false;
    }

    public function edit_category($param1)
    {
        $data['name']   = html_escape($this->input->post('name'));
        $data['parent'] = html_escape($this->input->post('parent'));
        $data['slug']   = slugify(html_escape($this->input->post('name')));

        // CHECK IF THE CATEGORY NAME ALREADY EXISTS
        $this->db->where('name', $data['name']);
        $this->db->or_where('slug', $data['slug']);
        $previous_data = $this->db->get('category')->result_array();

        $checker = true;
        foreach ($previous_data as $row) {
            if ($row['id'] != $param1) {
                $checker = false;
                break;
            }
        }

        if ($checker) {
            // Font awesome class adding
            if ($_POST['font_awesome_class'] != "") {
                $data['font_awesome_class'] = html_escape($this->input->post('font_awesome_class'));
            } else {
                $data['font_awesome_class'] = 'fas fa-chess';
            }

            if ($this->input->post('parent') == 0) {
                // category thumbnail adding
                if (!file_exists('uploads/thumbnails/category_thumbnails')) {
                    mkdir('uploads/thumbnails/category_thumbnails', 0777, true);
                }
                if ($_FILES['category_thumbnail']['name'] != "") {
                    $data['thumbnail'] = md5(rand(10000000, 20000000)) . '.jpg';
                    move_uploaded_file($_FILES['category_thumbnail']['tmp_name'], 'uploads/thumbnails/category_thumbnails/' . $data['thumbnail']);
                }
            }

            if ($this->input->post('parent')) {
                // Sub category thumbnail adding
                if (!file_exists('uploads/thumbnails/category_thumbnails')) {
                    mkdir('uploads/thumbnails/category_thumbnails', 0777, true);
                }
                if ($_FILES['sub_category_thumbnail']['name'] != "") {
                    $data['sub_category_thumbnail'] = md5(rand(10000000, 20000000)) . '.jpg';
                    move_uploaded_file($_FILES['sub_category_thumbnail']['tmp_name'], 'uploads/thumbnails/category_thumbnails/' . $data['sub_category_thumbnail']);
                }
            }
            

            $data['last_modified'] = strtotime(date('D, d-M-Y'));
            $this->db->where('id', $param1);
            $this->db->update('category', $data);

            return true;
        }
        return false;
    }

    public function delete_category($category_id)
    {
        $this->db->where('id', $category_id);
        $this->db->delete('category');

        $this->db->where('parent', $category_id);
        $this->db->delete('category');
    }

   // Category Sub Category Image Delete
    public function delete_subcategory_image($category_id)
    {
        $this->db->where('id', $category_id);
        $this->db->update('category', array('sub_category_thumbnail' => NULL));
    }



    public function get_sub_categories($parent_id = "")
    {
        return $this->db->get_where('category', array('parent' => $parent_id))->result_array();
    }

    public function enrol_history($course_id = "", $distinct_data = false)
    {
        if ($distinct_data) {
            $this->db->select('user_id');
            $this->db->distinct('user_id');
            $this->db->where('course_id', $course_id);
            return $this->db->get('enrol');
        } else {
            if ($course_id > 0) {
                return $this->db->get_where('enrol', array('course_id' => $course_id));
            } else {
                return $this->db->get('enrol');
            }
        }
    }

    public function enrol_history_by_user_id($user_id = "")
    {
        return $this->db->get_where('enrol', array('user_id' => $user_id));
    }

    public function all_enrolled_student()
    {
        $this->db->select('user_id');
        $this->db->distinct('user_id');
        return $this->db->get('enrol');
    }

    public function enrol_history_by_date_range($timestamp_start = "", $timestamp_end = "")
    {
        $this->db->order_by('date_added', 'desc');
        $this->db->where('date_added >=', $timestamp_start);
        $this->db->where('date_added <=', $timestamp_end);
        return $this->db->get('enrol');
    }

    public function get_revenue_by_user_type($timestamp_start = "", $timestamp_end = "", $revenue_type = "")
    {
        $course_ids = array();
        $courses    = array();
        $admin_details = $this->user_model->get_admin_details()->row_array();
        if ($revenue_type == 'admin_revenue') {
            $this->db->where('date_added >=', $timestamp_start);
            $this->db->where('date_added <=', $timestamp_end);
        } elseif ($revenue_type == 'instructor_revenue') {

            $this->db->where('user_id !=', $admin_details['id']);
            $this->db->select('id');
            $courses = $this->db->get('course')->result_array();
            foreach ($courses as $course) {
                if (!in_array($course['id'], $course_ids)) {
                    array_push($course_ids, $course['id']);
                }
            }
            if (sizeof($course_ids)) {
                $this->db->where_in('course_id', $course_ids);
            } else {
                return array();
            }
        }

        $this->db->order_by('date_added', 'desc');
        return $this->db->get('payment')->result_array();
    }

    public function get_instructor_revenue($user_id = "", $timestamp_start = "", $timestamp_end = "")
    {
        $course_ids = array();
        $courses    = array();

        // $multi_instructor_course_ids = $this->multi_instructor_course_ids_for_an_instructor($user_id);

        // if ($user_id > 0) {
        //     $this->db->where('user_id', $user_id);
        // } else {
        //     $user_id = $this->session->userdata('user_id');
        //     $this->db->where('user_id', $user_id);
        // }

        // if ($multi_instructor_course_ids && count($multi_instructor_course_ids)) {
        //     $this->db->or_where_in('id', $multi_instructor_course_ids);
        //     $this->db->where('creator', $user_id);
        // }



        //revenue only showing on course creator panel
        if ($user_id > 0) {
            $this->db->where('creator', $user_id);
        } else {
            $this->db->where('creator', $this->session->userdata('user_id'));
        }

        $this->db->select('id');
        $courses = $this->db->get('course')->result_array();
        foreach ($courses as $course) {
            if (!in_array($course['id'], $course_ids)) {
                array_push($course_ids, $course['id']);
            }
        }
        if (sizeof($course_ids)) {
            $this->db->where_in('course_id', $course_ids);
        } else {
            return array();
        }

        // CHECK IF THE DATE RANGE IS SELECTED
        if (!empty($timestamp_start) && !empty($timestamp_end)) {
            $this->db->where('date_added >=', $timestamp_start);
            $this->db->where('date_added <=', $timestamp_end);
        }

        $this->db->order_by('date_added', 'desc');
        return $this->db->get('payment')->result_array();
    }

    public function delete_payment_history($param1)
    {
        $this->db->where('id', $param1);
        $this->db->delete('payment');
    }
    public function delete_enrol_history($param1)
    {
        $this->db->where('id', $param1);
        $this->db->delete('enrol');
    }

    public function purchase_history($user_id = "")
    {
        if ($user_id > 0) {
            return $this->db->get_where('payment', array('user_id' => $user_id));
        } else {
            return $this->db->get('payment');
        }
    }

    public function get_payment_details_by_id($payment_id = "")
    {
        return $this->db->get_where('payment', array('id' => $payment_id))->row_array();
    }

    public function update_payout_status($payout_id = "", $payment_type = "")
    {
        $updater = array(
            'status' => 1,
            'payment_type' => $payment_type,
            'last_modified' => strtotime(date('D, d-M-Y'))
        );
        $this->db->where('id', $payout_id);
        $this->db->update('payout', $updater);
    }

    public function update_system_settings()
    {
        $data['value'] = html_escape($this->input->post('system_name'));
        $this->db->where('key', 'system_name');
        $this->db->update('settings', $data);

        $data['value'] = html_escape($this->input->post('system_title'));
        $this->db->where('key', 'system_title');
        $this->db->update('settings', $data);

        $data['value'] = html_escape($this->input->post('author'));
        $this->db->where('key', 'author');
        $this->db->update('settings', $data);

        $data['value'] = html_escape($this->input->post('slogan'));
        $this->db->where('key', 'slogan');
        $this->db->update('settings', $data);

        $data['value'] = html_escape($this->input->post('language'));
        $this->db->where('key', 'language');
        $this->db->update('settings', $data);

        $data['value'] = html_escape($this->input->post('text_align'));
        $this->db->where('key', 'text_align');
        $this->db->update('settings', $data);

        $data['value'] = html_escape($this->input->post('system_email'));
        $this->db->where('key', 'system_email');
        $this->db->update('settings', $data);

        $data['value'] = html_escape($this->input->post('address'));
        $this->db->where('key', 'address');
        $this->db->update('settings', $data);

        $data['value'] = html_escape($this->input->post('phone'));
        $this->db->where('key', 'phone');
        $this->db->update('settings', $data);

        $data['value'] = html_escape($this->input->post('youtube_api_key'));
        $this->db->where('key', 'youtube_api_key');
        $this->db->update('settings', $data);

        $data['value'] = html_escape($this->input->post('vimeo_api_key'));
        $this->db->where('key', 'vimeo_api_key');
        $this->db->update('settings', $data);

        $data['value'] = html_escape($this->input->post('purchase_code'));
        $this->db->where('key', 'purchase_code');
        $this->db->update('settings', $data);

        $data['value'] = html_escape($this->input->post('footer_text'));
        $this->db->where('key', 'footer_text');
        $this->db->update('settings', $data);

        $data['value'] = html_escape($this->input->post('footer_link'));
        $this->db->where('key', 'footer_link');
        $this->db->update('settings', $data);

        $data['value'] = html_escape($this->input->post('website_keywords'));
        $this->db->where('key', 'website_keywords');
        $this->db->update('settings', $data);

        $data['value'] = html_escape($this->input->post('website_description'));
        $this->db->where('key', 'website_description');
        $this->db->update('settings', $data);

        $data['value'] = html_escape($this->input->post('student_email_verification'));
        $this->db->where('key', 'student_email_verification');
        $this->db->update('settings', $data);

        $data['value'] = html_escape($this->input->post('course_accessibility'));
        $this->db->where('key', 'course_accessibility');
        $this->db->update('settings', $data);

        $data['value'] = html_escape($this->input->post('allowed_device_number_of_loging'));
        if ($data['value'] < 1 || !is_numeric($data['value'])) {
            $data['value'] = 1;
        }
        $this->db->where('key', 'allowed_device_number_of_loging');
        $this->db->update('settings', $data);

        $data['value'] = html_escape($this->input->post('course_selling_tax'));
        $this->db->where('key', 'course_selling_tax');
        $this->db->update('settings', $data);

        $data['value'] = html_escape($this->input->post('google_analytics_id'));
        $this->db->where('key', 'google_analytics_id');
        $this->db->update('settings', $data);

        $data['value'] = html_escape($this->input->post('meta_pixel_id'));
        $this->db->where('key', 'meta_pixel_id');
        $this->db->update('settings', $data);



        $this->db->where('key', 'account_disable');
        $row = $this->db->get('settings');
        if ($row->num_rows() > 0) {
            $this->db->where('key', 'account_disable');
            $this->db->update('settings', ['value' => $this->input->post('account_disable')]);
        } else {
            $this->db->insert('settings', ['key' => 'account_disable', 'value' => $this->input->post('account_disable')]);
        }

        $this->db->where('key', 'timezone');
        $row = $this->db->get('settings');
        if ($row->num_rows() > 0) {
            $this->db->where('key', 'timezone');
            $this->db->update('settings', ['value' => $this->input->post('timezone')]);
        } else {
            $this->db->insert('settings', ['key' => 'timezone', 'value' => $this->input->post('timezone')]);
        }
    }

    public function update_smtp_settings()
    {
        $data['value'] = html_escape($this->input->post('protocol'));
        $this->db->where('key', 'protocol');
        $this->db->update('settings', $data);

        $data['value'] = html_escape($this->input->post('smtp_crypto'));
        $this->db->where('key', 'smtp_crypto');
        $this->db->update('settings', $data);

        $data['value'] = html_escape($this->input->post('smtp_host'));
        $this->db->where('key', 'smtp_host');
        $this->db->update('settings', $data);

        $data['value'] = html_escape($this->input->post('smtp_port'));
        $this->db->where('key', 'smtp_port');
        $this->db->update('settings', $data);

        $data['value'] = html_escape($this->input->post('smtp_from_email'));
        $this->db->where('key', 'smtp_from_email');
        $this->db->update('settings', $data);

        $data['value'] = html_escape($this->input->post('smtp_user'));
        $this->db->where('key', 'smtp_user');
        $this->db->update('settings', $data);

        $data['value'] = html_escape($this->input->post('smtp_pass'));
        $this->db->where('key', 'smtp_pass');
        $this->db->update('settings', $data);
    }

    public function update_social_login_settings()
    {
        $data['value'] = html_escape($this->input->post('fb_social_login'));
        $this->db->where('key', 'fb_social_login');
        $this->db->update('settings', $data);

        $data['value'] = html_escape($this->input->post('fb_app_id'));
        $this->db->where('key', 'fb_app_id');
        $this->db->update('settings', $data);

        $data['value'] = html_escape($this->input->post('fb_app_secret'));
        $this->db->where('key', 'fb_app_secret');
        $this->db->update('settings', $data);
    }

    function get_payment_gateways($identifier = "")
    {
        if ($identifier) {
            $this->db->where('identifier', $identifier);
        }
        return $this->db->get('payment_gateways');
    }

    public function update_payment_settings()
    {
        $keys = array();
        $data['title'] = ucfirst($this->input->post('identifier'));
        $data['identifier'] = $this->input->post('identifier');
        $data['currency'] = $this->input->post('currency');
        $data['enabled_test_mode'] = $this->input->post('enabled_test_mode');
        $data['status'] = $this->input->post('status');

        foreach ($_POST as $key => $post_value) :
            if (!array_key_exists($key, $data)) {
                $keys[$key] = $post_value;
            }
        endforeach;
        $data['keys'] = json_encode($keys);

        if ($this->get_payment_gateways($data['identifier'])->num_rows() > 0) {
            $data['updated_at'] = time();
            $this->db->where('identifier', $data['identifier']);
            $this->db->update('payment_gateways', $data);
        } else {
            $data['created_at'] = time();
            $this->db->insert('payment_gateways', $data);
        }
        $this->session->set_flashdata('flash_message', get_phrase('payment_settings_updated_successfully'));
    }

    public function update_stripe_settings()
    {
        // update stripe keys
        $stripe_info = array();

        $stripe['active'] = $this->input->post('stripe_active');
        $stripe['testmode'] = $this->input->post('testmode');
        $stripe['public_key'] = $this->input->post('public_key');
        $stripe['secret_key'] = $this->input->post('secret_key');
        $stripe['public_live_key'] = $this->input->post('public_live_key');
        $stripe['secret_live_key'] = $this->input->post('secret_live_key');

        array_push($stripe_info, $stripe);

        $data['value']    =   json_encode($stripe_info);
        $this->db->where('key', 'stripe_keys');
        $this->db->update('settings', $data);

        $data['value'] = html_escape($this->input->post('stripe_currency'));
        $this->db->where('key', 'stripe_currency');
        $this->db->update('settings', $data);
    }

    public function update_razorpay_settings()
    {
        // update razorpay keys
        $paytm_info = array();
        $razorpay['active'] = htmlspecialchars_($this->input->post('razorpay_active'));
        $razorpay['key'] = htmlspecialchars_($this->input->post('key'));
        $razorpay['secret_key'] = htmlspecialchars_($this->input->post('secret_key'));
        $razorpay['theme_color'] = htmlspecialchars_($this->input->post('theme_color'));

        array_push($paytm_info, $razorpay);

        $data['value']    =   json_encode($paytm_info);
        $this->db->where('key', 'razorpay_keys');
        $this->db->update('settings', $data);

        $data['value'] = htmlspecialchars_($this->input->post('razorpay_currency'));
        $this->db->where('key', 'razorpay_currency');
        $this->db->update('settings', $data);
    }

    public function update_system_currency()
    {
        $data['value'] = html_escape($this->input->post('system_currency'));
        $this->db->where('key', 'system_currency');
        $this->db->update('settings', $data);

        $data['value'] = html_escape($this->input->post('currency_position'));
        $this->db->where('key', 'currency_position');
        $this->db->update('settings', $data);
    }

    public function update_instructor_settings()
    {
        if (isset($_POST['allow_instructor'])) {
            $data['value'] = html_escape($this->input->post('allow_instructor'));
            $this->db->where('key', 'allow_instructor');
            $this->db->update('settings', $data);
        }

        if (isset($_POST['instructor_revenue'])) {
            $data['value'] = html_escape($this->input->post('instructor_revenue'));
            $this->db->where('key', 'instructor_revenue');
            $this->db->update('settings', $data);
        }

        if (isset($_POST['instructor_application_note'])) {
            $data['value'] = html_escape($this->input->post('instructor_application_note'));
            $this->db->where('key', 'instructor_application_note');
            $this->db->update('settings', $data);
        }
    }

    public function get_lessons($type = "", $id = "")
    {
        $this->db->order_by("order", "asc");
        if ($type == "course") {
            return $this->db->get_where('lesson', array('course_id' => $id));
        } elseif ($type == "section") {
            return $this->db->get_where('lesson', array('section_id' => $id));
        } elseif ($type == "lesson") {
            return $this->db->get_where('lesson', array('id' => $id));
        } else {
            return $this->db->get('lesson');
        }
    }

    public function add_course($param1 = "")
    {
        $faqs = array();
        if (!empty($this->input->post('faqs'))) :
            foreach (array_filter($this->input->post('faqs')) as $faq_key => $faq_title) {
                $faqs[$faq_title] = $this->input->post('faq_descriptions')[$faq_key];
            }
        endif;

          // Upcoming Course Image
         if (!file_exists('uploads/thumbnails/upcoming_thumbnails')) {
            mkdir('uploads/thumbnails/upcoming_thumbnails', 0777, true);
        }
        
        if ($_FILES['upcoming_image_thumbnail']['name'] != "") {
            $data['upcoming_image_thumbnail'] = md5(rand(10000000, 20000000)) . '.jpg';
            move_uploaded_file($_FILES['upcoming_image_thumbnail']['tmp_name'], 'uploads/thumbnails/upcoming_thumbnails/' . $data['upcoming_image_thumbnail']);
        }
      

       
      

        $outcomes = $this->trim_and_return_json($this->input->post('outcomes'));
        $requirements = $this->trim_and_return_json($this->input->post('requirements'));

        $data['course_type'] = html_escape($this->input->post('course_type'));
        $data['title'] = html_escape($this->input->post('title'));
        $data['short_description'] = html_escape($this->input->post('short_description'));
        $data['description'] = remove_js($this->input->post('description', false));
        $data['outcomes'] = $outcomes;
        $data['faqs'] = json_encode($faqs);
        $data['language'] = $this->input->post('language_made_in');
        $data['sub_category_id'] = $this->input->post('sub_category_id');
        $category_details = $this->get_category_details_by_id($this->input->post('sub_category_id'))->row_array();
        $data['category_id'] = $category_details['parent'];
        $data['requirements'] = $requirements;
        $data['price'] = $this->input->post('price');
        $data['discount_flag'] = $this->input->post('discount_flag');
        $data['discounted_price'] = $this->input->post('discounted_price');
        $data['level'] = $this->input->post('level');
        $data['is_free_course'] = $this->input->post('is_free_course');
        $data['publish_date'] = $this->input->post('publish_date');

        //Course expiry period
        if ($this->input->post('expiry_period') == 'limited_time' && is_numeric($this->input->post('number_of_month')) && $this->input->post('number_of_month') > 0) {
            $data['expiry_period'] = $this->input->post('number_of_month');
        } else {
            $data['expiry_period'] = null;
        }

        $data['video_url'] = html_escape($this->input->post('course_overview_url'));

        $enable_drip_content = $this->input->post('enable_drip_content');
        if (isset($enable_drip_content) && $enable_drip_content) {
            $data['enable_drip_content'] = 1;
        } else {
            $data['enable_drip_content'] = 0;
        }

        if ($this->input->post('course_overview_url') != "") {
            $data['course_overview_provider'] = html_escape($this->input->post('course_overview_provider'));
        } else {
            $data['course_overview_provider'] = "";
        }

        $data['date_added'] = strtotime(date('D, d-M-Y'));
        $data['section'] = json_encode(array());
        $data['user_id'] = $this->session->userdata('user_id');
        $data['creator'] = $this->session->userdata('user_id');
        $data['meta_description'] = $this->input->post('meta_description');
        $data['meta_keywords'] = $this->input->post('meta_keywords');

        $admin_details = $this->user_model->get_admin_details()->row_array();
        if ($admin_details['id'] == $data['user_id']) {
            $data['is_admin'] = 1;
        } else {
            $data['is_admin'] = 0;
        }


        if ($this->session->userdata('admin_login')) {
            if ($this->input->post('is_top_course') != 1) {
                $data['is_top_course'] = 0;
            } else {
                $data['is_top_course'] = 1;
            }
            $status = $this->input->post('status');
            if ($status == 'active' || $status == 'private' || $status == 'upcoming') {
                $data['status'] = $status;
            } else {
                $data['status'] = 'active';
            }
        } else {
            $data['status'] = 'pending';
        }

        $this->db->insert('course', $data);

        $course_id = $this->db->insert_id();

        // Create folder if does not exist
        if (!file_exists('uploads/thumbnails/course_thumbnails')) {
            mkdir('uploads/thumbnails/course_thumbnails', 0777, true);
        }

        // Upload different number of images according to activated theme. Data is taking from the config.json file
        $course_media_files = themeConfiguration(get_frontend_settings('theme'), 'course_media_files');
        foreach ($course_media_files as $course_media => $size) {
            if ($_FILES[$course_media]['name'] != "") {
                move_uploaded_file($_FILES[$course_media]['tmp_name'], 'uploads/thumbnails/course_thumbnails/' . $course_media . '_' . get_frontend_settings('theme') . '_' . $course_id . '.jpg');
            }
        }

      
        


        if ($data['status'] == 'approved') {
            $this->session->set_flashdata('flash_message', get_phrase('course_added_successfully'));
        } elseif ($data['status'] == 'pending') {
            $this->session->set_flashdata('flash_message', get_phrase('course_added_successfully') . '. ' . get_phrase('please_wait_untill_Admin_approves_it'));
        } elseif ($data['status'] == 'draft') {
            $this->session->set_flashdata('flash_message', get_phrase('your_course_has_been_added_to_draft'));
        }

        $this->session->set_flashdata('flash_message', get_phrase('course_has_been_added_successfully'));
        return $course_id;
    }

    function add_shortcut_course($param1 = "")
    {
        $data['course_type'] = html_escape($this->input->post('course_type'));
        $data['title'] = html_escape($this->input->post('title'));
        $data['outcomes'] = '[]';
        $data['language'] = $this->input->post('language_made_in');
        $data['sub_category_id'] = $this->input->post('sub_category_id');
        $category_details = $this->get_category_details_by_id($this->input->post('sub_category_id'))->row_array();
        $data['category_id'] = $category_details['parent'];

        $data['requirements'] = '[]';
        $data['faqs'] = json_encode(array());
        $data['price'] = $this->input->post('price');
        $data['discount_flag'] = $this->input->post('discount_flag');
        $data['discounted_price'] = $this->input->post('discounted_price');
        $data['level'] = $this->input->post('level');
        $data['is_free_course'] = $this->input->post('is_free_course');


        //Course expiry period
        if ($this->input->post('expiry_period') == 'limited_time' && is_numeric($this->input->post('number_of_month')) && $this->input->post('number_of_month') > 0) {
            $data['expiry_period'] = $this->input->post('number_of_month');
        } else {
            $data['expiry_period'] = null;
        }

        $data['date_added'] = strtotime(date('D, d-M-Y'));
        $data['section'] = json_encode(array());

        $data['user_id'] = $this->session->userdata('user_id');
        $data['creator'] = $data['user_id'];

        $admin_details = $this->user_model->get_admin_details()->row_array();
        if ($admin_details['id'] == $data['user_id']) {
            $data['is_admin'] = 1;
        } else {
            $data['is_admin'] = 0;
        }

        if ($this->input->post('is_private') == 1) {
            $data['status'] = 'private';
        } else {
            if ($param1 == "save_to_draft") {
                $data['status'] = 'draft';
            } else {
                if ($this->session->userdata('admin_login')) {
                    $data['status'] = 'active';
                } else {
                    $data['status'] = 'pending';
                }
            }
        }

        if ($data['is_free_course'] == 1 || $data['is_free_course'] != 1 && $data['price'] > 0 && $data['discount_flag'] != 1 || $data['discount_flag'] == 1 && $data['discounted_price'] > 0) {
            $this->db->insert('course', $data);

            $this->session->set_flashdata('flash_message', get_phrase('course_has_been_added_successfully'));

            $response['status'] = 1;
            return json_encode($response);
        } else {
            $response['status'] = 0;
            $response['message'] = get_phrase('please_fill_up_the_price_field');
            return json_encode($response);
        }
    }

    function trim_and_return_json($untrimmed_array = [])
    {
        if (!is_array($untrimmed_array)) {
            $untrimmed_array = [];
        }
        $trimmed_array = array();
        if (sizeof($untrimmed_array) > 0) {
            foreach ($untrimmed_array as $row) {
                if ($row != "") {
                    array_push($trimmed_array, $row);
                }
            }
        }
        return json_encode($trimmed_array);
    }

    public function update_course($course_id, $type = "")
    {
        $course_details = $this->get_course_by_id($course_id)->row_array();

        $faqs = array();
        if (!empty($this->input->post('faqs'))) :
            foreach (array_filter($this->input->post('faqs')) as $faq_key => $faq_title) {
                $faqs[$faq_title] = $this->input->post('faq_descriptions')[$faq_key];
            }
        endif;

        $outcomes = $this->trim_and_return_json($this->input->post('outcomes'));
        $requirements = $this->trim_and_return_json($this->input->post('requirements'));
        $data['title'] = $this->input->post('title');
        $data['short_description'] = html_escape($this->input->post('short_description'));
        $data['description'] = remove_js($this->input->post('description', false));
        $data['outcomes'] = $outcomes;
        $data['faqs'] = json_encode($faqs);
        $data['language'] = $this->input->post('language_made_in');
        $data['sub_category_id'] = $this->input->post('sub_category_id');
        $category_details = $this->get_category_details_by_id($this->input->post('sub_category_id'))->row_array();
        $data['category_id'] = $category_details['parent'];
        $data['requirements'] = $requirements;
        $data['is_free_course'] = $this->input->post('is_free_course');
        $data['publish_date'] = $this->input->post('publish_date');

        //Course expiry period
        if ($this->input->post('expiry_period') == 'limited_time' && is_numeric($this->input->post('number_of_month')) && $this->input->post('number_of_month') > 0) {
            $data['expiry_period'] = $this->input->post('number_of_month');
        } else {
            $data['expiry_period'] = null;
        }

        $data['price'] = $this->input->post('price');
        $data['discount_flag'] = $this->input->post('discount_flag');
        $data['discounted_price'] = $this->input->post('discounted_price');
        $data['level'] = $this->input->post('level');
        $data['video_url'] = $this->input->post('course_overview_url');

        $enable_drip_content = $this->input->post('enable_drip_content');
        if (isset($enable_drip_content) && $enable_drip_content) {
            $data['enable_drip_content'] = 1;
        } else {
            $data['enable_drip_content'] = 0;
        }

        if ($this->input->post('course_overview_url') != "") {
            $data['course_overview_provider'] = html_escape($this->input->post('course_overview_provider'));
        } else {
            $data['course_overview_provider'] = "";
        }

        $data['meta_description'] = $this->input->post('meta_description');
        $data['meta_keywords'] = $this->input->post('meta_keywords');
        $data['last_modified'] = time();


        if ($this->session->userdata('admin_login')) {
            if ($this->input->post('is_top_course') != 1) {
                $data['is_top_course'] = 0;
            } else {
                $data['is_top_course'] = 1;
            }
            $status = $this->input->post('status');
            if ($status == 'active' || $status == 'private' || $status == 'upcoming') {
                $data['status'] = $status;
            } else {
                $data['status'] = 'active';
            }
        } else {
            $data['status'] = $course_details['status'];
        }


    // Proceed with uploading the new image

    if (!file_exists('uploads/thumbnails/upcoming_thumbnails')) {
        mkdir('uploads/thumbnails/upcoming_thumbnails', 0777, true);
    }
    

    if ($_FILES['upcoming_image_thumbnail']['name'] == "") {
    } else {
        $data['upcoming_image_thumbnail'] = md5(rand(10000000, 20000000)) . '.jpg';
        
        move_uploaded_file($_FILES['upcoming_image_thumbnail']['tmp_name'], 'uploads/thumbnails/upcoming_thumbnails/' . $data['upcoming_image_thumbnail']);
        
        if (!empty($_POST['old_upcoming_image_thumbnail'])) {
            unlink('uploads/thumbnails/upcoming_thumbnails/' . $_POST['old_upcoming_image_thumbnail']);
        }
    }
    


        // MULTI INSTRUCTOR PART STARTS
        if (isset($_POST['new_instructors']) && !empty($_POST['new_instructors'])) {
            $existing_instructors = explode(',', $course_details['user_id']);
            foreach ($_POST['new_instructors'] as $instructor) {
                if (!in_array($instructor, $existing_instructors)) {
                    array_push($existing_instructors, $instructor);
                }
            }
            $data['user_id'] = implode(",", $existing_instructors);
            $data['multi_instructor'] = 1;
        }
        // MULTI INSTRUCTOR PART ENDS


        // Upload different number of images according to activated theme. Data is taking from the config.json file
        $course_media_files = themeConfiguration(get_frontend_settings('theme'), 'course_media_files');
        $previous_last_modified = $course_details['last_modified'];
        foreach ($course_media_files as $course_media => $size) {
            if ($_FILES[$course_media]['name'] != "") {

                move_uploaded_file($_FILES[$course_media]['tmp_name'], 'uploads/thumbnails/course_thumbnails/' . $course_media . '_' . get_frontend_settings('theme') . '_' . $course_id . $data['last_modified'] . '.jpg');

                if (file_exists('uploads/thumbnails/course_thumbnails/' . $course_media . '_' . get_frontend_settings('theme') . '_' . $course_id . $previous_last_modified . '.jpg')) {
                    unlink('uploads/thumbnails/course_thumbnails/' . $course_media . '_' . get_frontend_settings('theme') . '_' . $course_id . $previous_last_modified . '.jpg');
                }

                if (file_exists('uploads/thumbnails/course_thumbnails/optimized/' . $course_media . '_' . get_frontend_settings('theme') . '_' . $course_id . $previous_last_modified . '.jpg')) {
                    unlink('uploads/thumbnails/course_thumbnails/optimized/' . $course_media . '_' . get_frontend_settings('theme') . '_' . $course_id . $previous_last_modified . '.jpg');
                }
            } else {
                if (file_exists('uploads/thumbnails/course_thumbnails/' . $course_media . '_' . get_frontend_settings('theme') . '_' . $course_id . $previous_last_modified . '.jpg')) {
                    rename('uploads/thumbnails/course_thumbnails/' . $course_media . '_' . get_frontend_settings('theme') . '_' . $course_id . $previous_last_modified . '.jpg', 'uploads/thumbnails/course_thumbnails/' . $course_media . '_' . get_frontend_settings('theme') . '_' . $course_id . $data['last_modified'] . '.jpg');
                }
            }
        }

        $this->db->where('id', $course_id);
        $this->db->update('course', $data);



        if ($data['status'] == 'active') {
            $this->session->set_flashdata('flash_message', get_phrase('course_updated_successfully'));
        } elseif ($data['status'] == 'pending') {
            $this->session->set_flashdata('flash_message', get_phrase('course_updated_successfully') . '. ' . get_phrase('please_wait_untill_Admin_approves_it'));
        } elseif ($data['status'] == 'draft') {
            $this->session->set_flashdata('flash_message', get_phrase('your_course_has_been_added_to_draft'));
        }
    }

    public function change_course_status($status = "", $course_id = "")
    {
        if ($status == 'active') {
            if ($this->session->userdata('admin_login') != true) {
                redirect(site_url('login'), 'refresh');
            }
        }
        $updater = array(
            'status' => $status
        );
        $this->db->where('id', $course_id);
        $this->db->update('course', $updater);
    }

    function get_course_thumbnail_url($course_id, $type = 'course_thumbnail')
    {
        // Course media placeholder is coming from the theme config file. Which has all the placehoder for different images. Choose like course type.
        $course_media_placeholders = themeConfiguration(get_frontend_settings('theme'), 'course_media_placeholders');

        $last_modified = $this->get_course_by_id($course_id)->row('last_modified');

        if (file_exists('uploads/thumbnails/course_thumbnails/optimized/' . $type . '_' . get_frontend_settings('theme') . '_' . $course_id . $last_modified . '.jpg')) {
            return base_url() . 'uploads/thumbnails/course_thumbnails/optimized/' . $type . '_' . get_frontend_settings('theme') . '_' . $course_id . $last_modified . '.jpg';
        } elseif (file_exists('uploads/thumbnails/course_thumbnails/' . $type . '_' . get_frontend_settings('theme') . '_' . $course_id . $last_modified . '.jpg')) {

            //resizeImage
            resizeImage('uploads/thumbnails/course_thumbnails/' . $type . '_' . get_frontend_settings('theme') . '_' . $course_id . $last_modified . '.jpg', 'uploads/thumbnails/course_thumbnails/optimized/', 400);

            return base_url() . 'uploads/thumbnails/course_thumbnails/' . $type . '_' . get_frontend_settings('theme') . '_' . $course_id . $last_modified . '.jpg';
        } else {
            return base_url() . $course_media_placeholders[$type . '_placeholder'];
        }
    }
    public function get_lesson_thumbnail_url($lesson_id)
    {

        if (file_exists('uploads/thumbnails/lesson_thumbnails/' . $lesson_id . '.jpg'))
            return base_url() . 'uploads/thumbnails/lesson_thumbnails/' . $lesson_id . '.jpg';
        else
            return base_url() . 'uploads/thumbnails/thumbnail.png';
    }

    public function get_my_courses_by_category_id($category_id)
    {
        $this->db->select('course_id');
        $course_lists_by_enrol = $this->db->get_where('enrol', array('user_id' => $this->session->userdata('user_id')))->result_array();
        $course_ids = array();
        foreach ($course_lists_by_enrol as $row) {
            if (!in_array($row['course_id'], $course_ids)) {
                array_push($course_ids, $row['course_id']);
            }
        }
        $this->db->where_in('id', $course_ids);
        $this->db->where('category_id', $category_id);
        return $this->db->get('course');
    }

    public function get_my_courses_by_search_string($search_string)
    {
        $this->db->select('course_id');
        $course_lists_by_enrol = $this->db->get_where('enrol', array('user_id' => $this->session->userdata('user_id')))->result_array();
        $course_ids = array();
        foreach ($course_lists_by_enrol as $row) {
            if (!in_array($row['course_id'], $course_ids)) {
                array_push($course_ids, $row['course_id']);
            }
        }
        $this->db->where_in('id', $course_ids);
        $this->db->like('title', $search_string);
        return $this->db->get('course');
    }

    public function get_courses_by_search_string($search_string = "", $per_page = "", $uri_segment = "")
    {
        $scorm_status = addon_status('scorm_course');
        $h5p_status = addon_status('h5p');

        $this->db->group_start();
        $this->db->where('course_type', 'general');
        if ($scorm_status) {
            $this->db->or_where('course_type', 'scorm');
        }
        if ($h5p_status) {
            $this->db->or_where('course_type', 'h5p');
        }
        $this->db->group_end();
        $this->db->where('status', 'active');

        $this->db->group_start();
        $this->db->like('title', $search_string);
        $this->db->or_like('short_description', $search_string);
        $this->db->or_like('description', $search_string);
        $this->db->or_like('outcomes', $search_string);
        $this->db->or_like('language', $search_string);
        $this->db->or_like('requirements', $search_string);
        $this->db->or_like('meta_keywords', $search_string);
        $this->db->or_like('meta_description', $search_string);
        $this->db->group_end();

        if ($per_page != "" || $uri_segment != "") {
            return $this->db->get('course', $per_page, $uri_segment);
        } else {
            return $this->db->get('course');
        }
    }


    public function get_course_by_id($course_id = "")
    {
        return $this->db->get_where('course', array('id' => $course_id));
    }

    public function delete_course($course_id = "")
    {
        $course_type = $this->get_course_by_id($course_id)->row('course_type');

        $this->db->where('id', $course_id);
        $this->db->delete('course');

        // DELETE ALL THE enrolment OF THIS COURSE FROM enrol TABLE
        $this->db->where('course_id', $course_id);
        $this->db->delete('enrol');

        if ($course_type == 'general') {
            // DELETE ALL THE LESSONS OF THIS COURSE FROM LESSON TABLE
            $lesson_checker = array('course_id' => $course_id);
            $this->db->delete('lesson', $lesson_checker);

            // DELETE ALL THE section OF THIS COURSE FROM section TABLE
            $this->db->where('course_id', $course_id);
            $this->db->delete('section');
        } elseif ($course_type == 'scorm') {
            $this->load->model('addons/scorm_model');
            $scorm_query = $this->scorm_model->get_scorm_curriculum_by_course_id($course_id);

            $this->db->where('course_id', $course_id);
            $this->db->delete('scorm_curriculum');

            if ($scorm_query->num_rows() > 0) {
                //deleted previews course directory
                $this->scorm_model->deleteDir('uploads/scorm/courses/' . $scorm_query->row('identifier'));
            }
        } elseif ($course_type == 'h5p') {
            $this->load->model('addons/h5p_model');
            $this->h5p_model->deleteDir('uploads/h5p/' . $course_id);
        }
    }

    function get_top_categories($limit = "10", $category_column = "category_id")
    {
        $query = $this->db
            ->select($category_column . ", count(*) AS course_number", false)
            ->from("course")
            ->group_by($category_column)
            ->order_by("course_number", "DESC")
            ->where('status', 'active')
            ->limit($limit)
            ->get();
        return $query->result_array();
    }

    public function get_top_courses()
    {
        $scorm_status = addon_status('scorm_course');
        $h5p_status = addon_status('h5p');

        $this->db->group_start();
        $this->db->where('course_type', 'general');
        if ($scorm_status) {
            $this->db->or_where('course_type', 'scorm');
        }
        if ($h5p_status) {
            $this->db->or_where('course_type', 'h5p');
        }
        $this->db->group_end();

        $this->db->where('is_top_course', 1);
        $this->db->where('status', 'active');
        return $this->db->get('course');
    }

    public function get_default_category_id()
    {
        $categories = $this->get_categories()->result_array();
        foreach ($categories as $category) {
            return $category['id'];
        }
    }

    public function get_courses_by_user_id($param1 = "")
    {

        $courses['draft'] = $this->get_courses_by_instructor_id($param1, 'draft');

        $courses['pending'] = $this->get_courses_by_instructor_id($param1, 'pending');

        $courses['active'] = $this->get_courses_by_instructor_id($param1, 'active');

        return $courses;
    }

    public function get_status_wise_courses_front($status = "")
    {
        $scorm_status = addon_status('scorm_course');
        $h5p_status = addon_status('h5p');

        if ($status != "") {
            $this->db->where('status', $status);
            $this->db->group_start();
            $this->db->where('course_type', 'general');
            if ($scorm_status) {
                $this->db->or_where('course_type', 'scorm');
            }
            if ($h5p_status) {
                $this->db->or_where('course_type', 'h5p');
            }
            $this->db->group_end();
            $courses = $this->db->get('course');
        } else {
            //draft
            $this->db->where('status', 'draft');
            $this->db->group_start();
            $this->db->where('course_type', 'general');
            if ($scorm_status) {
                $this->db->or_where('course_type', 'scorm');
            }
            if ($h5p_status) {
                $this->db->or_where('course_type', 'h5p');
            }
            $this->db->group_end();
            $courses['draft'] = $this->db->get('course');

            //pending
            $this->db->where('status', 'pending');
            $this->db->group_start();
            $this->db->where('course_type', 'general');
            if ($scorm_status) {
                $this->db->or_where('course_type', 'scorm');
            }
            if ($h5p_status) {
                $this->db->or_where('course_type', 'h5p');
            }
            $this->db->group_end();
            $courses['pending'] = $this->db->get('course');

            //private
            $this->db->where('status', 'private');
            $this->db->group_start();
            $this->db->where('course_type', 'general');
            if ($scorm_status) {
                $this->db->or_where('course_type', 'scorm');
            }
            if ($h5p_status) {
                $this->db->or_where('course_type', 'h5p');
            }
            $this->db->group_end();
            $courses['private'] = $this->db->get('course');

            //active
            $this->db->where('status', 'active');
            $this->db->group_start();
            $this->db->where('course_type', 'general');
            if ($scorm_status) {
                $this->db->or_where('course_type', 'scorm');
            }
            if ($h5p_status) {
                $this->db->or_where('course_type', 'h5p');
            }
            $this->db->group_end();
            $courses['active'] = $this->db->get('course');

            //Upcoming
            $this->db->where('status', 'upcoming');
            $this->db->group_start();
            $this->db->where('course_type', 'general');
            if ($scorm_status) {
                $this->db->or_where('course_type', 'scorm');
            }
            if ($h5p_status) {
                $this->db->or_where('course_type', 'h5p');
            }
            $this->db->group_end();
            $courses['upcoming'] = $this->db->get('course');
        }

        return $courses;
    }

    public function get_status_wise_courses($status = "")
    {

        if ($status != "") {
            $this->db->where('status', $status);
            $courses = $this->db->get('course');
        } else {
            //draft
            $this->db->where('status', 'draft');
            $courses['draft'] = $this->db->get('course');

            //pending
            $this->db->where('status', 'pending');
            $courses['pending'] = $this->db->get('course');

            //private
            $this->db->where('status', 'private');
            $courses['private'] = $this->db->get('course');

            //active
            $this->db->where('status', 'active');
            $courses['active'] = $this->db->get('course');

            //upcoming
            $this->db->where('status', 'upcoming');
            $courses['upcoming'] = $this->db->get('course');
        }

        return $courses;
    }

    public function get_status_wise_courses_for_instructor($status = "")
    {
        $user_id = $this->session->userdata('user_id');

        if ($status != "") {
            $courses = $this->get_courses_by_instructor_id($this->session->userdata('user_id'), $status);
        } else {
            $courses['draft'] = $this->get_courses_by_instructor_id($user_id, 'draft');

            $courses['pending'] = $this->get_courses_by_instructor_id($user_id, 'pending');

            $courses['active'] = $this->get_courses_by_instructor_id($user_id, 'active');
        }
        return $courses;
    }

    public function get_default_sub_category_id($default_cateegory_id)
    {
        $sub_categories = $this->get_sub_categories($default_cateegory_id);
        foreach ($sub_categories as $sub_category) {
            return $sub_category['id'];
        }
    }

    public function get_instructor_wise_courses($instructor_id = "", $return_as = "")
    {
        if ($return_as == 'simple_array') {
            return $this->multi_instructor_course_ids_for_an_instructor($instructor_id);
        } else {
            return $this->get_courses_by_instructor_id($instructor_id);
        }
    }

    public function get_instructor_wise_payment_history($instructor_id = "")
    {
        $courses = $this->get_instructor_wise_courses($instructor_id, 'simple_array');
        if (sizeof($courses) > 0) {
            $this->db->where_in('course_id', $courses);
            return $this->db->get('payment')->result_array();
        } else {
            return array();
        }
    }

    public function add_section($course_id)
    {
        $date_range_with_time = $this->input->post('date_range_of_study_plan');
        if ($date_range_with_time != '') {
            $date_range_with_time_arr = explode(' - ', $date_range_with_time);
            $data['start_date'] = strtotime($date_range_with_time_arr[0]);
            $data['end_date'] = strtotime($date_range_with_time_arr[1]);
            $data['restricted_by'] = $this->input->post('restricted_by');
        }

        $data['title'] = html_escape($this->input->post('title'));
        $data['course_id'] = $course_id;
        $this->db->insert('section', $data);
        $section_id = $this->db->insert_id();

        $course_details = $this->get_course_by_id($course_id)->row_array();
        $previous_sections = json_decode($course_details['section']);

        if (sizeof($previous_sections) > 0) {
            array_push($previous_sections, $section_id);
            $updater['section'] = json_encode($previous_sections);
            $this->db->where('id', $course_id);
            $this->db->update('course', $updater);
        } else {
            $previous_sections = array();
            array_push($previous_sections, $section_id);
            $updater['section'] = json_encode($previous_sections);
            $this->db->where('id', $course_id);
            $this->db->update('course', $updater);
        }
    }

    public function edit_section($section_id)
    {
        $date_range_with_time = $this->input->post('date_range_of_study_plan');
        if ($date_range_with_time != '') {
            $date_range_with_time_arr = explode(' - ', $date_range_with_time);
            $data['start_date'] = strtotime($date_range_with_time_arr[0]);
            $data['end_date'] = strtotime($date_range_with_time_arr[1]);
            $data['restricted_by'] = $this->input->post('restricted_by');
        }

        $data['title'] = $this->input->post('title');
        $this->db->where('id', $section_id);
        $this->db->update('section', $data);
    }

    public function delete_section($course_id, $section_id)
    {
        $this->db->where('id', $section_id);
        $this->db->delete('section');

        $this->db->where('section_id', $section_id);
        $this->db->delete('lesson');



        $course_details = $this->get_course_by_id($course_id)->row_array();
        $previous_sections = json_decode($course_details['section']);

        if (sizeof($previous_sections) > 0) {
            $new_section = array();
            for ($i = 0; $i < sizeof($previous_sections); $i++) {
                if ($previous_sections[$i] != $section_id) {
                    array_push($new_section, $previous_sections[$i]);
                }
            }
            $updater['section'] = json_encode($new_section);
            $this->db->where('id', $course_id);
            $this->db->update('course', $updater);
        }
    }

    public function get_section($type_by, $id)
    {
        $this->db->order_by("order", "asc");
        if ($type_by == 'course') {
            return $this->db->get_where('section', array('course_id' => $id));
        } elseif ($type_by == 'section') {
            return $this->db->get_where('section', array('id' => $id));
        }
    }

    public function serialize_section($course_id, $serialization)
    {
        $updater = array(
            'section' => $serialization
        );
        $this->db->where('id', $course_id);
        $this->db->update('course', $updater);
    }

    public function add_lesson()
    {

        $data['course_id'] = html_escape($this->input->post('course_id'));
        $data['title'] = html_escape($this->input->post('title'));
        $data['section_id'] = html_escape($this->input->post('section_id'));

        $lesson_type_array = explode('-', $this->input->post('lesson_type'));

        $lesson_type = $lesson_type_array[0];
        $data['lesson_type'] = $lesson_type;

        $attachment_type = $lesson_type_array[1];
        $data['attachment_type'] = $attachment_type;

        if ($lesson_type == 'video') {
            // This portion is for web application's video lesson
            $lesson_provider = $this->input->post('lesson_provider');
            if ($lesson_provider == 'youtube' || $lesson_provider == 'vimeo') {
                if ($this->input->post('video_url') == "" || $this->input->post('duration') == "") {
                    return json_encode(['error' => get_phrase('invalid_lesson_url_and_duration')]);
                }
                $data['video_url'] = html_escape($this->input->post('video_url'));

                $duration_formatter = explode(':', $this->input->post('duration'));
                $hour = sprintf('%02d', $duration_formatter[0]);
                $min = sprintf('%02d', $duration_formatter[1]);
                $sec = sprintf('%02d', $duration_formatter[2]);
                $data['duration'] = $hour . ':' . $min . ':' . $sec;
                $data['video_type'] = $lesson_provider;
            } elseif ($lesson_provider == 'academy_cloud') {
                if (isset($_FILES['cloud_video_file']['name']) && $_FILES['cloud_video_file']['name'] == "") {
                    return json_encode(['error' => get_phrase('invalid_video_file')]);
                }

                if ($this->input->post('academy_cloud_video_duration') == "") {
                    return json_encode(['error' => get_phrase('invalid_duration')]);
                }


                $video_upload = $this->academy_cloud_model->upload_video();
                if ($video_upload['success'] == false) {
                    return json_encode(['error' => $video_upload['message']]);
                }

                $data['cloud_video_id'] = $video_upload['id'];

                $duration_formatter = explode(':', $this->input->post('academy_cloud_video_duration'));
                $hour = sprintf('%02d', $duration_formatter[0]);
                $min = sprintf('%02d', $duration_formatter[1]);
                $sec = sprintf('%02d', $duration_formatter[2]);
                $data['duration'] = $hour . ':' . $min . ':' . $sec;
                $data['video_type'] = 'academy_cloud';
            } elseif ($lesson_provider == 'html5') {
                if ($this->input->post('html5_video_url') == "" || $this->input->post('html5_duration') == "") {
                    return json_encode(['error' => get_phrase('invalid_lesson_url_and_duration')]);
                }
                $data['video_url'] = html_escape($this->input->post('html5_video_url'));
                $duration_formatter = explode(':', $this->input->post('html5_duration'));
                $hour = sprintf('%02d', $duration_formatter[0]);
                $min = sprintf('%02d', $duration_formatter[1]);
                $sec = sprintf('%02d', $duration_formatter[2]);
                $data['duration'] = $hour . ':' . $min . ':' . $sec;
                $data['video_type'] = 'html5';
            } elseif ($lesson_provider == 'google_drive') {
                if ($this->input->post('google_drive_video_url') == "" || $this->input->post('google_drive_video_duration') == "") {
                    return json_encode(['error' => get_phrase('invalid_lesson_url_and_duration')]);
                }
                $data['video_url'] = html_escape($this->input->post('google_drive_video_url'));
                $duration_formatter = explode(':', $this->input->post('google_drive_video_duration'));
                $hour = sprintf('%02d', $duration_formatter[0]);
                $min = sprintf('%02d', $duration_formatter[1]);
                $sec = sprintf('%02d', $duration_formatter[2]);
                $data['duration'] = $hour . ':' . $min . ':' . $sec;
                $data['video_type'] = 'google_drive';
            } else {
                return json_encode(['error' => get_phrase('invalid_lesson_provider')]);
            }

            // This portion is for mobile application video lessons
            if ($this->input->post('html5_video_url_for_mobile_application') == "" || $this->input->post('html5_duration_for_mobile_application') == "") {
                $mobile_app_lesson_url = "https://www.html5rocks.com/en/tutorials/video/basics/devstories.webm";
                $mobile_app_lesson_duration = "00:01:10";
            } else {
                $mobile_app_lesson_url = $this->input->post('html5_video_url_for_mobile_application');
                $mobile_app_lesson_duration = $this->input->post('html5_duration_for_mobile_application');
            }
            $duration_for_mobile_application_formatter = explode(':', $mobile_app_lesson_duration);
            $hour = sprintf('%02d', $duration_for_mobile_application_formatter[0]);
            $min  = sprintf('%02d', $duration_for_mobile_application_formatter[1]);
            $sec  = sprintf('%02d', $duration_for_mobile_application_formatter[2]);
            $data['duration_for_mobile_application'] = $hour . ':' . $min . ':' . $sec;
            $data['video_type_for_mobile_application'] = 'html5';
            $data['video_url_for_mobile_application'] = $mobile_app_lesson_url;
        } elseif ($lesson_type == "s3") {
            // SET MAXIMUM EXECUTION TIME 600
            ini_set('max_execution_time', '600');

            $fileName           = $_FILES['video_file_for_amazon_s3']['name'];
            $tmp                = explode('.', $fileName);
            $fileExtension      = strtoupper(end($tmp));

            $video_extensions = ['WEBM', 'MP4'];
            if (!in_array($fileExtension, $video_extensions)) {
                return json_encode(['error' => get_phrase('please_select_valid_video_file')]);
            }

            if ($this->input->post('amazon_s3_duration') == "") {
                return json_encode(['error' => get_phrase('invalid_lesson_duration')]);
            }

            $upload_loaction = get_settings('video_upload_location');
            $access_key = get_settings('amazon_s3_access_key');
            $secret_key = get_settings('amazon_s3_secret_key');
            $bucket = get_settings('amazon_s3_bucket_name');
            $region = get_settings('amazon_s3_region_name');

            $s3config = array(
                'region'  => $region,
                'version' => 'latest',
                'credentials' => [
                    'key'    => $access_key, //Put key here
                    'secret' => $secret_key // Put Secret here
                ]
            );


            $tmpfile = $_FILES['video_file_for_amazon_s3'];

            $s3 = new Aws\S3\S3Client($s3config);
            $key = str_replace(".", "-" . rand(1, 9999) . ".", $tmpfile['name']);

            $result = $s3->putObject([
                'Bucket' => $bucket,
                'Key'    => $key,
                'SourceFile' => $tmpfile['tmp_name'],
                'ACL'   => 'public-read'
            ]);

            $data['video_url'] = $result['ObjectURL'];
            $data['video_type'] = 'amazon';
            $data['lesson_type'] = 'video';
            $data['attachment_type'] = 'file';

            $duration_formatter = explode(':', $this->input->post('amazon_s3_duration'));
            $hour = sprintf('%02d', $duration_formatter[0]);
            $min = sprintf('%02d', $duration_formatter[1]);
            $sec = sprintf('%02d', $duration_formatter[2]);
            $data['duration'] = $hour . ':' . $min . ':' . $sec;

            $data['duration_for_mobile_application'] = $hour . ':' . $min . ':' . $sec;
            $data['video_type_for_mobile_application'] = "html5";
            $data['video_url_for_mobile_application'] = $result['ObjectURL'];
        } elseif ($lesson_type == 'wasabi' && $attachment_type == 'video') {
            if (!file_exists("application/aws-module/aws-autoloader.php")) {
                require_once APPPATH . 'libraries/s3-vendor/autoloader.php';
            }
            // AWS credentials and S3 configuration
            $config = [
                'version' => 'latest',
                'region' => get_settings('wasabi_region'),  // Update with the appropriate region
                'credentials' => [
                    'key' => get_settings('wasabi_key'),
                    'secret' => get_settings('wasabi_secret_key')
                ],
                'endpoint' => 'http://s3.wasabisys.com'
            ];

            // Initialize S3 client
            $s3 = new Aws\S3\S3Client($config);
            

            // Bucket and file information
            $bucket = get_settings('wasabi_bucketname');
            $file_path = $_FILES['video_file_for_wasabi_storage']['tmp_name'];
            $course = $this->db->where('id', $this->input->post('course_id'))->get('course')->row_array();
            $name = $_FILES["video_file_for_wasabi_storage"]["name"];
            $name = explode(".", $name);
            $ext = end($name); # extra () to prevent notice

            try {
                // Upload the video file
                $result = $s3->putObject([
                    'Bucket' => $bucket,
                    'Key' => slugify(get_settings('system_name')) . '/' . slugify($course['title']) . '/' . slugify($this->input->post('title')) . '-' . time() . '.' . $ext, // Desired file name on Wasabi
                    'SourceFile' => $file_path,
                    'ContentType' => mime_content_type($file_path)
                ]);

                $data['video_url'] = $result['ObjectURL'];
                $data['video_type'] = 'url';
                $data['lesson_type'] = $lesson_type;
                $data['attachment_type'] = $lesson_type_array[1];

                $duration_formatter = explode(':', $this->input->post('wasabi_duration'));
                $hour = sprintf('%02d', $duration_formatter[0]);
                $min = sprintf('%02d', $duration_formatter[1]);
                $sec = sprintf('%02d', $duration_formatter[2]);
                $data['duration'] = $hour . ':' . $min . ':' . $sec;

                // $previous_file_path_arr = explode("/", $previous_data['video_url']);
                // $previous_file_path_last_index = count($previous_file_path_arr)-1;
                // $previous_file_path = $previous_file_path_arr[$previous_file_path_last_index-2].'/'.$previous_file_path_arr[$previous_file_path_last_index-1].'/'.$previous_file_path_arr[$previous_file_path_last_index];
                // $this->wasabi_storage_file_delete($previous_file_path);
            } catch (Exception $e) {
                // Handle errors
                return json_encode(['error' => 'Error uploading the video: ' . $e->getMessage()]);
            }
        } elseif ($lesson_type == 'wasabi') {
            require_once APPPATH . 'libraries/s3-vendor/autoloader.php';
            // AWS credentials and S3 configuration
            $config = [
                'version' => 'latest',
                'region' => get_settings('wasabi_region'),  // Update with the appropriate region
                'credentials' => [
                    'key' => get_settings('wasabi_key'),
                    'secret' => get_settings('wasabi_secret_key')
                ],
                'endpoint' => 'http://s3.wasabisys.com'
            ];

            // Initialize S3 client
            $s3 = new S3Client($config);

            // Bucket and file information
            $bucket = get_settings('wasabi_bucketname');
            $file_path = $_FILES['wasabi-file']['tmp_name'];
            $course = $this->db->where('id', $this->input->post('course_id'))->get('course')->row_array();

            try {
                // Upload the video file
                $result = $s3->putObject([
                    'Bucket' => $bucket,
                    'Key' => slugify($course['title']) . '/' . $lesson_type . '-' . time() . '.' . $file_ext, // Desired file name on Wasabi
                    'SourceFile' => $file_path,
                    'ContentType' => mime_content_type($file_path)
                ]);

                $data['video_url'] = $result['ObjectURL'];
                $data['video_type'] = 'wasabi_s3';
                $data['lesson_type'] = $lesson_type;
                $data['attachment_type'] = $lesson_type_array[1];
                // Print the URL of the uploaded video
                // echo 'Video uploaded successfully. URL: ' . $result['ObjectURL'];
            } catch (Exception $e) {
                // Handle errors
                echo 'Error uploading the video: ' . $e->getMessage();
            }
        } elseif ($lesson_type == "system") {
            // SET MAXIMUM EXECUTION TIME 600
            ini_set('max_execution_time', '600');

            if ($attachment_type == 'audio') {
                $fileName           = $_FILES['system_audio_file']['name'] ?? '';

                // CHECKING IF THE FILE IS AVAILABLE AND FILE SIZE IS VALID
                if (array_key_exists('system_audio_file', $_FILES)) {
                    if ($_FILES['system_audio_file']['error'] !== UPLOAD_ERR_OK) {
                        $error_code = $_FILES['system_audio_file']['error'];
                        return json_encode(['error' => phpFileUploadErrors($error_code)]);
                    }
                } else {
                    return json_encode(['error' => get_phrase('please_select_valid_audio_file')]);
                };

                $tmp                = explode('.', $fileName);
                $fileExtension      = strtoupper(end($tmp));

                $audio_extensions = ['MP3', 'WAV', 'OGG'];

                if (!in_array($fileExtension, $audio_extensions)) {
                    return json_encode(['error' => get_phrase('please_select_valid_audio_file')]);
                }

                // custom random name of the audio file
                $uploadable_audio_file    =  md5(uniqid(rand(), true)) . '.' . strtolower($fileExtension);

                if ($this->input->post('system_audio_file_duration') == "") {
                    return json_encode(['error' => get_phrase('invalid_lesson_duration')]);
                }


                $tmp_audio_file = $_FILES['system_audio_file']['tmp_name'];

                if (!file_exists('uploads/lesson_files/audios')) {
                    mkdir('uploads/lesson_files/audios', 0777, true);
                }
                $audio_file_path = 'uploads/lesson_files/audios/' . $uploadable_audio_file;
                move_uploaded_file($tmp_audio_file, $audio_file_path);
                $data['audio_url'] = site_url($audio_file_path);
                $data['lesson_type'] = 'audio';
                $data['attachment_type'] = 'file';

                $duration_formatter = explode(':', $this->input->post('system_audio_file_duration'));
                $hour = sprintf('%02d', $duration_formatter[0]);
                $min = sprintf('%02d', $duration_formatter[1]);
                $sec = sprintf('%02d', $duration_formatter[2]);
                $data['duration'] = $hour . ':' . $min . ':' . $sec;
            } else {
                $fileName           = $_FILES['system_video_file']['name'];

                // CHECKING IF THE FILE IS AVAILABLE AND FILE SIZE IS VALID
                if (array_key_exists('system_video_file', $_FILES)) {
                    if ($_FILES['system_video_file']['error'] !== UPLOAD_ERR_OK) {
                        $error_code = $_FILES['system_video_file']['error'];
                        return json_encode(['error' => phpFileUploadErrors($error_code)]);
                    }
                } else {
                    return json_encode(['error' => get_phrase('please_select_valid_video_file')]);
                };

                $tmp                = explode('.', $fileName);
                $fileExtension      = strtoupper(end($tmp));

                $video_extensions = ['WEBM', 'MP4', 'OGG'];

                if (!in_array($fileExtension, $video_extensions)) {
                    return json_encode(['error' => get_phrase('please_select_valid_video_file')]);
                }

                // custom random name of the video file
                $uploadable_video_file    =  md5(uniqid(rand(), true)) . '.' . strtolower($fileExtension);

                if ($this->input->post('system_video_file_duration') == "") {
                    return json_encode(['error' => get_phrase('invalid_lesson_duration')]);
                }


                $tmp_video_file = $_FILES['system_video_file']['tmp_name'];

                if (!file_exists('uploads/lesson_files/videos')) {
                    mkdir('uploads/lesson_files/videos', 0777, true);
                }
                $video_file_path = 'uploads/lesson_files/videos/' . $uploadable_video_file;
                move_uploaded_file($tmp_video_file, $video_file_path);
                $data['video_url'] = site_url($video_file_path);
                $data['video_type'] = 'system';
                $data['lesson_type'] = 'video';
                $data['attachment_type'] = 'file';

                $duration_formatter = explode(':', $this->input->post('system_video_file_duration'));
                $hour = sprintf('%02d', $duration_formatter[0]);
                $min = sprintf('%02d', $duration_formatter[1]);
                $sec = sprintf('%02d', $duration_formatter[2]);
                $data['duration'] = $hour . ':' . $min . ':' . $sec;
            }
        } elseif ($lesson_type == 'text' && $attachment_type == 'description') {
            $data['attachment'] = htmlspecialchars_(remove_js($this->input->post('text_description', false)));
        } else {
            if ($attachment_type == 'iframe') {
                if (empty($this->input->post('iframe_source'))) {
                    return json_encode(['error' => get_phrase('invalid_source')]);
                }
                $data['attachment'] = $this->input->post('iframe_source');
            } else {
                if ($_FILES['attachment']['name'] == "") {
                    return json_encode(['error' => get_phrase('invalid_attachment')]);
                } else {
                    $fileName           = $_FILES['attachment']['name'];
                    $tmp                = explode('.', $fileName);
                    $fileExtension      = end($tmp);
                    $uploadable_file    =  md5(uniqid(rand(), true)) . '.' . $fileExtension;
                    $data['attachment'] = $uploadable_file;

                    if (!file_exists('uploads/lesson_files')) {
                        mkdir('uploads/lesson_files', 0777, true);
                    }
                    move_uploaded_file($_FILES['attachment']['tmp_name'], 'uploads/lesson_files/' . $uploadable_file);
                }
            }
        }

        $data['date_added'] = strtotime(date('D, d-M-Y'));
        $data['summary'] = htmlspecialchars_(remove_js($this->input->post('summary', false)));
        $data['is_free'] = htmlspecialchars_($this->input->post('free_lesson') ?? "");


        //video caption
        if (isset($_FILES['caption']) && !empty($_FILES['caption']['name'])) {
            $data['caption'] = random(15) . '.vtt';
            move_uploaded_file($_FILES['caption']['tmp_name'], 'uploads/captions/' . $data['caption']);
        }


        $this->db->insert('lesson', $data);
        $inserted_id = $this->db->insert_id();

        if (isset($_FILES['thumbnail']['name']) && $_FILES['thumbnail']['name'] != "") {
            if (!file_exists('uploads/thumbnails/lesson_thumbnails')) {
                mkdir('uploads/thumbnails/lesson_thumbnails', 0777, true);
            }
            move_uploaded_file($_FILES['thumbnail']['tmp_name'], 'uploads/thumbnails/lesson_thumbnails/' . $inserted_id . '.jpg');
        }

        $this->session->set_flashdata('flash_message', get_phrase('lesson_has_been_added_successfully'));
        return json_encode(['reload' => true]);
    }

    public function edit_lesson($lesson_id)
    {

        $previous_data = $this->db->get_where('lesson', array('id' => $lesson_id))->row_array();

        $data['course_id'] = html_escape($this->input->post('course_id'));
        $data['title'] = html_escape($this->input->post('title'));
        $data['section_id'] = html_escape($this->input->post('section_id'));

        $lesson_type_array = explode('-', $this->input->post('lesson_type'));

        $lesson_type = $lesson_type_array[0];
        $data['lesson_type'] = $lesson_type;

        $attachment_type = $lesson_type_array[1];
        $data['attachment_type'] = $attachment_type;

        if ($lesson_type == 'video') {
            $lesson_provider = $this->input->post('lesson_provider');
            if ($lesson_provider == 'youtube' || $lesson_provider == 'vimeo') {
                if ($this->input->post('video_url') == "" || $this->input->post('duration') == "") {
                    return json_encode(['error' => get_phrase('invalid_lesson_url_and_duration')]);
                }
                $data['video_url'] = html_escape($this->input->post('video_url'));

                $duration_formatter = explode(':', $this->input->post('duration'));
                $hour = sprintf('%02d', $duration_formatter[0]);
                $min = sprintf('%02d', $duration_formatter[1]);
                $sec = sprintf('%02d', $duration_formatter[2]);
                $data['duration'] = $hour . ':' . $min . ':' . $sec;

                $video_details = $this->video_model->getVideoDetails($data['video_url']);
                $data['video_type'] = $video_details['provider'];
            } elseif ($lesson_provider == 'academy_cloud') {
                if (isset($_FILES['cloud_video_file']['name']) && $_FILES['cloud_video_file']['name'] == "") {
                    return json_encode(['error' => get_phrase('invalid_video_file')]);
                }

                if ($this->input->post('academy_cloud_video_duration') == "") {
                    return json_encode(['error' => get_phrase('invalid_duration')]);
                }


                $video_upload = $this->academy_cloud_model->update_video($previous_data['cloud_video_id']);
                if ($video_upload['success'] == false) {
                    return json_encode(['error' => $video_upload['message']]);
                }

                $data['cloud_video_id'] = $video_upload['id'];

                $duration_formatter = explode(':', $this->input->post('academy_cloud_video_duration'));
                $hour = sprintf('%02d', $duration_formatter[0]);
                $min = sprintf('%02d', $duration_formatter[1]);
                $sec = sprintf('%02d', $duration_formatter[2]);
                $data['duration'] = $hour . ':' . $min . ':' . $sec;
                $data['video_type'] = 'academy_cloud';
            } elseif ($lesson_provider == 'html5') {
                if ($this->input->post('html5_video_url') == "" || $this->input->post('html5_duration') == "") {
                    return json_encode(['error' => get_phrase('invalid_lesson_url_and_duration')]);
                }
                $data['video_url'] = html_escape($this->input->post('html5_video_url'));

                $duration_formatter = explode(':', $this->input->post('html5_duration'));
                $hour = sprintf('%02d', $duration_formatter[0]);
                $min = sprintf('%02d', $duration_formatter[1]);
                $sec = sprintf('%02d', $duration_formatter[2]);
                $data['duration'] = $hour . ':' . $min . ':' . $sec;
                $data['video_type'] = 'html5';
            } elseif ($lesson_provider == 'google_drive') {
                if ($this->input->post('google_drive_video_url') == "" || $this->input->post('google_drive_video_duration') == "") {
                    return json_encode(['error' => get_phrase('invalid_lesson_url_and_duration')]);
                }
                $data['video_url'] = html_escape($this->input->post('google_drive_video_url'));
                $duration_formatter = explode(':', $this->input->post('google_drive_video_duration'));
                $hour = sprintf('%02d', $duration_formatter[0]);
                $min = sprintf('%02d', $duration_formatter[1]);
                $sec = sprintf('%02d', $duration_formatter[2]);
                $data['duration'] = $hour . ':' . $min . ':' . $sec;
                $data['video_type'] = 'google_drive';
            } else {
                return json_encode(['error' => get_phrase('invalid_lesson_provider')]);
            }
            $data['attachment'] = "";

            // This portion is for mobile application video lessons
            if ($this->input->post('html5_video_url_for_mobile_application') == "" || $this->input->post('html5_duration_for_mobile_application') == "") {
                $mobile_app_lesson_url = "https://www.html5rocks.com/en/tutorials/video/basics/devstories.webm";
                $mobile_app_lesson_duration = "00:01:10";
            } else {
                $mobile_app_lesson_url = $this->input->post('html5_video_url_for_mobile_application');
                $mobile_app_lesson_duration = $this->input->post('html5_duration_for_mobile_application');
            }
            $duration_for_mobile_application_formatter = explode(':', $mobile_app_lesson_duration);
            $hour = sprintf('%02d', $duration_for_mobile_application_formatter[0]);
            $min  = sprintf('%02d', $duration_for_mobile_application_formatter[1]);
            $sec  = sprintf('%02d', $duration_for_mobile_application_formatter[2]);
            $data['duration_for_mobile_application'] = $hour . ':' . $min . ':' . $sec;
            $data['video_type_for_mobile_application'] = 'html5';
            $data['video_url_for_mobile_application'] = $mobile_app_lesson_url;
        } elseif ($lesson_type == "s3") {
            // SET MAXIMUM EXECUTION TIME 600
            ini_set('max_execution_time', '600');

            if (isset($_FILES['video_file_for_amazon_s3']) && !empty($_FILES['video_file_for_amazon_s3']['name'])) {
                $fileName           = $_FILES['video_file_for_amazon_s3']['name'];
                $tmp                = explode('.', $fileName);
                $fileExtension      = strtoupper(end($tmp));

                $video_extensions = ['WEBM', 'MP4'];
                if (!in_array($fileExtension, $video_extensions)) {
                    return json_encode(['error' => get_phrase('please_select_valid_video_file')]);
                }

                $upload_loaction = get_settings('video_upload_location');
                $access_key = get_settings('amazon_s3_access_key');
                $secret_key = get_settings('amazon_s3_secret_key');
                $bucket = get_settings('amazon_s3_bucket_name');
                $region = get_settings('amazon_s3_region_name');

                $s3config = array(
                    'region'  => $region,
                    'version' => 'latest',
                    'credentials' => [
                        'key'    => $access_key, //Put key here
                        'secret' => $secret_key // Put Secret here
                    ]
                );


                $tmpfile = $_FILES['video_file_for_amazon_s3'];

                $s3 = new Aws\S3\S3Client($s3config);
                $key = str_replace(".", "-" . rand(1, 9999) . ".", preg_replace('/\s+/', '', $tmpfile['name']));

                $result = $s3->putObject([
                    'Bucket' => $bucket,
                    'Key'    => $key,
                    'SourceFile' => $tmpfile['tmp_name'],
                    'ACL'   => 'public-read'
                ]);

                $data['video_url'] = $result['ObjectURL'];
                $data['video_url_for_mobile_application'] = $result['ObjectURL'];
            }

            $data['video_type'] = 'amazon';
            $data['lesson_type'] = 'video';
            $data['attachment_type'] = 'file';


            if ($this->input->post('amazon_s3_duration') == "") {
                return json_encode(['error' => get_phrase('invalid_lesson_duration')]);
            }

            $duration_formatter = explode(':', $this->input->post('amazon_s3_duration'));
            $hour = sprintf('%02d', $duration_formatter[0]);
            $min = sprintf('%02d', $duration_formatter[1]);
            $sec = sprintf('%02d', $duration_formatter[2]);
            $data['duration'] = $hour . ':' . $min . ':' . $sec;
        } elseif ($lesson_type == 'wasabi' && $attachment_type == 'video') {
            if (isset($_FILES['video_file_for_wasabi_storage']) && !empty($_FILES['video_file_for_wasabi_storage']['name'])) {
                if (!file_exists("application/aws-module/aws-autoloader.php")) {
                    require_once APPPATH . 'libraries/s3-vendor/autoloader.php';
                }
                // AWS credentials and S3 configuration
                $config = [
                    'version' => 'latest',
                    'region' => get_settings('wasabi_region'),  // Update with the appropriate region
                    'credentials' => [
                        'key' => get_settings('wasabi_key'),
                        'secret' => get_settings('wasabi_secret_key')
                    ],
                    'endpoint' => 'http://s3.wasabisys.com'
                ];
    
                // Initialize S3 client
                $s3 = new Aws\S3\S3Client($config);

                // Bucket and file information
                $bucket = get_settings('wasabi_bucketname');
                $file_path = $_FILES['video_file_for_wasabi_storage']['tmp_name'];
                $course = $this->db->where('id', $this->input->post('course_id'))->get('course')->row_array();
                $name = $_FILES["video_file_for_wasabi_storage"]["name"];
                $name = explode(".", $name);
                $ext = end($name); # extra () to prevent notice

                try {
                    // Upload the video file
                    $result = $s3->putObject([
                        'Bucket' => $bucket,
                        'Key' => slugify(get_settings('system_name')) . '/' . slugify($course['title']) . '/' . slugify($this->input->post('title')) . '-' . time() . '.' . $ext, // Desired file name on Wasabi
                        'SourceFile' => $file_path,
                        'ContentType' => mime_content_type($file_path)
                    ]);

                    $data['video_url'] = $result['ObjectURL'];
                    $data['video_type'] = 'url';
                    $data['lesson_type'] = $lesson_type;
                    $data['attachment_type'] = $lesson_type_array[1];

                    $previous_file_path_arr = explode("/", $previous_data['video_url']);
                    $previous_file_path_last_index = count($previous_file_path_arr) - 1;
                    $previous_file_path = $previous_file_path_arr[$previous_file_path_last_index - 2] . '/' . $previous_file_path_arr[$previous_file_path_last_index - 1] . '/' . $previous_file_path_arr[$previous_file_path_last_index];
                    $this->wasabi_storage_file_delete($previous_file_path);
                } catch (Exception $e) {
                    // Handle errors
                    return json_encode(['error' => 'Error uploading the video: ' . $e->getMessage()]);
                }
            } else {
                $data['video_url'] = $previous_data['video_url'];
                $data['video_type'] = 'url';
                $data['lesson_type'] = $previous_data['lesson_type'];
                $data['attachment_type'] = $previous_data['attachment_type'];
            }

            $duration_formatter = explode(':', $this->input->post('wasabi_duration'));
            $hour = sprintf('%02d', $duration_formatter[0]);
            $min = sprintf('%02d', $duration_formatter[1]);
            $sec = sprintf('%02d', $duration_formatter[2]);
            $data['duration'] = $hour . ':' . $min . ':' . $sec;
        } elseif ($lesson_type == 'wasabi') {
            if (isset($_FILES['wasabi-file']) && !empty($_FILES['wasabi-file']['name'])) {
                require_once APPPATH . 'libraries/s3-vendor/autoloader.php';
                // AWS credentials and S3 configuration
                $config = [
                    'version' => 'latest',
                    'region' => get_settings('wasabi_region'),  // Update with the appropriate region
                    'credentials' => [
                        'key' => get_settings('wasabi_key'),
                        'secret' => get_settings('wasabi_secret_key')
                    ],
                    'endpoint' => 'http://s3.wasabisys.com'
                ];
                // Initialize S3 client
                $s3 = new S3Client($config);
                // Bucket and file information
                $bucket = get_settings('wasabi_bucketname');
                $file_path = $_FILES['wasabi-file']['tmp_name'];
                $custome_name = explode('.', $_FILES['wasabi-file']['name']);
                $file_ext = $custome_name[1];
                $course = $this->db->where('id', $this->input->post('course_id'))->get('course')->row_array();
                try {
                    // Upload the video file
                    $result = $s3->putObject([
                        'Bucket' => $bucket,
                        // 'Key' => $lesson_type.'-'.time().'.'.$file_ext, // Desired file name on Wasabi
                        'Key' => slugify($course['title']) . '/' . $lesson_type . '-' . time() . '.' . $file_ext, // Desired file name on Wasabi
                        'SourceFile' => $file_path,
                        'ContentType' => mime_content_type($file_path)
                    ]);
                    $data['video_url'] = $result['ObjectURL'];
                    $data['video_type'] = 'wasabi_s3';
                    $data['lesson_type'] = $lesson_type;
                    $data['attachment_type'] = $lesson_type_array[1];
                    // echo 'Video uploaded successfully. URL: ' . $result['ObjectURL'];
                    $file_name = explode('wasabi-', $previous_data['video_url']);
                    $file_name = 'wasabi-' . $file_name[2];
                    $this->wasabi_file_delete($file_name, $previous_data['course_id']);
                } catch (Exception $e) {
                    // Handle errors
                    echo 'Error uploading the video: ' . $e->getMessage();
                    die;
                }
            } else {
                $data['video_url'] = $previous_data['video_url'];
                $data['video_type'] = 'wasabi_s3';
                $data['lesson_type'] = $previous_data['lesson_type'];
                $data['attachment_type'] = $previous_data['attachment_type'];
            }
        } elseif ($lesson_type == "system") {
            // SET MAXIMUM EXECUTION TIME 600
            ini_set('max_execution_time', '600');

            if ($attachment_type == 'audio') {
                if (isset($_FILES['system_video_file']) && !empty($_FILES['system_audio_file']['name'])) {

                    $fileName           = $_FILES['system_audio_file']['name'] ?? '';

                    // CHECKING IF THE FILE IS AVAILABLE AND FILE SIZE IS VALID
                    if (array_key_exists('system_audio_file', $_FILES)) {
                        if ($_FILES['system_audio_file']['error'] !== UPLOAD_ERR_OK) {
                            $error_code = $_FILES['system_audio_file']['error'];
                            return json_encode(['error' => phpFileUploadErrors($error_code)]);
                        }
                    } else {
                        return json_encode(['error' => get_phrase('please_select_valid_audio_file')]);
                    };

                    $tmp                = explode('.', $fileName);
                    $fileExtension      = strtoupper(end($tmp));

                    $audio_extensions = ['WEBM', 'MP4'];
                    if (!in_array($fileExtension, $audio_extensions)) {
                        return json_encode(['error' => get_phrase('please_select_valid_audio_file')]);
                    }

                    // custom random name of the audio file
                    $uploadable_audio_file    =  md5(uniqid(rand(), true)) . '.' . strtolower($fileExtension);


                    $tmp_audio_file = $_FILES['system_audio_file']['tmp_name'];

                    if (!file_exists('uploads/lesson_files/audios')) {
                        mkdir('uploads/lesson_files/audios', 0777, true);
                    }
                    $audio_file_path = 'uploads/lesson_files/audios/' . $uploadable_audio_file;
                    move_uploaded_file($tmp_audio_file, $audio_file_path);

                    $data['audio_url'] = site_url($audio_file_path);
                    $data['audio_url_for_mobile_application'] = site_url($audio_file_path);

                    //delete previews audio
                    $previews_audio_url = $this->db->get_where('lesson', array('id' => $lesson_id))->row('audio_url');
                    $audio_file = explode('/', $previews_audio_url);
                    unlink('uploads/lesson_files/audios/' . end($audio_file));
                    //end delete previews audio
                }

                $data['lesson_type'] = 'audio';
                $data['attachment_type'] = 'file';
                if ($this->input->post('system_audio_file_duration') == "") {
                    return json_encode(['error' => get_phrase('invalid_lesson_duration')]);
                }
                $duration_formatter = explode(':', $this->input->post('system_audio_file_duration'));
            } else {

                if (isset($_FILES['system_video_file']) && !empty($_FILES['system_video_file']['name'])) {

                    $fileName           = $_FILES['system_video_file']['name'] ?? '';

                    // CHECKING IF THE FILE IS AVAILABLE AND FILE SIZE IS VALID
                    if (array_key_exists('system_video_file', $_FILES)) {
                        if ($_FILES['system_video_file']['error'] !== UPLOAD_ERR_OK) {
                            $error_code = $_FILES['system_video_file']['error'];
                            return json_encode(['error' => phpFileUploadErrors($error_code)]);
                        }
                    } else {
                        return json_encode(['error' => get_phrase('please_select_valid_video_file')]);
                    };

                    $tmp                = explode('.', $fileName);
                    $fileExtension      = strtoupper(end($tmp));

                    $video_extensions = ['WEBM', 'MP4'];
                    if (!in_array($fileExtension, $video_extensions)) {
                        return json_encode(['error' => get_phrase('please_select_valid_video_file')]);
                    }

                    // custom random name of the video file
                    $uploadable_video_file    =  md5(uniqid(rand(), true)) . '.' . strtolower($fileExtension);


                    $tmp_video_file = $_FILES['system_video_file']['tmp_name'];

                    if (!file_exists('uploads/lesson_files/videos')) {
                        mkdir('uploads/lesson_files/videos', 0777, true);
                    }
                    $video_file_path = 'uploads/lesson_files/videos/' . $uploadable_video_file;
                    move_uploaded_file($tmp_video_file, $video_file_path);

                    $data['video_url'] = site_url($video_file_path);
                    $data['video_url_for_mobile_application'] = site_url($video_file_path);

                    //delete previews video
                    $previews_video_url = $this->db->get_where('lesson', array('id' => $lesson_id))->row('video_url');
                    $video_file = explode('/', $previews_video_url);
                    unlink('uploads/lesson_files/videos/' . end($video_file));
                    //end delete previews video
                }

                $data['video_type'] = 'system';
                $data['lesson_type'] = 'video';
                $data['attachment_type'] = 'file';
                if ($this->input->post('system_video_file_duration') == "") {
                    return json_encode(['error' => get_phrase('invalid_lesson_duration')]);
                }
                $duration_formatter = explode(':', $this->input->post('system_video_file_duration'));
            }


            $hour = sprintf('%02d', $duration_formatter[0]);
            $min = sprintf('%02d', $duration_formatter[1]);
            $sec = sprintf('%02d', $duration_formatter[2]);
            $data['duration'] = $hour . ':' . $min . ':' . $sec;
        } elseif ($lesson_type == 'text' && $attachment_type == 'description') {
            $data['attachment'] = htmlspecialchars_(remove_js($this->input->post('text_description', false)));
        } else {
            if ($attachment_type == 'iframe') {
                if (empty($this->input->post('iframe_source'))) {
                    return json_encode(['error' => get_phrase('invalid_source')]);
                }
                $data['attachment'] = $this->input->post('iframe_source');
            } else {
                if (isset($_FILES['attachment']['name']) && $_FILES['attachment']['name'] != "") {
                    // unlinking previous attachments
                    if ($previous_data['attachment'] != "") {
                        unlink('uploads/lesson_files/' . $previous_data['attachment']);
                    }

                    $fileName           = $_FILES['attachment']['name'];
                    $tmp                = explode('.', $fileName);
                    $fileExtension      = end($tmp);
                    $uploadable_file    =  md5(uniqid(rand(), true)) . '.' . $fileExtension;
                    $data['attachment'] = $uploadable_file;
                    $data['video_type'] = "";
                    $data['duration'] = "";
                    $data['video_url'] = "";
                    $data['duration_for_mobile_application'] = "";
                    $data['video_type_for_mobile_application'] = '';
                    $data['video_url_for_mobile_application'] = "";
                    if (!file_exists('uploads/lesson_files')) {
                        mkdir('uploads/lesson_files', 0777, true);
                    }
                    move_uploaded_file($_FILES['attachment']['tmp_name'], 'uploads/lesson_files/' . $uploadable_file);
                }
            }
        }

        $data['last_modified'] = strtotime(date('D, d-M-Y'));
        $data['summary'] = htmlspecialchars_(remove_js($this->input->post('summary', false)));
        $data['is_free'] = htmlspecialchars_($this->input->post('free_lesson'));


        //video caption
        if (isset($_FILES['caption']) && !empty($_FILES['caption']['name'])) {
            $data['caption'] = random(15) . '.vtt';
            move_uploaded_file($_FILES['caption']['tmp_name'], 'uploads/captions/' . $data['caption']);
        }


        $this->db->where('id', $lesson_id);
        $this->db->update('lesson', $data);


        if (isset($_FILES['thumbnail']['name']) && $_FILES['thumbnail']['name'] != "") {
            if (!file_exists('uploads/thumbnails/lesson_thumbnails')) {
                mkdir('uploads/thumbnails/lesson_thumbnails', 0777, true);
            }
            move_uploaded_file($_FILES['thumbnail']['tmp_name'], 'uploads/thumbnails/lesson_thumbnails/' . $lesson_id . '.jpg');
        }

        $this->session->set_flashdata('flash_message', get_phrase('lesson_has_been_updated_successfully'));
        return json_encode(['reload' => true]);
    }

    public function delete_lesson($lesson_id)
    {
        $user_id = $this->session->userdata('user_id');
        $previous_data = $this->db->get_where('lesson', array('id' => $lesson_id))->row_array();

        if ($previous_data['video_type'] == 'academy_cloud') {
            $this->academy_cloud_model->delete_cloud_video($previous_data['cloud_video_id']);
        }

        if ($previous_data['lesson_type'] == 'video' && $previous_data['attachment_type'] == 'file' && $previous_data['video_type'] == 'system') {
            unlink(str_replace(base_url(), '', $previous_data['video_url']));
        }

        if ($previous_data['lesson_type'] == 'wasabi') {
            $file_name = explode('wasabi-', $previous_data['video_url']);
            $file_name = 'wasabi-' . $file_name[2];
            $this->wasabi_file_delete($file_name, $previous_data['course_id']);
        }

        //update watch histories data
        $watch_history = $this->db->get_where('watch_histories', array('student_id' => $user_id, 'course_id' => $previous_data['course_id']));
        if ($watch_history->num_rows() > 0) {
            $data = array();
            if ($watch_history->row('watching_lesson_id') == $lesson_id) {
                $data['watching_lesson_id'] = null;
            }

            $completed_lesson_arr = json_decode($watch_history->row('completed_lesson'), true);

            if (is_array($completed_lesson_arr) && count($completed_lesson_arr) > 0 && ($key = array_search($lesson_id, $completed_lesson_arr)) !== false) {
                unset($completed_lesson_arr[$key]);
                $data['completed_lesson'] = json_encode($completed_lesson_arr);
            }

            if (count($data) > 0) {
                $this->db->where('student_id', $user_id);
                $this->db->where('course_id', $previous_data['course_id']);
                $this->db->update('watch_histories', $data);
            }
        }

        $this->db->where('id', $lesson_id);
        $this->db->delete('lesson');
    }

    public function update_frontend_settings()
    {
        $data['value'] = html_escape($this->input->post('banner_title'));
        $this->db->where('key', 'banner_title');
        $this->db->update('frontend_settings', $data);

        $data['value'] = html_escape($this->input->post('banner_sub_title'));
        $this->db->where('key', 'banner_sub_title');
        $this->db->update('frontend_settings', $data);

        $data['value'] = html_escape($this->input->post('cookie_status'));
        $this->db->where('key', 'cookie_status');
        $this->db->update('frontend_settings', $data);

        $data['value'] = $this->input->post('cookie_note', false);
        $this->db->where('key', 'cookie_note');
        $this->db->update('frontend_settings', $data);

        $data['value'] = $this->input->post('cookie_policy', false);
        $this->db->where('key', 'cookie_policy');
        $this->db->update('frontend_settings', $data);



        $data['value'] = $this->input->post('facebook');
        $this->db->where('key', 'facebook');
        $this->db->update('frontend_settings', $data);

        $data['value'] = $this->input->post('twitter');
        $this->db->where('key', 'twitter');
        $this->db->update('frontend_settings', $data);

        $data['value'] = $this->input->post('linkedin');
        $this->db->where('key', 'linkedin');
        $this->db->update('frontend_settings', $data);


        $data['value'] = $this->input->post('about_us', false);
        $this->db->where('key', 'about_us');
        $this->db->update('frontend_settings', $data);

        $data['value'] = $this->input->post('terms_and_condition', false);
        $this->db->where('key', 'terms_and_condition');
        $this->db->update('frontend_settings', $data);

        $data['value'] = $this->input->post('privacy_policy', false);
        $this->db->where('key', 'privacy_policy');
        $this->db->update('frontend_settings', $data);

        $data['value'] = $this->input->post('refund_policy', false);
        $this->db->where('key', 'refund_policy');
        $this->db->update('frontend_settings', $data);
    }

    public function update_recaptcha_settings()
    {
        $data['value'] = html_escape($this->input->post('recaptcha_status'));
        $this->db->where('key', 'recaptcha_status');
        $this->db->update('frontend_settings', $data);

        $data['value'] = html_escape($this->input->post('recaptcha_sitekey'));
        $this->db->where('key', 'recaptcha_sitekey');
        $this->db->update('frontend_settings', $data);

        $data['value'] = html_escape($this->input->post('recaptcha_secretkey'));
        $this->db->where('key', 'recaptcha_secretkey');
        $this->db->update('frontend_settings', $data);
    }

    public function update_frontend_banner()
    {
        if (isset($_FILES['banner_image']) && $_FILES['banner_image']['name'] != "") {

            if (file_exists('uploads/system/' . get_current_banner('banner_image'))) {
                unlink('uploads/system/' . get_current_banner('banner_image'));
            }

            $banner_images = json_decode(get_frontend_settings('banner_image'), true);
            $image_name = md5(rand(1000, 100000)) . '.png';
            $banner_images[get_frontend_settings('home_page')] = $image_name;
            $data['value'] = json_encode($banner_images);

            $this->db->where('key', 'banner_image');
            $this->db->update('frontend_settings', $data);
            move_uploaded_file($_FILES['banner_image']['tmp_name'], 'uploads/system/' . $image_name);
        }
    }

    public function update_light_logo()
    {
        if (isset($_FILES['light_logo']) && $_FILES['light_logo']['name'] != "") {
            unlink('uploads/system/' . get_frontend_settings('light_logo'));
            $data['value'] = md5(rand(1000, 100000)) . '.png';
            $this->db->where('key', 'light_logo');
            $this->db->update('frontend_settings', $data);
            move_uploaded_file($_FILES['light_logo']['tmp_name'], 'uploads/system/' . $data['value']);
        }
    }

    public function update_dark_logo()
    {
        if (isset($_FILES['dark_logo']) && $_FILES['dark_logo']['name'] != "") {
            unlink('uploads/system/' . get_frontend_settings('dark_logo'));
            $data['value'] = md5(rand(1000, 100000)) . '.png';
            $this->db->where('key', 'dark_logo');
            $this->db->update('frontend_settings', $data);
            move_uploaded_file($_FILES['dark_logo']['tmp_name'], 'uploads/system/' . $data['value']);
        }
    }

    public function update_small_logo()
    {
        if (isset($_FILES['small_logo']) && $_FILES['small_logo']['name'] != "") {
            unlink('uploads/system/' . get_frontend_settings('small_logo'));
            $data['value'] = md5(rand(1000, 100000)) . '.png';
            $this->db->where('key', 'small_logo');
            $this->db->update('frontend_settings', $data);
            move_uploaded_file($_FILES['small_logo']['tmp_name'], 'uploads/system/' . $data['value']);
        }
    }

    public function update_favicon()
    {
        if (isset($_FILES['favicon']) && $_FILES['favicon']['name'] != "") {
            unlink('uploads/system/' . get_frontend_settings('favicon'));
            $data['value'] = md5(rand(1000, 100000)) . '.png';
            $this->db->where('key', 'favicon');
            $this->db->update('frontend_settings', $data);
            move_uploaded_file($_FILES['favicon']['tmp_name'], 'uploads/system/' . $data['value']);
        }
        //move_uploaded_file($_FILES['favicon']['tmp_name'], 'uploads/system/favicon.png');
    }

    public function handleWishList($course_id)
    {
        $wishlists = array();
        $user_details = $this->user_model->get_user($this->session->userdata('user_id'))->row_array();

        if ($user_details['wishlist'] == "") {
            array_push($wishlists, $course_id);
        } else {
            $wishlists = json_decode($user_details['wishlist'], true);
            if (in_array($course_id, $wishlists)) {
                $key = array_search($course_id, $wishlists);
                unset($wishlists[$key]);
                $response = false;
            } else {
                array_push($wishlists, $course_id);
                $response = true;
            }
        }

        $updater['wishlist'] = json_encode($wishlists);
        $this->db->where('id', $this->session->userdata('user_id'));
        $this->db->update('users', $updater);
        return $response;
    }

    public function is_added_to_wishlist($course_id = "")
    {
        if ($this->session->userdata('user_login') == 1) {
            $wishlists = array();
            $user_details = $this->user_model->get_user($this->session->userdata('user_id'))->row_array();
            $wishlists = json_decode($user_details['wishlist']);
            if (is_array($wishlists) && in_array($course_id, $wishlists)) {
                return true;
            } else {
                return false;
            }
        } else {
            return false;
        }
    }

    public function getWishLists($user_id = "")
    {
        if ($user_id == "") {
            $user_id = $this->session->userdata('user_id');
        }
        $user_details = $this->user_model->get_user($user_id)->row_array();
        return json_decode($user_details['wishlist']);
    }

    public function get_latest_10_course()
    {
        $scorm_status = addon_status('scorm_course');
        $h5p_status = addon_status('h5p');

        $this->db->group_start();
        $this->db->where('course_type', 'general');
        if ($scorm_status) {
            $this->db->or_where('course_type', 'scorm');
        }
        if ($h5p_status) {
            $this->db->or_where('course_type', 'h5p');
        }
        $this->db->group_end();

        $this->db->order_by("id", "desc");
        $this->db->limit('10');
        $this->db->where('status', 'active');
        return $this->db->get('course')->result_array();
    }

    public function enrol_student($enrol_user_id, $payer_user_id = "")
    {


        $purchased_courses = $this->session->userdata('cart_items');
        foreach ($purchased_courses as $purchased_course) {
            $course_details = $this->get_course_by_id($purchased_course)->row_array();
            if ($course_details['expiry_period'] > 0) {
                $days = $course_details['expiry_period'] * 30;
                $data['expiry_date'] = strtotime("+" . $days . " days");
            } else {
                $data['expiry_date'] = null;
            }


            if ($this->db->get_where('enrol', ['user_id' => $enrol_user_id, 'course_id' => $purchased_course])->num_rows() == 0) {
                if ($payer_user_id) {
                    $data['gifted_by'] = $payer_user_id;
                } else {
                    $data['gifted_by'] = 0;
                }
                $data['user_id'] = $enrol_user_id;
                $data['course_id'] = $purchased_course;
                $data['date_added'] = strtotime(date('D, d-M-Y'));
                $this->db->insert('enrol', $data);
            } else {
                $data['last_modified'] = time();
                $this->db->where('course_id', $purchased_course);
                $this->db->where('user_id', $enrol_user_id);
                $this->db->update('enrol', $data);
            }
        }
    }
    public function enrol_a_student_manually()
    {
        $courses_id = $this->input->post('course_id');
        $users_id   = $this->input->post('user_id');

        foreach ($users_id as $user_id) {

            foreach ($courses_id as $course_id) {
                $course_details = $this->get_course_by_id($course_id)->row_array();
                if ($course_details['expiry_period'] > 0) {
                    $days = $course_details['expiry_period'] * 30;
                    $data['expiry_date'] = strtotime("+" . $days . " days");
                } else {
                    $data['expiry_date'] = null;
                }
                $data['gifted_by'] = 0;


                if ($this->db->get_where('enrol', ['user_id' => $user_id, 'course_id' => $course_id])->num_rows() == 0) {
                    $data['user_id'] = $user_id;
                    $data['course_id'] = $course_id;
                    $data['date_added'] = strtotime(date('D, d-M-Y'));
                    $this->db->insert('enrol', $data);
                } else {
                    $data['last_modified'] = time();
                    $this->db->where('course_id', $course_id);
                    $this->db->where('user_id', $user_id);
                    $this->db->update('enrol', $data);
                }
            }
        }

        $this->session->set_flashdata('flash_message', get_phrase('student_has_been_enrolled'));
    }

    public function shortcut_enrol_a_student_manually()
    {
        $course_id = $this->input->post('course_id');
        $user_id   = $this->input->post('user_id');
        $course_details = $this->get_course_by_id($course_id)->row_array();
        if ($course_details['expiry_period'] > 0) {
            $days = $course_details['expiry_period'] * 30;
            $data['expiry_date'] = strtotime("+" . $days . " days");
        } else {
            $data['expiry_date'] = null;
        }

        if ($this->db->get_where('enrol', ['course_id' => $course_id, 'user_id' => $user_id])->num_rows() > 0) {
            $data['gifted_by'] = 0;
            $data['last_modified'] = strtotime(date('D, d-M-Y'));
            $this->db->where('user_id', $user_id);
            $this->db->where('course_id', $course_id);
            $this->db->update('enrol', $data);
        } else {
            $data['course_id'] = $course_id;
            $data['user_id']   = $user_id;
            $data['date_added'] = strtotime(date('D, d-M-Y'));
            $this->db->insert('enrol', $data);
        }

        $this->session->set_flashdata('flash_message', get_phrase('student_has_been_enrolled_to_that_course'));
        $response['status'] = 1;
        return json_encode($response);
    }

    public function enrol_to_free_course($course_id = "", $user_id = "")
    {
        $course_details = $this->get_course_by_id($course_id)->row_array();
        if ($course_details['is_free_course'] == 1) {
            if ($course_details['expiry_period'] > 0) {
                $days = $course_details['expiry_period'] * 30;
                $data['expiry_date'] = strtotime("+" . $days . " days");
            } else {
                $data['expiry_date'] = null;
            }


            if ($this->db->get_where('enrol', ['course_id' => $course_id, 'user_id' => $user_id])->num_rows() > 0) {
                $data['gifted_by'] = 0;
                $data['last_modified'] = strtotime(date('D, d-M-Y'));
                $this->db->where('user_id', $user_id);
                $this->db->where('course_id', $course_id);
                $this->db->update('enrol', $data);
            } else {
                $data['course_id'] = $course_id;
                $data['user_id']   = $user_id;
                $data['date_added'] = strtotime(date('D, d-M-Y'));
                $this->db->insert('enrol', $data);
            }
            $this->session->set_flashdata('flash_message', get_phrase('successfully_enrolled'));
        } else {
            $this->session->set_flashdata('error_message', get_phrase('this_course_is_not_free_at_all'));
            redirect(site_url('home/course/' . slugify($course_details['title']) . '/' . $course_id), 'refresh');
        }
    }
    public function course_purchase($user_id, $method, $amount_paid, $param1 = "", $param2 = "")
    {
        $purchased_courses = $this->session->userdata('cart_items');
        $applied_coupon = $this->session->userdata('applied_coupon');

        foreach ($purchased_courses as $purchased_course) {

            if ($method == 'stripe') {
                //param1 transaction_id, param2 session_id for stripe
                $data['transaction_id'] = $param1;
                $data['session_id'] = $param2;
            }

            if ($method == 'razorpay') {
                //param1 payment keys
                $data['transaction_id'] = $param1;
            }

            $data['user_id'] = $user_id;
            $data['payment_type'] = $method;
            $data['course_id'] = $purchased_course;
            $course_details = $this->get_course_by_id($purchased_course)->row_array();

            if ($course_details['discount_flag'] == 1) {
                $data['amount'] = $course_details['discounted_price'];
                if (addon_status('affiliate_course')  && $this->session->userdata('course_referee') != "" && $this->session->userdata('course_reffer_id')) {
                    $aff['buying_amount'] = $course_details['discounted_price']; // after discount ,he paid this price 
                    $aff['note'] = "discounted";
                }
            } else {
                $data['amount'] = $course_details['price'];
                if (addon_status('affiliate_course')  && $this->session->userdata('course_referee') != "" && $this->session->userdata('course_reffer_id')) {
                    $aff['buying_amount'] = $course_details['price'];
                    $aff['note'] = "actual price";
                }
            }

            // CHECK IF USER HAS APPLIED ANY COUPON CODE
            if ($applied_coupon) {
                $coupon_details = $this->get_coupon_details_by_code($applied_coupon)->row_array();
                $discount = ($data['amount'] * $coupon_details['discount_percentage']) / 100;
                $data['amount'] = $data['amount'] - $discount;
                $data['coupon'] = $applied_coupon;

                if (addon_status('affiliate_course')  && $this->session->userdata('course_referee') != "" && $this->session->userdata('course_reffer_id')) {
                    $aff['buying_amount'] = $data['amount'];
                    $aff['note'] = "coupon";
                }
            }

            if (addon_status('affiliate_course')  && $this->session->userdata('course_referee') != "" && $this->session->userdata('course_reffer_id')) {

                $aff['affiliate_amount'] = ceil(($aff['buying_amount'] *  get_settings('affiliate_addon_percentage')) / 100);
                $data['amount'] = $data['amount'] - $aff['affiliate_amount'];
            }


            //TAX handling
            if (get_settings('course_selling_tax') > 0) {
                $total_tax_on_courses_price = round(($data['amount'] / 100) * get_settings('course_selling_tax'), 2);
            } else {
                $total_tax_on_courses_price = 0;
            }
            $data['tax'] = $total_tax_on_courses_price;



            if (get_user_role('role_id', $course_details['creator']) == 1) {
                $data['admin_revenue'] = $data['amount'];
                $data['instructor_revenue'] = 0;
                $data['instructor_payment_status'] = 1;
            } else {
                if (get_settings('allow_instructor') == 1) {
                    $instructor_revenue_percentage = get_settings('instructor_revenue');
                    $data['instructor_revenue'] = ceil(($data['amount'] * $instructor_revenue_percentage) / 100);
                    $data['admin_revenue'] = $data['amount'] - $data['instructor_revenue'];
                } else {
                    $data['instructor_revenue'] = 0;
                    $data['admin_revenue'] = $data['amount'];
                }
                $data['instructor_payment_status'] = 0;
            }
            $data['date_added'] = strtotime(date('D, d-M-Y'));
            $this->db->insert('payment', $data);

            // course_addon start
            if (addon_status('affiliate_course')) :
                if ($this->session->userdata('course_referee') != "" && $this->session->userdata('course_reffer_id')) {
                    $CI    = &get_instance();
                    $CI->load->model('addons/affiliate_course_model');
                    $last_affiliate_course_entry = $this->affiliate_course_model->last_affiliate_course_entry($data['user_id'], $this->session->userdata('course_reffer_id'));
                    $reffre_details_for_aff_table = $this->affiliate_course_model->get_user_by_their_unique_identifier($this->session->userdata('course_referee'));
                    $reffre_details = $this->affiliate_course_model->get_userby_id($reffre_details_for_aff_table['user_id']);
                    $course_affiliation['payment_id'] = $data['transaction_id'];
                    $course_affiliation['type'] = "course";
                    $course_affiliation['actual_amount'] = $aff['buying_amount'];
                    $course_affiliation['amount'] = $aff['affiliate_amount'];
                    $course_affiliation['note'] = $aff['note'];
                    $course_affiliation['course_id'] = $this->session->userdata('course_reffer_id');
                    $course_affiliation['percentage'] = get_settings('affiliate_addon_percentage');
                    $course_affiliation['payment_type'] = $method;
                    $course_affiliation['date_added'] = strtotime(date('D, d-M-Y'));
                    $course_affiliation['buyer_id'] = $data['user_id'];
                    $course_affiliation['referee_id'] = $reffre_details['id'];
                    $this->db->insert('course_affiliation', $course_affiliation);
                    $this->session->unset_userdata('course_referee');
                    $this->session->unset_userdata('course_reffer_id');
                }
            endif;
            // course_addon end 

        }
    }

    public function get_default_lesson($section_id)
    {
        $this->db->order_by('order', "asc");
        $this->db->limit(1);
        $this->db->where('section_id', $section_id);
        return $this->db->get('lesson');
    }

    public function get_courses_by_wishlists()
    {
        $wishlists = $this->getWishLists();
        if (is_array($wishlists) && sizeof($wishlists) > 0) {
            $this->db->where_in('id', $wishlists);
            return $this->db->get('course')->result_array();
        } else {
            return array();
        }
    }


    public function get_courses_of_wishlists_by_search_string($search_string)
    {
        $wishlists = $this->getWishLists();
        if (sizeof($wishlists) > 0) {
            $this->db->where_in('id', $wishlists);
            $this->db->like('title', $search_string);
            return $this->db->get('course')->result_array();
        } else {
            return array();
        }
    }

    public function get_total_duration_of_lesson_by_course_id($course_id)
    {
        $this->db->select("TIME_FORMAT(SEC_TO_TIME(SUM(TIME_TO_SEC(duration))), '%H:%i:%s') AS timeSum", false);
        $this->db->where('course_id', $course_id);
        $query = $this->db->get('lesson')->result_array();
        return $query[0]['timeSum'] . ' ' . get_phrase('hours');
    }

    public function get_total_duration_of_lesson_by_section_id($section_id)
    {
        $this->db->select('SEC_TO_TIME( SUM( TIME_TO_SEC( `duration` ) ) ) AS timeSum ');
        $this->db->where('section_id', $section_id);
        $query = $this->db->get('lesson')->result_array();
        return $query[0]['timeSum'] . ' ' . get_phrase('hours');
    }

    public function rate($data)
    {
        if ($this->db->get_where('rating', array('user_id' => $data['user_id'], 'ratable_id' => $data['ratable_id'], 'ratable_type' => $data['ratable_type']))->num_rows() == 0) {
            $this->db->insert('rating', $data);
            return 'added';
        } else {
            $checker = array('user_id' => $data['user_id'], 'ratable_id' => $data['ratable_id'], 'ratable_type' => $data['ratable_type']);
            $this->db->where($checker);
            $this->db->update('rating', $data);
            return 'updated';
        }
    }

    public function get_user_specific_rating($ratable_type = "", $ratable_id = "")
    {
        $reviews = $this->db->get_where('rating', array('ratable_type' => $ratable_type, 'user_id' => $this->session->userdata('user_id'), 'ratable_id' => $ratable_id));
        if ($reviews->num_rows() > 0) {
            return $reviews->row_array();
        } else {
            return array('rating' => 0);
        }
    }

    public function get_ratings($ratable_type = "", $ratable_id = "", $is_sum = false)
    {
        if ($is_sum) {
            $this->db->select_sum('rating');
            return $this->db->order_by('id', 'desc')->get_where('rating', array('ratable_type' => $ratable_type, 'ratable_id' => $ratable_id));
        } else {
            return $this->db->order_by('id', 'desc')->get_where('rating', array('ratable_type' => $ratable_type, 'ratable_id' => $ratable_id));
        }
    }

    public function get_instructor_wise_course_ratings($instructor_id = "", $ratable_type = "", $is_sum = false)
    {
        $course_ids = $this->get_instructor_wise_courses($instructor_id, 'simple_array');
        $course_ids[] = 0;
        if ($is_sum) {
            $this->db->where('ratable_type', $ratable_type);
            $this->db->where_in('ratable_id', $course_ids);
            $this->db->select_sum('rating');
            return $this->db->get('rating');
        } else {
            $this->db->where('ratable_type', $ratable_type);
            $this->db->where_in('ratable_id', $course_ids);
            return $this->db->get('rating');
        }
    }
    public function get_percentage_of_specific_rating($rating = "", $ratable_type = "", $ratable_id = "")
    {
        $number_of_user_rated = $this->db->get_where('rating', array(
            'ratable_type' => $ratable_type,
            'ratable_id'   => $ratable_id
        ))->num_rows();

        $number_of_user_rated_the_specific_rating = $this->db->get_where('rating', array(
            'ratable_type' => $ratable_type,
            'ratable_id'   => $ratable_id,
            'rating'       => $rating
        ))->num_rows();

        //return $number_of_user_rated.' '.$number_of_user_rated_the_specific_rating;
        if ($number_of_user_rated_the_specific_rating > 0) {
            $percentage = ($number_of_user_rated_the_specific_rating / $number_of_user_rated) * 100;
        } else {
            $percentage = 0;
        }
        return floor($percentage);
    }

    ////////private message//////
    function send_new_private_message()
    {
        $message    = $this->input->post('message');
        $timestamp  = strtotime(date("Y-m-d H:i:s"));

        $receiver   = $this->input->post('receiver');
        $sender     = $this->session->userdata('user_id');

        //check if the thread between those 2 users exists, if not create new thread
        $num1 = $this->db->get_where('message_thread', array('sender' => $sender, 'receiver' => $receiver))->num_rows();
        $num2 = $this->db->get_where('message_thread', array('sender' => $receiver, 'receiver' => $sender))->num_rows();
        if ($num1 == 0 && $num2 == 0) {
            $message_thread_code                        = random(30);
            $data_message_thread['message_thread_code'] = $message_thread_code;
            $data_message_thread['sender']              = $sender;
            $data_message_thread['receiver']            = $receiver;
            $this->db->insert('message_thread', $data_message_thread);
        }
        if ($num1 > 0)
            $message_thread_code = $this->db->get_where('message_thread', array('sender' => $sender, 'receiver' => $receiver))->row()->message_thread_code;
        if ($num2 > 0)
            $message_thread_code = $this->db->get_where('message_thread', array('sender' => $receiver, 'receiver' => $sender))->row()->message_thread_code;


        $data_message['message_thread_code']    = $message_thread_code;
        $data_message['message']                = $message;
        $data_message['sender']                 = $sender;
        $data_message['receiver']            = $receiver;
        $data_message['timestamp']              = $timestamp;
        $data_message['read_status']            = 0;
        $this->db->insert('message', $data_message);

        return $message_thread_code;
    }

    function send_reply_message($message_thread_code)
    {

        $message    = html_escape($this->input->post('message'));
        $timestamp  = strtotime(date("Y-m-d H:i:s"));
        $sender     = $this->session->userdata('user_id');

        $message_thread = $this->db->get_where('message_thread', array('message_thread_code' => $message_thread_code))->row_array();
        if ($message_thread['sender'] == $sender) {
            $receiver = $message_thread['receiver'];
        } else {
            $receiver = $message_thread['sender'];
        }

        $data_message['message_thread_code']    = $message_thread_code;
        $data_message['message']                = $message;
        $data_message['sender']                 = $sender;
        $data_message['receiver']               = $receiver;
        $data_message['timestamp']              = $timestamp;
        $data_message['read_status']            = 0;
        $this->db->insert('message', $data_message);
    }

    function mark_thread_messages_read($message_thread_code)
    {
        // mark read only the oponnent messages of this thread, not currently logged in user's sent messages
        $user_id = $this->session->userdata('user_id');
        $this->db->where('receiver', $user_id);
        $this->db->where('message_thread_code', $message_thread_code);
        $this->db->update('message', array('read_status' => 1));
    }

    function count_unread_message_of_thread($message_thread_code)
    {
        $current_user = $this->session->userdata('user_id');
        $this->db->where('message_thread_code', $message_thread_code);
        $this->db->where('receiver', $current_user);
        $this->db->where('read_status !=', 1);
        return $this->db->get('message')->num_rows();
    }

    public function get_last_message_by_message_thread_code($message_thread_code)
    {
        $this->db->order_by('message_id', 'desc');
        $this->db->limit(1);
        $this->db->where(array('message_thread_code' => $message_thread_code));
        return $this->db->get('message');
    }

    function curl_request($code = '')
    {

        $purchase_code = $code;

        $personal_token = "FkA9UyDiQT0YiKwYLK3ghyFNRVV9SeUn";
        $url = "https://api.envato.com/v3/market/author/sale?code=" . $purchase_code;
        $curl = curl_init($url);

        //setting the header for the rest of the api
        $bearer   = 'bearer ' . $personal_token;
        $header   = array();
        $header[] = 'Content-length: 0';
        $header[] = 'Content-type: application/json; charset=utf-8';
        $header[] = 'Authorization: ' . $bearer;

        $verify_url = 'https://api.envato.com/v1/market/private/user/verify-purchase:' . $purchase_code . '.json';
        $ch_verify = curl_init($verify_url . '?code=' . $purchase_code);

        curl_setopt($ch_verify, CURLOPT_HTTPHEADER, $header);
        curl_setopt($ch_verify, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch_verify, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch_verify, CURLOPT_CONNECTTIMEOUT, 5);
        curl_setopt($ch_verify, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');

        $cinit_verify_data = curl_exec($ch_verify);
        curl_close($ch_verify);

        $response = json_decode($cinit_verify_data, true);

        if (count($response['verify-purchase']) > 0) {
            return true;
        } else {
            return false;
        }
    }


    // version 1.3
    function get_currencies()
    {
        return $this->db->get('currency')->result_array();
    }

    function get_paypal_supported_currencies()
    {
        $this->db->where('paypal_supported', 1);
        return $this->db->get('currency')->result_array();
    }

    function get_stripe_supported_currencies()
    {
        $this->db->where('stripe_supported', 1);
        return $this->db->get('currency')->result_array();
    }

    // version 1.4
    function filter_course($search_string = "", $selected_category_id = "", $selected_price = "", $selected_level = "", $selected_language = "", $selected_rating = "", $selected_sorting = "", $per_page = "", $uri_segment = "")
    {

        if ($selected_category_id != "all") {
            $category_details = $this->get_category_details_by_id($selected_category_id)->row_array();

            if ($category_details['parent'] > 0) {
                $category_type = 'sub_category';
            } else {
                $category_type = 'parent_category';
            }
        } else {
            $category_type = 'all';
        }

        $scorm_addon_status = addon_status('scorm_course');
        $h5p_addon_status = addon_status('h5p');


        //START QUERY FOR RATING'S FILTER
        $course_ids = array(0);

        if ($selected_rating != "all") {
            $this->db->select('c.*');
            $this->db->select('AVG(r.rating) avg_rating', FALSE);

            if ($search_string != "") {
                $this->db->group_start();
                $this->db->like('c.title', $search_string);
                $this->db->or_like('c.short_description', $search_string);
                $this->db->or_like('c.description', $search_string);
                $this->db->or_like('c.outcomes', $search_string);
                $this->db->or_like('c.language', $search_string);
                $this->db->or_like('c.requirements', $search_string);
                $this->db->or_like('c.meta_keywords', $search_string);
                $this->db->or_like('c.meta_description', $search_string);
                $this->db->group_end();
            }

            if ($category_type != "all" && $category_type == 'sub_category') {
                $this->db->group_start();
                $this->db->where('c.sub_category_id', $selected_category_id);
                $this->db->group_end();
            } elseif ($category_type != "all" && $category_type == 'parent_category') {
                $this->db->group_start();
                $this->db->where('c.category_id', $selected_category_id);
                $this->db->group_end();
            }

            if ($selected_price != "all" && $selected_price == "paid") {
                $this->db->group_start();
                $this->db->where('c.is_free_course', null);
                $this->db->group_end();
            } elseif ($selected_price != "all" && $selected_price == "free") {
                $this->db->group_start();
                $this->db->where('c.is_free_course', 1);
                $this->db->group_end();
            }

            if ($selected_level != "all") {
                $this->db->group_start();
                $this->db->where('c.level', $selected_level);
                $this->db->group_end();
            }

            if ($selected_language != "all") {
                $this->db->group_start();
                $this->db->where('c.language', $selected_language);
                $this->db->group_end();
            }

            $this->db->group_start();
            $this->db->where('c.course_type', 'general');
            if ($scorm_addon_status) {
                $this->db->or_where('c.course_type', 'scorm');
            }
            if ($h5p_addon_status) {
                $this->db->or_where('c.course_type', 'h5p');
            }
            $this->db->group_end();

            $this->db->group_start();
            $this->db->where('c.status', 'active');
            $this->db->group_end();

            $this->db->from('course c')->join('rating r', 'r.ratable_id = c.id', 'left');

            $this->db->group_by('c.id');
            $this->db->order_by('avg_rating', 'desc');
            $courses = $this->db->get()->result_array();

            //for join query new code
            foreach ($courses as $course) {
                if (round($course['avg_rating']) < $selected_rating) break;

                if (round($course['avg_rating']) == $selected_rating) {
                    array_push($course_ids, $course['id']);
                }
            }
        }
        //END QUERY FOR RATING'S FILTER


        $this->db->select('c.*');
        $this->db->select('AVG(r.rating) avg_rating', FALSE);

        if ($search_string != "") {
            $this->db->group_start();
            $this->db->like('c.title', $search_string);
            $this->db->or_like('c.short_description', $search_string);
            $this->db->or_like('c.description', $search_string);
            $this->db->or_like('c.outcomes', $search_string);
            $this->db->or_like('c.language', $search_string);
            $this->db->or_like('c.requirements', $search_string);
            $this->db->or_like('c.meta_keywords', $search_string);
            $this->db->or_like('c.meta_description', $search_string);
            $this->db->group_end();
        }

        if ($selected_rating != "all") {
            $this->db->group_start();
            $this->db->where_in('c.id', $course_ids);
            $this->db->group_end();
        }

        if ($category_type != "all" && $category_type == 'sub_category') {
            $this->db->group_start();
            $this->db->where('c.sub_category_id', $selected_category_id);
            $this->db->group_end();
        } elseif ($category_type != "all" && $category_type == 'parent_category') {
            $this->db->group_start();
            $this->db->where('c.category_id', $selected_category_id);
            $this->db->group_end();
        }


        if ($selected_price != "all" && $selected_price == "paid") {
            $this->db->group_start();
            $this->db->where('c.is_free_course', null);
            $this->db->group_end();
        } elseif ($selected_price != "all" && $selected_price == "free") {
            $this->db->group_start();
            $this->db->where('c.is_free_course', 1);
            $this->db->group_end();
        }

        if ($selected_level != "all") {
            $this->db->group_start();
            $this->db->where('c.level', $selected_level);
            $this->db->group_end();
        }

        if ($selected_language != "all") {
            $this->db->group_start();
            $this->db->where('c.language', $selected_language);
            $this->db->group_end();
        }


        $this->db->group_start();
        $this->db->where('c.course_type', 'general');
        if ($scorm_addon_status) {
            $this->db->or_where('c.course_type', 'scorm');
        }
        if ($h5p_addon_status) {
            $this->db->or_where('c.course_type', 'h5p');
        }
        $this->db->group_end();

        $this->db->group_start();
        $this->db->where('c.status', 'active');
        $this->db->group_end();


        $this->db->from('course c')->join('rating r', 'r.ratable_id = c.id', 'left');
        $this->db->group_by('c.id');

        //sorting
        if ($selected_sorting != "" && $selected_sorting == 'newest') {
            $this->db->order_by('c.id', 'desc');
        } elseif ($selected_sorting != "" && $selected_sorting == 'lowest-price') {
            $this->db->order_by('is_free_course ASC, price ASC, discount_flag DESC, discounted_price ASC');
        } elseif ($selected_sorting != "" && $selected_sorting == 'highest-price') {
            $this->db->order_by('price DESC, discount_flag ASC, discounted_price DESC');
        } elseif ($selected_sorting != "" && $selected_sorting == 'discounted') {
            $this->db->order_by('discount_flag DESC, price ASC');
        } elseif ($selected_sorting != "" && $selected_sorting == 'highest-rating') {
            $this->db->order_by('avg_rating', 'desc');
        }

        //$this->db->order_by(6, 'RANDOM');

        if ($per_page != "" || $uri_segment != "") {
            $this->db->limit($per_page, $uri_segment);
            return $this->db->get();
        } else {
            return $this->db->get();
        }
    }

    public function get_courses($category_id = "", $sub_category_id = "", $instructor_id = 0)
    {
        if ($category_id > 0 && $sub_category_id > 0 && $instructor_id > 0) {

            $this->db->group_start();
            $this->db->like('user_id', ',' . $instructor_id);
            $this->db->or_like('user_id', $instructor_id . ',');
            $this->db->or_where('creator', $instructor_id);
            $this->db->group_end();

            if ($status != "") {
                $this->db->group_start();
                $this->db->where('category_id', $category_id);
                $this->db->where('sub_category_id', $sub_category_id);
                $this->db->group_end();
            }

            return $this->db->get('course');
        } elseif ($category_id > 0 && $sub_category_id > 0 && $instructor_id == 0) {
            return $this->db->get_where('course', array('category_id' => $category_id, 'sub_category_id' => $sub_category_id));
        } else {
            return $this->db->get('course');
        }
    }

    public function filter_course_for_backend($category_id, $instructor_id, $price, $status)
    {
        if ($category_id != "all") {
            $this->db->where('sub_category_id', $category_id);
        }

        if ($price != "all") {
            if ($price == "paid") {
                $this->db->where('is_free_course', null);
            } elseif ($price == "free") {
                $this->db->where('is_free_course', 1);
            }
        }

        if ($instructor_id != "all") {
            $this->db->group_start();
            $this->db->like('user_id', ',' . $instructor_id);
            $this->db->or_like('user_id', $instructor_id . ',');
            $this->db->or_where('creator', $instructor_id);
            $this->db->group_end();
        }

        if ($status != "all") {
            $this->db->where('status', $status);
        }
        return $this->db->get('course')->result_array();
    }

    public function sort_section($section_json)
    {
        $sections = json_decode($section_json);
        foreach ($sections as $key => $value) {
            $updater = array(
                'order' => $key + 1
            );
            $this->db->where('id', $value);
            $this->db->update('section', $updater);
        }
    }

    public function sort_lesson($lesson_json)
    {
        $lessons = json_decode($lesson_json);
        foreach ($lessons as $key => $value) {
            $updater = array(
                'order' => $key + 1
            );
            $this->db->where('id', $value);
            $this->db->update('lesson', $updater);
        }
    }
    public function sort_question($question_json)
    {
        $questions = json_decode($question_json);
        foreach ($questions as $key => $value) {
            $updater = array(
                'order' => $key + 1
            );
            $this->db->where('id', $value);
            $this->db->update('question', $updater);
        }
    }

    public function get_free_and_paid_courses($price_status = "", $instructor_id = "")
    {
        if ($price_status == 'free') {
            $this->db->where('is_free_course', 1);
        } else {
            $this->db->where('is_free_course', null);
        }


        if (!$this->session->userdata('admin_login')) {
            $this->db->group_start();
            $this->db->like('user_id', ',' . $instructor_id);
            $this->db->or_like('user_id', $instructor_id . ',');
            $this->db->or_where('creator', $instructor_id);
            $this->db->group_end();
        }
        return $this->db->get('course');
    }

    // Adding quiz functionalities
    public function add_quiz($course_id = "")
    {
        $data['course_id'] = $course_id;
        $data['title'] = html_escape($this->input->post('title'));
        $data['section_id'] = html_escape($this->input->post('section_id'));

        $data['lesson_type'] = 'quiz';
        $data['duration'] = $this->input->post('quiz_duration');
        $data['attachment_type'] = 'json';

        $attachment_data = array(
            'total_marks' => htmlspecialchars_($this->input->post('total_marks')),
            'pass_mark' => $this->input->post('pass_mark'),
            'drip_content_for_passing_rule' => $this->input->post('drip_content_for_passing_rule')
        );
        $data['attachment'] = json_encode($attachment_data);
        $data['date_added'] = strtotime(date('D, d-M-Y'));
        $data['summary'] = html_escape($this->input->post('summary'));
        $data['quiz_attempt'] = html_escape($this->input->post('number_of_quiz_retakes'));
        $this->db->insert('lesson', $data);
    }

    // updating quiz functionalities
    public function edit_quiz($lesson_id = "")
    {
        $data['title'] = html_escape($this->input->post('title'));
        $data['section_id'] = html_escape($this->input->post('section_id'));
        $data['duration'] = $this->input->post('quiz_duration');
        $attachment_data = array(
            'total_marks' => htmlspecialchars_($this->input->post('total_marks')),
            'pass_mark' => $this->input->post('pass_mark'),
            'drip_content_for_passing_rule' => $this->input->post('drip_content_for_passing_rule')
        );
        $data['attachment'] = json_encode($attachment_data);
        $data['last_modified'] = strtotime(date('D, d-M-Y'));
        $data['summary'] = html_escape($this->input->post('summary'));
        $data['quiz_attempt'] = html_escape($this->input->post('number_of_quiz_retakes'));
        $this->db->where('id', $lesson_id);
        $this->db->update('lesson', $data);
    }

    // Get quiz questions
    public function get_quiz_questions($quiz_id)
    {
        $this->db->order_by("order", "asc");
        $this->db->where('quiz_id', $quiz_id);
        return $this->db->get('question');
    }

    public function get_quiz_question_by_id($question_id)
    {
        $this->db->order_by("order", "asc");
        $this->db->where('id', $question_id);
        return $this->db->get('question');
    }

    // Add Quiz Questions
    public function manage_quiz_questions($quiz_id, $question_id, $action)
    {
        $question_type = $this->input->post('question_type');
        if ($question_type == 'multiple_choice' || $question_type == 'single_choice') {
            return $this->manage_mcq_choice_question($quiz_id, $question_id, $action);
        } elseif ($question_type == 'plain_text') {
            return $this->manage_plain_text_question($quiz_id, $question_id, $action);
        } elseif ($question_type == 'fill_in_the_blank') {
            return $this->manage_fill_in_the_blank_question($quiz_id, $question_id, $action);
        }
    }

    // multiple_choice_question crud functions
    function manage_mcq_choice_question($quiz_id, $question_id, $action)
    {
        if (sizeof($this->input->post('options')) != $this->input->post('number_of_options')) {
            echo get_phrase('no_options_can_be_blank_and_there_has_to_be_atleast_one_answer');
            return;
        }
        if (empty($this->input->post('title'))) {
            echo get_phrase('question_title_can_not_be_empty');
            return;
        }
        foreach ($this->input->post('options') as $option) {
            if ($option == "") {
                echo get_phrase('no_options_can_be_blank_and_there_has_to_be_atleast_one_answer');
                return;
            }
        }
        if (is_array($this->input->post('correct_answers')) && sizeof($this->input->post('correct_answers')) == 0) {
            $correct_answers = [""];
        } elseif (!empty($this->input->post('correct_answers'))) {
            $correct_answers = $this->input->post('correct_answers');
        } else {
            echo get_phrase('correct_answer_can_not_be_empty');
            return;
        }

        $data['title']              = htmlspecialchars_($this->input->post('title', false));
        $data['number_of_options']  = htmlspecialchars_($this->input->post('number_of_options'));
        $data['type']               = htmlspecialchars_($this->input->post('question_type'));
        $data['options']            = json_encode($this->input->post('options'));
        $data['correct_answers']    = json_encode($correct_answers);

        if ($action == 'add') {
            $data['quiz_id']            = $quiz_id;
            $this->db->insert('question', $data);
        } elseif ($action == 'edit') {
            $this->db->where('id', $question_id);
            $this->db->update('question', $data);
        }
        return true;
    }

    function manage_plain_text_question($quiz_id, $question_id, $action)
    {
        $data['title']              = htmlspecialchars_($this->input->post('title', false));
        $data['type']               = htmlspecialchars_($this->input->post('question_type'));
        $data['number_of_options']  = 1;

        if ($action == 'add') {
            $data['quiz_id']            = $quiz_id;
            $this->db->insert('question', $data);
        } elseif ($action == 'edit') {
            $this->db->where('id', $question_id);
            $this->db->update('question', $data);
        }
        return true;
    }

    function manage_fill_in_the_blank_question($quiz_id, $question_id, $action)
    {
        if (empty($this->input->post('title'))) {
            echo get_phrase('question_title_can_not_be_empty');
            return;
        } elseif (empty($this->input->post('correct_answers'))) {
            echo get_phrase('correct_answer_can_not_be_empty');
            return;
        }

        $data['title']              = htmlspecialchars_($this->input->post('title', false));
        $data['type']               = htmlspecialchars_($this->input->post('question_type'));
        $data['correct_answers']    = json_encode(explode(",", $this->input->post('correct_answers')));
        $data['options']            = json_encode(array());
        $data['number_of_options']  = count(json_decode($data['correct_answers']));

        if ($action == 'add') {
            $data['quiz_id']            = $quiz_id;
            $this->db->insert('question', $data);
        } elseif ($action == 'edit') {
            $this->db->where('id', $question_id);
            $this->db->update('question', $data);
        }
        return true;
    }

    function delete_quiz_question($question_id)
    {
        $this->db->where('id', $question_id);
        $this->db->delete('question');
        return true;
    }

    function get_application_details()
    {
        $purchase_code = get_settings('purchase_code');
        $returnable_array = array(
            'purchase_code_status' => get_phrase('not_found'),
            'support_expiry_date'  => get_phrase('not_found'),
            'customer_name'        => get_phrase('not_found')
        );

        $personal_token = "gC0J1ZpY53kRpynNe4g2rWT5s4MW56Zg";
        $url = "https://api.envato.com/v3/market/author/sale?code=" . $purchase_code;
        $curl = curl_init($url);

        //setting the header for the rest of the api
        $bearer   = 'bearer ' . $personal_token;
        $header   = array();
        $header[] = 'Content-length: 0';
        $header[] = 'Content-type: application/json; charset=utf-8';
        $header[] = 'Authorization: ' . $bearer;

        $verify_url = 'https://api.envato.com/v1/market/private/user/verify-purchase:' . $purchase_code . '.json';
        $ch_verify = curl_init($verify_url . '?code=' . $purchase_code);

        curl_setopt($ch_verify, CURLOPT_HTTPHEADER, $header);
        curl_setopt($ch_verify, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch_verify, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch_verify, CURLOPT_CONNECTTIMEOUT, 5);
        curl_setopt($ch_verify, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');

        $cinit_verify_data = curl_exec($ch_verify);
        curl_close($ch_verify);

        $response = json_decode($cinit_verify_data, true);

        if (count($response['verify-purchase']) > 0) {

            //print_r($response);
            $item_name         = $response['verify-purchase']['item_name'];
            $purchase_time       = $response['verify-purchase']['created_at'];
            $customer         = $response['verify-purchase']['buyer'];
            $licence_type       = $response['verify-purchase']['licence'];
            $support_until      = $response['verify-purchase']['supported_until'];
            $customer         = $response['verify-purchase']['buyer'];

            $purchase_date      = date("d M, Y", strtotime($purchase_time));

            $todays_timestamp     = strtotime(date("d M, Y"));
            $support_expiry_timestamp = strtotime($support_until);

            $support_expiry_date  = date("d M, Y", $support_expiry_timestamp);

            if ($todays_timestamp > $support_expiry_timestamp)
                $support_status    = 'expired';
            else
                $support_status    = 'valid';

            $returnable_array = array(
                'purchase_code_status' => $support_status,
                'support_expiry_date'  => $support_expiry_date,
                'customer_name'        => $customer,
                'product_license'      => 'valid',
                'license_type'         => $licence_type
            );
        } else {
            $returnable_array = array(
                'purchase_code_status' => 'invalid',
                'support_expiry_date'  => 'invalid',
                'customer_name'        => 'invalid',
                'product_license'      => 'invalid',
                'license_type'         => 'invalid'
            );
        }

        return $returnable_array;
    }

    // Version 2.2 codes

    // This function is responsible for retreving all the language file from language folder
    function get_all_languages()
    {
        $language_files = array();
        $all_files = $this->get_list_of_language_files();
        foreach ($all_files as $file) {
            $info = pathinfo($file);
            if (isset($info['extension']) && strtolower($info['extension']) == 'json') {
                $file_name = explode('.json', $info['basename']);
                array_push($language_files, $file_name[0]);
            }
        }
        return $language_files;
    }

    // This function is responsible for showing all the installed themes
    function get_installed_themes($dir = APPPATH . '/views/frontend')
    {
        $result = array();
        $cdir = $files = preg_grep('/^([^.])/', scandir($dir));
        foreach ($cdir as $key => $value) {
            if (!in_array($value, array(".", ".."))) {
                if (is_dir($dir . DIRECTORY_SEPARATOR . $value)) {
                    array_push($result, $value);
                }
            }
        }
        return $result;
    }
    // This function is responsible for showing all the uninstalled themes inside themes folder
    function get_uninstalled_themes($dir = 'themes')
    {
        $result = array();
        $cdir = $files = preg_grep('/^([^.])/', scandir($dir));
        foreach ($cdir as $key => $value) {
            if (!in_array($value, array(".", "..", ".DS_Store"))) {
                array_push($result, $value);
            }
        }
        return $result;
    }
    // This function is responsible for retreving all the language file from language folder
    function get_list_of_language_files($dir = APPPATH . '/language', &$results = array())
    {
        $files = scandir($dir);
        foreach ($files as $key => $value) {
            $path = realpath($dir . DIRECTORY_SEPARATOR . $value);
            if (!is_dir($path)) {
                $results[] = $path;
            } else if ($value != "." && $value != "..") {
                $this->get_list_of_directories_and_files($path, $results);
                $results[] = $path;
            }
        }
        return $results;
    }

    // This function is responsible for retreving all the files and folder
    function get_list_of_directories_and_files($dir = APPPATH, &$results = array())
    {
        $files = scandir($dir);
        foreach ($files as $key => $value) {
            $path = realpath($dir . DIRECTORY_SEPARATOR . $value);
            if (!is_dir($path)) {
                $results[] = $path;
            } else if ($value != "." && $value != "..") {
                $this->get_list_of_directories_and_files($path, $results);
                $results[] = $path;
            }
        }
        return $results;
    }

    function remove_files_and_folders($dir)
    {
        if (is_dir($dir)) {
            $objects = scandir($dir);
            foreach ($objects as $object) {
                if ($object != "." && $object != "..") {
                    if (filetype($dir . "/" . $object) == "dir") {
                        $this->remove_files_and_folders($dir . "/" . $object);
                    } else {
                        unlink($dir . "/" . $object);
                    }
                }
            }
            reset($objects);
            rmdir($dir);
        }
    }

    function get_category_wise_courses($category_id = "")
    {
        $category_details = $this->get_category_details_by_id($category_id)->row_array();

        if ($category_details['parent'] > 0) {
            $this->db->where('sub_category_id', $category_id);
        } else {
            $this->db->where('category_id', $category_id);
        }
        $this->db->where('status', 'active');
        return $this->db->get('course');
    }

    function activate_theme($theme_to_active)
    {
        $data['value'] = $theme_to_active;
        $this->db->where('key', 'theme');
        $this->db->update('frontend_settings', $data);
    }




    // code of mark this lesson as completed
    function update_watch_history_manually($lesson_id = "", $course_id = "", $user_id = "")
    {
        $is_completed = 0;
        if ($lesson_id == "") {
            $lesson_id = $this->input->post('lesson_id');
        }
        if ($course_id == "") {
            $course_id = $this->input->post('course_id');
        }
        if ($user_id == "") {
            $user_id   = $this->session->userdata('user_id');
        }
        $query = $this->db->get_where('watch_histories', array('course_id' => $course_id, 'student_id' => $user_id));
        $course_progress = $query->row('course_progress');
        if ($query->num_rows() > 0) {
            $lesson_ids = json_decode($query->row('completed_lesson'), true);
            if (!is_array($lesson_ids)) $lesson_ids = array();
            if (!in_array($lesson_id, $lesson_ids)) {
                array_push($lesson_ids, $lesson_id);
                $total_lesson = $this->db->get_where('lesson', array('course_id' => $course_id))->num_rows();
                $course_progress = (100 / $total_lesson) * count($lesson_ids);

                if ($course_progress >= 100 && $query->row('completed_date') == null) {
                    $completed_date = time();
                } else {
                    $completed_date = $query->row('completed_date');
                }

                $this->db->where('watch_history_id', $query->row('watch_history_id'));
                $this->db->update('watch_histories', array('course_progress' => $course_progress, 'completed_lesson' => json_encode($lesson_ids), 'completed_date' => $completed_date, 'date_updated' => time()));
                $is_completed = 1;
            } else {
                if (($key = array_search($lesson_id, $lesson_ids)) !== false) {
                    unset($lesson_ids[$key]);
                }
                $total_lesson = $this->db->get_where('lesson', array('course_id' => $course_id))->num_rows();
                $course_progress = (100 / $total_lesson) * count($lesson_ids);

                if ($course_progress >= 100 && $query->row('completed_date') == null) {
                    $completed_date = time();
                } else {
                    $completed_date = $query->row('completed_date');
                }

                $this->db->where('watch_history_id', $query->row('watch_history_id'));
                $this->db->update('watch_histories', array('course_progress' => $course_progress, 'completed_lesson' => json_encode($lesson_ids), 'completed_date' => $completed_date, 'date_updated' => time()));
                $is_completed = 0;
            }
            // CHECK IF THE USER IS ELIGIBLE FOR CERTIFICATE
            if (addon_status('certificate') && $course_progress >= 100) {
                $this->load->model('addons/Certificate_model', 'certificate_model');
                $this->certificate_model->check_certificate_eligibility($course_id, $user_id);
            }
        } else {
            $total_lesson = $this->db->get_where('lesson', array('course_id' => $course_id))->num_rows();
            $course_progress = (100 / $total_lesson);

            $insert_data['course_id'] = $course_id;
            $insert_data['student_id'] = $user_id;
            $insert_data['completed_lesson'] = json_encode(array($lesson_id));
            $insert_data['course_progress'] = $course_progress;
            $insert_data['watching_lesson_id'] = $lesson_id;
            $insert_data['date_added'] = $course_progress;
            $this->db->insert('watch_histories', $insert_data);
        }

        return json_encode(array('lesson_id' => $lesson_id, 'course_progress' => round($course_progress), 'is_completed' => $is_completed));
    }



    //FOR MOBILE
    function enrol_to_free_course_mobile($course_id = "", $user_id = "")
    {
        $course_details = $this->get_course_by_id($course_id)->row_array();
        if ($course_details['expiry_period'] > 0) {
            $days = $course_details['expiry_period'] * 30;
            $data['expiry_date'] = strtotime("+" . $days . " days");
        } else {
            $data['expiry_date'] = null;
        }

        if ($this->db->get_where('course', array('id' => $course_id))->row('is_free_course') == 1) :
            $data['gifted_by'] = 0;
            if ($this->db->get_where('enrol', ['course_id' => $course_id, 'user_id' => $user_id])->num_rows() > 0) {
                $data['course_id'] = $course_id;
                $data['user_id']   = $user_id;
                $data['date_added'] = strtotime(date('D, d-M-Y'));
                $this->db->insert('enrol', $data);
            } else {
                $data['last_modified'] = strtotime(date('D, d-M-Y'));
                $this->db->where('user_id', $user_id);
                $this->db->where('course_id', $course_id);
                $this->db->update('enrol', $data);
            }
        endif;
    }

    function check_course_enrolled($course_id = "", $user_id = "")
    {
        return $this->db->get_where('enrol', array('course_id' => $course_id, 'user_id' => $user_id))->num_rows();
    }


    // GET PAYOUTS
    public function get_payouts($id = "", $type = "")
    {
        $this->db->order_by('id', 'DESC');
        if ($id > 0 && $type == 'user') {
            $this->db->where('user_id', $id);
        } elseif ($id > 0 && $type == 'payout') {
            $this->db->where('id', $id);
        }
        return $this->db->get('payout');
    }

    // GET COMPLETED PAYOUTS BY DATE RANGE
    public function get_completed_payouts_by_date_range($timestamp_start = "", $timestamp_end = "")
    {
        $this->db->order_by('id', 'DESC');
        $this->db->where('date_added >=', $timestamp_start);
        $this->db->where('date_added <=', $timestamp_end);
        $this->db->where('status', 1);
        return $this->db->get('payout');
    }

    // GET PENDING PAYOUTS BY DATE RANGE
    public function get_pending_payouts()
    {
        $this->db->order_by('id', 'DESC');
        $this->db->where('status', 0);
        return $this->db->get('payout');
    }

    // GET TOTAL PAYOUT AMOUNT OF AN INSTRUCTOR
    public function get_total_payout_amount($id = "")
    {
        $checker = array(
            'user_id' => $id,
            'status'  => 1
        );
        $this->db->order_by('id', 'DESC');
        $payouts = $this->db->get_where('payout', $checker)->result_array();
        $total_amount = 0;
        foreach ($payouts as $payout) {
            $total_amount = $total_amount + $payout['amount'];
        }
        return $total_amount;
    }

    // GET TOTAL REVENUE AMOUNT OF AN INSTRUCTOR
    public function get_total_revenue($id = "")
    {
        $revenues = $this->get_instructor_revenue($id);
        $total_amount = 0;
        foreach ($revenues as $key => $revenue) {
            $total_amount = $total_amount + $revenue['instructor_revenue'];
        }
        return $total_amount;
    }

    // GET TOTAL PENDING AMOUNT OF AN INSTRUCTOR
    public function get_total_pending_amount($id = "")
    {
        $total_revenue = $this->get_total_revenue($id);
        $total_payouts = $this->get_total_payout_amount($id);
        $total_pending_amount = $total_revenue - $total_payouts;
        return $total_pending_amount;
    }

    // GET REQUESTED WITHDRAWAL AMOUNT OF AN INSTRUCTOR
    public function get_requested_withdrawal_amount($id = "")
    {
        $requested_withdrawal_amount = 0;
        $checker = array(
            'user_id' => $id,
            'status' => 0
        );
        $payouts = $this->db->get_where('payout', $checker);
        if ($payouts->num_rows() > 0) {
            $payouts = $payouts->row_array();
            $requested_withdrawal_amount = $payouts['amount'];
        }
        return $requested_withdrawal_amount;
    }

    // GET REQUESTED WITHDRAWALS OF AN INSTRUCTOR
    public function get_requested_withdrawals($id = "")
    {
        $requested_withdrawal_amount = 0;
        $checker = array(
            'user_id' => $id,
            'status' => 0
        );
        $payouts = $this->db->get_where('payout', $checker);

        return $payouts;
    }

    // ADD NEW WITHDRAWAL REQUEST
    public function add_withdrawal_request()
    {
        $user_id = $this->session->userdata('user_id');
        $total_pending_amount = $this->get_total_pending_amount($user_id);

        if (addon_status('ebook')) {
            $this->db->select_sum('instructor_revenue');
            $this->db->where('ebook.user_id', $this->session->userdata('user_id'));
            $this->db->where('ebook_payment.instructor_payment_status', 0);
            $this->db->from('ebook_payment');
            $this->db->join('ebook', 'ebook_payment.ebook_id = ebook.ebook_id');
            $ebook_total_pending_amount = $this->db->get()->row('instructor_revenue');
            $total_pending_amount = $total_pending_amount + $ebook_total_pending_amount;
        }

        if (addon_status('tutor_booking')) {
            $this->db->select_sum('instructor_revenue');
            $this->db->where('tutor_id', $this->session->userdata('user_id'));
            $this->db->from('tutor_payment');
            $tutor_total_pending_amount = $this->db->get()->row('instructor_revenue');

            $total_pending_amount = $total_pending_amount + $tutor_total_pending_amount;
        }

        $requested_withdrawal_amount = $this->input->post('withdrawal_amount');
        if ($total_pending_amount > 0 && $total_pending_amount >= $requested_withdrawal_amount) {
            $data['amount']     = $requested_withdrawal_amount;
            $data['user_id']    = $this->session->userdata('user_id');
            $data['date_added'] = strtotime(date('D, d M Y'));
            $data['status']     = 0;
            $this->db->insert('payout', $data);
            $this->session->set_flashdata('flash_message', get_phrase('withdrawal_requested'));
        } else {
            $this->session->set_flashdata('error_message', get_phrase('invalid_withdrawal_amount'));
        }
    }

    // DELETE WITHDRAWAL REQUESTS
    public function delete_withdrawal_request()
    {
        $checker = array(
            'user_id' => $this->session->userdata('user_id'),
            'status' => 0
        );
        $requested_withdrawal = $this->db->get_where('payout', $checker);
        if ($requested_withdrawal->num_rows() > 0) {
            $this->db->where($checker);
            $this->db->delete('payout');
            $this->session->set_flashdata('flash_message', get_phrase('withdrawal_deleted'));
        } else {
            $this->session->set_flashdata('error_message', get_phrase('withdrawal_not_found'));
        }
    }

    // get instructor wise total enrolment. this function return the number of enrolment for a single instructor
    public function instructor_wise_enrolment($instructor_id)
    {
        $course_ids = $this->crud_model->get_instructor_wise_courses($instructor_id, 'simple_array');
        if (!count($course_ids) > 0) {
            return false;
        }
        $this->db->select('user_id');
        $this->db->where_in('course_id', $course_ids);
        return $this->db->get('enrol');
    }

    public function check_duplicate_payment_for_stripe($transaction_id = "", $stripe_session_id = "", $user_id = "")
    {
        if ($user_id == "") {
            $user_id = $this->session->userdata('user_id');
        }

        $query = $this->db->get_where('payment', array('user_id' => $user_id, 'transaction_id' => $transaction_id, 'session_id' => $stripe_session_id));
        if ($query->num_rows() > 0) {
            return true;
        } else {
            return false;
        }
    }

    public function get_course_by_course_type($type = "")
    {
        if ($type != "") {
            $this->db->where('course_type', $type);
        }
        return $this->db->get('course');
    }

    public function check_recaptcha()
    {
        if (isset($_POST["g-recaptcha-response"])) {
            $url = 'https://www.google.com/recaptcha/api/siteverify';
            $data = array(
                'secret' => get_frontend_settings('recaptcha_secretkey'),
                'response' => $_POST["g-recaptcha-response"]
            );
            $query = http_build_query($data);
            $options = array(
                'http' => array(
                    'header' => "Content-Type: application/x-www-form-urlencoded\r\n" .
                        "Content-Length: " . strlen($query) . "\r\n" .
                        "User-Agent:MyAgent/1.0\r\n",
                    'method' => 'POST',
                    'content' => $query
                )
            );
            $context  = stream_context_create($options);
            $verify = file_get_contents($url, false, $context);
            $captcha_success = json_decode($verify);
            if ($captcha_success->success == false) {
                return false;
            } else if ($captcha_success->success == true) {
                return true;
            }
        } else {
            return false;
        }
    }

    function get_course_by_user($user_id = "", $course_type = "")
    {
        if ($course_type != "") {
            $this->db->where('course_type', $course_type);
        }

        $this->db->group_start();
        $this->db->like('user_id', ',' . $instructor_id);
        $this->db->or_like('user_id', $instructor_id . ',');
        $this->db->or_where('creator', $instructor_id);
        $this->db->group_end();

        return $this->db->get('course');
    }

    public function multi_instructor_course_ids_for_an_instructor($instructor_id)
    {
        $course_ids = array();

        $this->db->like('user_id', ',' . $instructor_id);
        $this->db->or_like('user_id', $instructor_id . ',');
        $this->db->or_where('creator', $instructor_id);
        $courses = $this->db->get('course')->result_array();

        foreach ($courses as $key => $course) {
            $course_ids[] = $course['id'];
        }
        return $course_ids;
    }

    /** COUPONS FUNCTIONS */
    public function get_coupons($id = null)
    {
        if ($id > 0) {
            $this->db->where('id', $id);
        }
        return $this->db->get('coupons');
    }

    public function get_coupon_details_by_code($code)
    {
        $this->db->where('code', $code);
        return $this->db->get('coupons');
    }

    public function add_coupon()
    {
        if (isset($_POST['code']) && !empty($_POST['code']) && isset($_POST['discount_percentage']) && !empty($_POST['discount_percentage']) && isset($_POST['expiry_date']) && !empty($_POST['expiry_date'])) {
            $data['code'] = $this->input->post('code');
            $data['discount_percentage'] = $this->input->post('discount_percentage') > 0 ? $this->input->post('discount_percentage') : 0;
            $data['expiry_date'] = strtotime($this->input->post('expiry_date'));
            $data['created_at'] = strtotime(date('D, d-M-Y'));

            $availability = $this->db->get_where('coupons', ['code' => $data['code']])->num_rows();
            if ($availability) {
                return false;
            } else {
                $this->db->insert('coupons', $data);
                return true;
            }
        } else {
            return false;
        }
    }
    public function edit_coupon($coupon_id)
    {
        if (isset($_POST['code']) && !empty($_POST['code']) && isset($_POST['discount_percentage']) && !empty($_POST['discount_percentage']) && isset($_POST['expiry_date']) && !empty($_POST['expiry_date'])) {
            $data['code'] = $this->input->post('code');
            $data['discount_percentage'] = $this->input->post('discount_percentage') > 0 ? $this->input->post('discount_percentage') : 0;
            $data['expiry_date'] = strtotime($this->input->post('expiry_date'));
            $data['created_at'] = strtotime(date('D, d-M-Y'));

            $this->db->where('id !=', $coupon_id);
            $this->db->where('code', $data['code']);
            $availability = $this->db->get('coupons')->num_rows();
            if ($availability) {
                return false;
            } else {
                $this->db->where('id', $coupon_id);
                $this->db->update('coupons', $data);
                return true;
            }
        } else {
            return false;
        }
    }

    public function delete_coupon($coupon_id)
    {
        $this->db->where('id', $coupon_id);
        $this->db->delete('coupons');
        return true;
    }

    // CHECK IF THE COUPON CODE IS VALID
    public function check_coupon_validity($coupon_code)
    {
        $this->db->where('code', $coupon_code);
        $result = $this->db->get('coupons');
        if ($result->num_rows() > 0) {
            $result = $result->row_array();
            if ($result['expiry_date'] >= strtotime(date('D, d-M-Y'))) {
                return true;
            } else {
                return false;
            }
        } else {
            return false;
        }
    }

    // GET DISCOUNTED PRICE AFTER APPLYING COUPON
    public function get_discounted_price_after_applying_coupon($coupon_code)
    {
        $total_price  = 0;
        foreach ($this->session->userdata('cart_items') as $cart_item) {
            $course_details = $this->crud_model->get_course_by_id($cart_item)->row_array();
            if ($course_details['discount_flag'] == 1) {
                $total_price += $course_details['discounted_price'];
            } else {
                $total_price  += $course_details['price'];
            }
        }

        if ($this->check_coupon_validity($coupon_code)) {
            $coupon_details = $this->get_coupon_details_by_code($coupon_code)->row_array();
            $discounted_price = ($total_price * $coupon_details['discount_percentage']) / 100;
            $total_price = $total_price - $discounted_price;
        } else {
            return $total_price;
        }

        return $total_price > 0 ? $total_price : 0;
    }

    function get_free_lessons($lesson_id = "")
    {
        if ($lesson_id != "") {
            $this->db->where('id', $lesson_id);
        }
        $this->db->where('is_free', 1);
        return $this->db->get('lesson');
    }

    function get_watch_histories($user_id = 0, $course_id = 0)
    {
        if ($user_id > 0) {
            $this->db->where('student_id', $user_id);
        }
        if ($course_id > 0) {
            $this->db->where('course_id', $course_id);
        }
        return $this->db->get('watch_histories');
    }

    function update_last_played_lesson($course_id = "", $lesson_id = "")
    {
        $user_id = $this->session->userdata('user_id');
        $query = $this->db->get_where('watch_histories', array('course_id' => $course_id, 'student_id' => $user_id));

        if ($course_id != "") {
            if ($query->num_rows() > 0) {
                $this->db->where('watch_history_id', $query->row('watch_history_id'));
                $this->db->update('watch_histories', array('watching_lesson_id' => $lesson_id, 'date_updated' => time()));
            } else {
                if ($lesson_id == "") {
                    $this->db->where('course_id', $course_id);
                    $this->db->order_by('order', 'asc');
                    $this->db->order_by('id', 'asc');
                    $this->db->limit(1);
                    $lesson_id = $this->db->get('lesson')->row('id');
                }
                if ($lesson_id > 0) :
                    $data['course_id'] = $course_id;
                    $data['student_id'] = $user_id;
                    $data['watching_lesson_id'] = $lesson_id;
                    $data['date_added'] = time();
                    $this->db->insert('watch_histories', $data);
                endif;
            }
            return $lesson_id;
        } elseif ($query->num_rows() > 0) {
            return $query->row('watching_lesson_id');
        }
    }

    function update_watch_history_with_duration()
    {
        $user_id = $this->session->userdata('user_id');
        $course_progress = 0;
        $is_completed = 0;
        $data['watched_course_id'] = htmlspecialchars_($this->input->post('course_id'));
        $data['watched_lesson_id'] = htmlspecialchars_($this->input->post('lesson_id'));
        $data['watched_student_id'] = $user_id;

        $current_duration = htmlspecialchars_($this->input->post('current_duration'));

        $current_history = $this->db->get_where('watched_duration', $data);
        $course_details = $this->db->get_where('course', ['id' => $data['watched_course_id']])->row_array();


        if ($current_history->num_rows() > 0) {
            $current_history = $current_history->row_array();
            $watched_duration_arr = json_decode($current_history['watched_counter'], true);
            if (!is_array($watched_duration_arr)) $watched_duration_arr = array();
            if (!in_array($current_duration, $watched_duration_arr)) {
                array_push($watched_duration_arr, $current_duration);
            }

            $watched_duration_json = json_encode($watched_duration_arr);

            $this->db->where('watched_course_id', $data['watched_course_id']);
            $this->db->where('watched_lesson_id', $data['watched_lesson_id']);
            $this->db->where('watched_student_id', $data['watched_student_id']);
            $this->db->update('watched_duration', array('watched_counter' => $watched_duration_json, 'current_duration' => $current_duration));
        } else {
            $watched_duration_arr = array($current_duration);
            $data['current_duration'] = $current_duration;
            $data['watched_counter'] = json_encode($watched_duration_arr);
            $this->db->insert('watched_duration', $data);
        }

        if ($course_details['enable_drip_content'] != true) {
            return json_encode(array('lesson_id' => $data['watched_lesson_id'], 'course_progress' => null, 'is_completed' => null));
        }


        $drip_content_settings = json_decode(get_settings('drip_content_settings'), true);
        $lesson_total_duration = $this->db->get_where('lesson', array('id' => $data['watched_lesson_id']))->row('duration');
        $lesson_total_duration = explode(':', $lesson_total_duration);
        $lesson_total_seconds = ($lesson_total_duration[0] * 3600) + ($lesson_total_duration[1] * 60) + $lesson_total_duration[2];
        $current_total_seconds = count($watched_duration_arr) * 5;

        if ($drip_content_settings['lesson_completion_role'] == 'duration') {
            if ($current_total_seconds >= $drip_content_settings['minimum_duration']) {
                $is_completed = 1;
            } elseif (($current_total_seconds + 4) >= $lesson_total_seconds) {
                $is_completed = 1;
            }
        } else {
            $required_duration = ($lesson_total_seconds / 100) * $drip_content_settings['minimum_percentage'];
            if ($current_total_seconds >= $required_duration) {
                $is_completed = 1;
            } elseif (($current_total_seconds + 4) >= $lesson_total_seconds) {
                $is_completed = 1;
            }
        }

        if ($is_completed == 1) {
            $query = $this->db->get_where('watch_histories', array('course_id' => $data['watched_course_id'], 'student_id' => $data['watched_student_id']));
            $course_progress = $query->row('course_progress');

            if ($query->num_rows() > 0) {
                $lesson_ids = json_decode($query->row('completed_lesson'), true);
                if (!is_array($lesson_ids)) $lesson_ids = array();
                if (!in_array($data['watched_lesson_id'], $lesson_ids)) {
                    array_push($lesson_ids, $data['watched_lesson_id']);
                    $total_lesson = $this->db->get_where('lesson', array('course_id' => $data['watched_course_id']))->num_rows();
                    $course_progress = (100 / $total_lesson) * count($lesson_ids);

                    if ($course_progress >= 100 && $query->row('completed_date') == null) {
                        $this->email_model->course_completion($user_id, $course_details['id']);
                        $completed_date = time();
                    } else {
                        $completed_date = $query->row('completed_date');
                    }

                    $this->db->where('watch_history_id', $query->row('watch_history_id'));
                    $this->db->update('watch_histories', array('course_progress' => $course_progress, 'completed_lesson' => json_encode($lesson_ids), 'completed_date' => $completed_date, 'date_updated' => time()));

                    // CHECK IF THE USER IS ELIGIBLE FOR CERTIFICATE
                    if (addon_status('certificate') && $course_progress >= 100) {
                        $this->load->model('addons/Certificate_model', 'certificate_model');
                        $this->certificate_model->check_certificate_eligibility($data['watched_course_id'], $data['watched_student_id']);
                    }
                }
            }
        }
        return json_encode(array('lesson_id' => $data['watched_lesson_id'], 'course_progress' => round($course_progress), 'is_completed' => $is_completed));
    }

    function get_top_instructor($limit = 10)
    {
        $query = $this->db
            ->select("creator, count(*) AS enrol_number", false)
            ->from("enrol")
            ->join('course', 'course.id = enrol.course_id')
            ->group_by('creator')
            ->order_by("creator", "DESC")
            ->limit($limit)
            ->get();
        return $query->result_array();
    }

    function get_active_course_by_category_id($category_id = "", $category_id_type = "category_id")
    {
        $this->db->where($category_id_type, $category_id);
        $this->db->where('status', 'active');
        return $this->db->get('course');
    }

    function get_active_course($course_id = "")
    {

        if ($course_id > 0) {
            $this->db->where('id', $course_id = "");
        }
        $this->db->where('status', 'active');
        return $this->db->get('course');
    }


    function forgot_password()
    {
        $email = $this->input->post('email');

        $solid_email = str_replace('@', '__', $email);
        $verification_code = str_replace('=', '', base64_encode($solid_email . '--' . rand(1111, 9999)));
        $this->db->where('email', $email);
        $this->db->update('users', array('verification_code' => $verification_code, 'last_modified' => time()));
        // send new password to user email
        $this->email_model->password_reset_email($verification_code, $email);
        $this->session->set_flashdata('flash_message', get_phrase('check_your_inbox_for_the_request'));
    }

    function change_password_from_forgot_passord($verification_code = "")
    {
        $decoded_verification_code = explode('--', base64_decode($verification_code));
        $solid_email = $decoded_verification_code[0];

        $new_verification_code = str_replace('=', '', base64_encode($solid_email . '--' . rand(1111, 9999)));

        $email = str_replace('__', '@', $solid_email);

        $this->db->where('email', $email);
        $this->db->where('verification_code', $verification_code);
        $this->db->update('users', array('password' => sha1($this->input->post('new_password')), 'verification_code' => $new_verification_code));
        return true;
    }




    //Start Blog

    function add_blog_category()
    {
        $data['title'] = htmlspecialchars_($this->input->post('title'));
        $data['subtitle'] = htmlspecialchars_($this->input->post('subtitle'));
        $data['slug'] = slugify($data['title']);
        $data['added_date'] = time();

        $this->db->where('slug', $data['slug']);
        $row = $this->db->get('blog_category');
        if ($row->num_rows() > 0) {
            return false;
        } else {
            $this->db->insert('blog_category', $data);
            return true;
        }
    }

    function update_blog_category($blog_category_id = "")
    {
        $data['title'] = htmlspecialchars_($this->input->post('title'));
        $data['subtitle'] = htmlspecialchars_($this->input->post('subtitle'));
        $data['slug'] = slugify($data['title']);

        $this->db->where('slug', $data['slug']);
        $row = $this->db->get('blog_category');
        if ($row->num_rows() > 0 && $row->row('blog_category_id') != $blog_category_id) {
            return false;
        } else {
            $this->db->where('blog_category_id', $blog_category_id);
            $this->db->update('blog_category', $data);
            return true;
        }
    }

    function delete_blog_category($blog_category_id = "")
    {
        $this->db->where('blog_category_id', $blog_category_id);
        $this->db->delete('blog_category');
    }

    function get_blog_categories($blog_category_id = "")
    {
        if ($blog_category_id > 0) {
            $this->db->where('blog_category_id', $blog_category_id);
        }
        return $this->db->get('blog_category');
    }

    function get_blog_category_by_slug($ctaegory_slug = "")
    {
        $this->db->where('slug', $ctaegory_slug);
        return $this->db->get('blog_category');
    }

    function get_all_blogs($blog_id = "")
    {
        if ($blog_id > 0) {
            $this->db->where('blog_id', $blog_id);
        }
        $this->db->order_by('blog_id', 'desc');
        return $this->db->get('blogs');
    }

    function get_blogs($blog_id = "")
    {
        if ($blog_id > 0) {
            $this->db->where('blog_id', $blog_id);
        }
        $this->db->where('status !=', 'pending');
        $this->db->order_by('blog_id', 'desc');
        return $this->db->get('blogs');
    }

    function get_active_blogs($blog_id = "")
    {
        if ($blog_id > 0) {
            $this->db->where('blog_id', $blog_id);
        }
        $this->db->where('status', 1);
        return $this->db->get('blogs');
    }

    function get_instructors_pending_blog($user_id = "")
    {
        if ($user_id > 0) {
            $this->db->where('user_id', $user_id);
        }
        $this->db->where('status', 'pending');
        return $this->db->get('blogs');
    }

    function get_popular_blogs($limit = 10)
    {
        $this->db->order_by("blog_id", "desc");
        $this->db->limit($limit);
        $this->db->where('status', 1);
        $this->db->where('is_popular', 1);
        return $this->db->get('blogs');
    }

    function get_latest_blogs($limit = 10)
    {
        $this->db->order_by("blog_id", "desc");
        $this->db->limit($limit);
        $this->db->where('status', 1);
        return $this->db->get('blogs');
    }

    function get_blogs_by_category_id($blog_category_id = "")
    {
        $this->db->where('blog_category_id', $blog_category_id);
        $this->db->where('status', 1);
        return $this->db->get('blogs');
    }

    function get_blogs_by_user_id($user_id = "", $status = "")
    {
        $this->db->where('user_id', $user_id);
        if ($status == '') {
            $this->db->where('status !=', 'pending');
        } else {
            $this->db->where('status', $status);
        }
        return $this->db->get('blogs');
    }

    function get_categories_with_blog_number($limit = 10)
    {
        $query = $this->db
            ->select("blog_category_id, count(*) AS blog_number", false)
            ->from("blogs")
            ->group_by('blog_category_id')
            ->order_by("blog_number", "DESC")
            ->where('status', 1)
            ->limit($limit)
            ->get();
        return $query->result_array();
    }

    function get_blog_comments_by_blog_id($blog_id = "")
    {
        $this->db->where('parent_id <', 1);
        $this->db->where('blog_id', $blog_id);
        $this->db->order_by('added_date', 'desc');
        return $this->db->get('blog_comments');
    }

    function get_blog_comments_by_parent_id($parent_id = "")
    {
        $this->db->where('parent_id', $parent_id);
        $this->db->order_by('added_date', 'asc');
        return $this->db->get('blog_comments');
    }

    function add_blog_comment($blog_id = "", $user_id = "")
    {
        $data['comment'] = htmlspecialchars_($this->input->post('comment'));
        $data['parent_id'] = $this->input->post('parent_id');
        $data['added_date'] = time();
        $data['blog_id'] = $blog_id;
        $data['user_id'] = $user_id;
        $this->db->insert('blog_comments', $data);
    }

    function update_blog_comment($blog_comment_id = "", $user_id = "")
    {
        $data['comment'] = htmlspecialchars_($this->input->post('comment'));
        $data['updated_date'] = time();

        if (!$this->session->userdata('admin_login')) {
            $this->db->where('user_id', $user_id);
        }
        $this->db->where('blog_comment_id', $blog_comment_id);
        $this->db->update('blog_comments', $data);
    }
    function delete_comment($blog_comment_id = "", $user_id = "")
    {
        if (!$this->session->userdata('admin_login')) {
            $this->db->where('user_id', $user_id);
        }
        $this->db->where('blog_comment_id', $blog_comment_id);
        $this->db->delete('blog_comments');
    }

    //Start for admin panel
    function add_blog()
    {
        $data['title'] = htmlspecialchars_($this->input->post('title'));
        $data['blog_category_id'] = htmlspecialchars_($this->input->post('blog_category_id'));
        $data['keywords'] = htmlspecialchars_($this->input->post('keywords'));
        $data['description'] = htmlspecialchars_(remove_js($this->input->post('description', false)));
        $data['added_date'] = time();
        $data['user_id'] = $this->session->userdata('user_id');

        if ($this->session->userdata('admin_login')) {
            $data['is_popular'] = htmlspecialchars_($this->input->post('is_popular'));
            $data['status'] = 1;
        } else {
            $data['status'] = 'pending';
            $data['is_popular'] = 0;
        }

        if ($_FILES['thumbnail']['name'] != "") {
            $data['thumbnail'] = md5(rand(10000000, 20000000)) . '.png';
            move_uploaded_file($_FILES['thumbnail']['tmp_name'], 'uploads/blog/thumbnail/' . $data['thumbnail']);
        }
        if ($_FILES['banner']['name'] != "") {
            $data['banner'] = md5(rand(10000000, 20000000)) . '.png';
            move_uploaded_file($_FILES['banner']['tmp_name'], 'uploads/blog/banner/' . $data['banner']);
        }

        $this->db->insert('blogs', $data);
    }

    function update_blog($blog_id = "")
    {
        $blog = $this->get_blogs($blog_id)->row_array();

        $data['title'] = htmlspecialchars_($this->input->post('title'));
        $data['blog_category_id'] = htmlspecialchars_($this->input->post('blog_category_id'));
        $data['keywords'] = htmlspecialchars_($this->input->post('keywords'));
        $data['description'] = htmlspecialchars_(remove_js($this->input->post('description', false)));
        $data['updated_date'] = time();

        if ($this->session->userdata('admin_login')) {
            $data['is_popular'] = htmlspecialchars_($this->input->post('is_popular'));
        }

        if ($_FILES['thumbnail']['name'] != "") {
            unlink('uploads/blog/thumbnail/' . $blog['thumbnail']);

            $data['thumbnail'] = md5(rand(10000000, 20000000)) . '.png';
            move_uploaded_file($_FILES['thumbnail']['tmp_name'], 'uploads/blog/thumbnail/' . $data['thumbnail']);
        }
        if ($_FILES['banner']['name'] != "") {
            unlink('uploads/blog/banner/' . $blog['banner']);

            $data['banner'] = md5(rand(10000000, 20000000)) . '.png';
            move_uploaded_file($_FILES['banner']['tmp_name'], 'uploads/blog/banner/' . $data['banner']);
        }

        $this->db->where('blog_id', $blog_id);
        $this->db->update('blogs', $data);
    }

    function update_blog_status($blog_id = "")
    {
        $current_status = $this->get_blogs($blog_id)->row('status');
        if ($current_status == 1) :
            $this->db->where('blog_id', $blog_id);
            $this->db->update('blogs', array('status' => 0));
        else :
            $this->db->where('blog_id', $blog_id);
            $this->db->update('blogs', array('status' => 1));
        endif;
    }

    function approve_blog($blog_id = "")
    {
        $this->db->where('blog_id', $blog_id);
        $this->db->update('blogs', array('status' => 1));
    }

    function blog_delete($blog_id = "")
    {
        $blog = $this->get_blogs()->row_array();
        unlink('uploads/blog/banner/' . $blog['banner']);
        unlink('uploads/blog/thumbnail/' . $blog['thumbnail']);

        $this->db->where('blog_id', $blog_id);
        $this->db->delete('blogs');

        $this->db->where('blog_id', $blog_id);
        $this->db->delete('blog_comments');
    }

    function update_blog_settings()
    {
        $data['value'] = htmlspecialchars_($this->input->post('blog_page_title'));
        $this->db->where('key', 'blog_page_title');
        $this->db->update('frontend_settings', $data);

        $data['value'] = htmlspecialchars_($this->input->post('blog_page_subtitle'));
        $this->db->where('key', 'blog_page_subtitle');
        $this->db->update('frontend_settings', $data);

        $data['value'] = htmlspecialchars_($this->input->post('instructors_blog_permission'));
        $this->db->where('key', 'instructors_blog_permission');
        $this->db->update('frontend_settings', $data);

        $data['value'] = htmlspecialchars_($this->input->post('blog_visibility_on_the_home_page'));
        $this->db->where('key', 'blog_visibility_on_the_home_page');
        $this->db->update('frontend_settings', $data);

        if ($_FILES['blog_page_banner']['name'] != "") {
            unlink('uploads/blog/page-banner/' . get_frontend_settings('blog_page_banner'));

            $data['value'] = md5(rand(10000000, 20000000)) . '.png';
            $this->db->where('key', 'blog_page_banner');
            $this->db->update('frontend_settings', $data);

            move_uploaded_file($_FILES['blog_page_banner']['tmp_name'], 'uploads/blog/page-banner/' . $data['value']);
        }
    }
    //End Blog


    function get_quiz_score($course_id = "", $quiz_id = "")
    {
        $this->db->where('student_id', $this->session->userdata('user_id'));
        $this->db->where('course_id', $course_id);
        $query = $this->db->get('watch_histories');

        if ($query->num_rows() > 0) {
            $previous_result = json_decode($query->row('quiz_result'), true);
            if ($quiz_id > 0) {
                if (is_array($previous_result) && array_key_exists($quiz_id, $previous_result)) {
                    return $previous_result[$quiz_id];
                } else {
                    return 'no_result';
                }
            } else {
                if (is_array($previous_result) && count($previous_result) > 0) {
                    return array_sum($previous_result);
                } else {
                    return 'no_result';
                }
            }
        } else {
            return 'no_result';
        }
    }


    function save_drip_content_settings()
    {
        $settings_data['lesson_completion_role'] = htmlspecialchars_($this->input->post('lesson_completion_role'));
        $time = htmlspecialchars_($this->input->post('minimum_duration'));
        $time = explode(':', $time);
        $seconds = ($time[0] * 3600) + ($time[1] * 60) + $time[2];
        $settings_data['minimum_duration'] = $seconds;
        $settings_data['minimum_percentage'] = htmlspecialchars_($this->input->post('minimum_percentage'));
        $settings_data['locked_lesson_message'] = htmlspecialchars_($this->input->post('locked_lesson_message', false));

        $data['value'] = json_encode($settings_data);

        $this->db->where('key', 'drip_content_settings');
        $this->db->update('settings', $data);
    }

    function get_custom_pages($custom_page_id = '', $button_position = "")
    {
        if ($custom_page_id > 0) {
            $this->db->where('custom_page_id', $custom_page_id);
        }

        if ($button_position != "") {
            $this->db->where('button_position', $button_position);
        }
        return $this->db->get('custom_page');
    }

    function add_custom_page()
    {
        $data['page_title'] = htmlspecialchars_($this->input->post('page_title'));
        $data['page_content'] = htmlspecialchars_($this->input->post('page_content', false));
        $data['page_url'] = slugify($this->input->post('page_url'));
        $data['button_title'] = htmlspecialchars_($this->input->post('button_title'));
        $data['button_position'] = htmlspecialchars_($this->input->post('button_position'));
        $data['status'] = 1;

        $this->db->insert('custom_page', $data);
    }

    function update_custom_page($custom_page_id = "")
    {
        $data['page_title'] = htmlspecialchars_($this->input->post('page_title'));
        $data['page_content'] = htmlspecialchars_($this->input->post('page_content', false));
        $data['page_url'] = slugify($this->input->post('page_url'));
        $data['button_title'] = htmlspecialchars_($this->input->post('button_title'));
        $data['button_position'] = htmlspecialchars_($this->input->post('button_position'));

        $this->db->where('custom_page_id', $custom_page_id);
        $this->db->update('custom_page', $data);
    }

    function delete_custom_page($custom_page_id = "")
    {
        $this->db->where('custom_page_id', $custom_page_id);
        $this->db->delete('custom_page');
    }

    function is_course_instructor($course_id = "", $user_id = "0")
    {
        $course_details = $this->get_course_by_id($course_id)->row_array();

        if ($course_details['creator'] == $user_id) {
            return true;
        } else {
            $user_ids = explode(',', $course_details['user_id']);
            if (in_array($user_id, $user_ids)) {
                return true;
            } else {
                return false;
            }
        }

        return false;
    }


    //Notification start
    function get_notifications($id = "", $status = null)
    {
        if ($id > 0) {
            $this->db->where('id', $id);
        }
        if ($status !== null) {
            $this->db->where('status', $status);
        }
        $this->db->order_by('status ASC, id desc');
        return $this->db->get('notifications');
    }

    function my_notifications($user_id = "", $status = null)
    {
        if ($user_id == '') {
            $user_id = $this->session->userdata('user_id');
        }
        $this->db->where('to_user', $user_id);

        if ($status !== null) {
            $this->db->where('status', $status);
        }
        $this->db->order_by('status ASC, id desc');
        return $this->db->get('notifications');
    }

    function notification_enable_diable()
    {
        $id = $this->input->post('id');
        $user_type = $this->input->post('user_type');
        $notification_type = $this->input->post('notification_type');
        $input_val = $this->input->post('input_val');

        $notification_setting_row = $this->db->where('id', $id)->get('notification_settings')->row_array();

        if ($notification_type == 'system') {
            $json_to_arr = json_decode($notification_setting_row['system_notification'], true);
            $json_to_arr[$user_type] = $input_val;
            $data['system_notification'] = json_encode($json_to_arr);
        }

        if ($notification_type == 'email') {
            $json_to_arr = json_decode($notification_setting_row['email_notification'], true);
            $json_to_arr[$user_type] = $input_val;
            $data['email_notification'] = json_encode($json_to_arr);
        }

        $data['date_updated'] = time();

        if ($notification_setting_row['is_editable'] == 1) {
            $this->db->where('id', $id)->update('notification_settings', $data);

            if ($input_val == 1) {
                echo get_phrase('Successfully enabled');
            } else {
                echo get_phrase('Successfully disabled');
            }
        }
    }
    // function notification_settings(){
    //     $settings = json_decode(get_frontend_settings('notification'), true);

    //     foreach($settings as $identifier => $values):
    //         if(array_key_exists($identifier, $_POST) && array_key_exists('system_notify', $_POST[$identifier])){
    //             $system_notify = 1;
    //         }else{
    //             $system_notify = 0;
    //         }

    //         if(array_key_exists($identifier, $_POST) && array_key_exists('email_notify', $_POST[$identifier])){
    //             $email_notify = 1;
    //         }else{
    //             $email_notify = 0;
    //         }

    //         $settings[$identifier]['system_notify'] = $system_notify;
    //         $settings[$identifier]['email_notify'] = $email_notify;
    //     endforeach;

    //     $data['value'] = json_encode($settings);
    //     $this->db->where('key', 'notification')->update('frontend_settings', $data);
    // }
    //End notification


    //Start newsletter
    function add_newsletter()
    {
        $data['subject'] = $this->input->post('subject');
        $data['description'] = $this->input->post('description');
        $data['created_at'] = time();

        $this->db->insert('newsletters', $data);
    }

    function update_newsletter($id)
    {
        $data['subject'] = $this->input->post('subject');
        $data['description'] = $this->input->post('description', false);
        $data['updated_at'] = time();

        $this->db->where('id', $id);
        $this->db->update('newsletters', $data);
    }

    function delete_newsletter($id)
    {
        $this->db->where('id', $id);
        $this->db->delete('newsletters');
    }
    //End newsletter

    function update_website_faq()
    {
        $faqs = array();
        foreach (array_filter($this->input->post('questions')) as $key => $question) {
            $faqs[$key]['question'] = $question;
            $faqs[$key]['answer'] = $this->input->post('answers')[$key];
        }

        $data['value'] = json_encode($faqs);
        $this->db->where('key', 'website_faqs')->update('frontend_settings', $data);
    }

    function update_motivational_speech()
    {
        $motivations = array();
        $images = array();
        foreach (array_filter($this->input->post('titles')) as $key => $title) {
            $motivations[$key]['title'] = $title;
            $motivations[$key]['description'] = $this->input->post('descriptions')[$key];

            if ($_FILES['images']['name'][$key] != "") {
                $image_name = random(20) . '.png';
                move_uploaded_file($_FILES['images']['tmp_name'][$key], 'uploads/system/motivations/' . $image_name);
                $motivations[$key]['image'] = $image_name;
            } else {
                $motivations[$key]['image'] = $this->input->post('previous_images')[$key];
            }
            $images[$key] = $motivations[$key]['image'];
        }

        $files = glob('uploads/system/motivations/' . '*');
        foreach ($files as $file) {
            $file_name_arr = explode('/', $file);
            $file_name = end($file_name_arr);
            if (!in_array($file_name, $images)) {
                unlink($file);
            }
        }

        $data['value'] = json_encode($motivations);
        $this->db->where('key', 'motivational_speech')->update('frontend_settings', $data);
    }

    function get_related_courses($parent_category = "", $child_category = "", $current_course_id = "", $limit = "10")
    {
        $scorm_status = addon_status('scorm_course');
        $h5p_status = addon_status('h5p');

        $this->db->group_start();
        $this->db->where('id !=', $current_course_id);
        $this->db->group_end();

        $this->db->group_start();
        if ($parent_category != "") {
            $this->db->where('category_id', $parent_category);
        }
        if ($child_category != "") {
            $this->db->or_where('sub_category_id', $child_category);
        }
        $this->db->group_end();

        $this->db->group_start();
        $this->db->where('course_type', 'general');
        if ($scorm_status) {
            $this->db->or_where('course_type', 'scorm');
        }
        if ($h5p_status) {
            $this->db->or_where('course_type', 'h5p');
        }
        $this->db->group_end();

        $this->db->group_start();
        $this->db->where('status', 'active');
        $this->db->group_end();

        $this->db->limit($limit);
        return $this->db->get('course');
    }

    function get_pepople_ratings($limit = 10)
    {
        $this->db->where('rating', 5);
        $this->db->order_by('id', 'desc');
        $this->db->limit($limit);
        return $this->db->get('rating');
    }

    function course_page_accessibility($course_id = "", $user_id = "")
    {
        if ($course_id == "") {
            return false;
        }

        if ($user_id == "") {
            $user_id = $this->session->userdata('user_id');
        }

        $row = $this->get_course_by_id($course_id);
        if ($row->num_rows() > 0) {
            $course_details = $row->row_array();
            $course_instructors = explode(',', $course_details['user_id']);

            if (in_array($user_id, $course_instructors)) {
                return true;
            } elseif (enroll_status($course_id) == 'valid') {
                return true;
            }
        }

        return false;
    }

    function get_course_instructors_id($course_id = "")
    {
        $row = $this->get_course_by_id($course_id);
        if ($row->num_rows() > 0) {
            $instructors_arr = explode(',', $row->row('user_id'));
            return array_filter($instructors_arr);
        } else {
            return array();
        }
    }

    public function get_courses_by_instructor_id($instructor_id = 0, $status = "")
    {
        $this->db->group_start();
        $this->db->like('user_id', ',' . $instructor_id);
        $this->db->or_like('user_id', $instructor_id . ',');
        $this->db->or_where('creator', $instructor_id);
        $this->db->group_end();

        if ($status != "") {
            $this->db->group_start();
            $this->db->where('status', $status);
            $this->db->group_end();
        }

        return $this->db->get('course');
    }

    function update_contact_info()
    {
        $data['email'] = $this->input->post('email');
        $data['phone'] = $this->input->post('phone');
        $data['address'] = $this->input->post('address');
        $data['office_hours'] = $this->input->post('office_hours');
        $contact_information = json_encode($data);

        $row = $this->db->where('key', 'contact_info')->get('frontend_settings');
        if ($row->num_rows() > 0) {
            $this->db->where('key', 'contact_info')->update('frontend_settings', ['value' => $contact_information]);
        } else {
            $this->db->insert('frontend_settings', ['key' => 'contact_info', 'value' => $contact_information]);
        }
    }

    function update_custom_codes()
    {
        $custom_css = $this->input->post('custom_css');
        $embed_code = $this->input->post('embed_code', false);

        $row = $this->db->where('key', 'custom_css')->get('frontend_settings');
        if ($row->num_rows() > 0) {
            $this->db->where('key', 'custom_css')->update('frontend_settings', ['value' => $custom_css]);
        } else {
            $this->db->insert('frontend_settings', ['key' => 'custom_css', 'value' => $custom_css]);
        }

        $row = $this->db->where('key', 'embed_code')->get('frontend_settings');
        if ($row->num_rows() > 0) {
            $this->db->where('key', 'embed_code')->update('frontend_settings', ['value' => $embed_code]);
        } else {
            $this->db->insert('frontend_settings', ['key' => 'embed_code', 'value' => $embed_code]);
        }
    }

    function update_home_page_settings($key = "")
    {
        $row = $this->db->where('key', $key)->get('frontend_settings');
        if ($row->num_rows() > 0) {
            if ($row->row('value') == 1) {
                $this->db->where('key', $key)->update('frontend_settings', ['value' => 0]);
                return json_encode(['success' => get_phrase($key) . ' ' . get_phrase('disabled')]);
            } else {
                $this->db->where('key', $key)->update('frontend_settings', ['value' => 1]);
                return json_encode(['success' => get_phrase($key) . ' ' . get_phrase('enabled')]);
            }
        }
        return json_encode(['error' => get_phrase('Data not found')]);
    }

    function get_contacts($id = "")
    {
        if ($id > 0) {
            $this->db->where('id', $id);
        }

        return $this->db->get('contact');
    }

    public function wasabi_file_delete($file_name, $course_id)
    {
        require_once APPPATH . 'libraries/s3-vendor/autoloader.php';

        $course = $this->db->where('id', $course_id)->get('course')->row_array();

        $bucketName = get_settings('wasabi_bucketname'); // Replace with your actual bucket name
        $objectKey = slugify($course['title']) . '/' . $file_name;

        // AWS credentials and configuration
        $credentials = [
            'key'    => get_settings('wasabi_key'),
            'secret' => get_settings('wasabi_secret_key'),
        ];
        $region = 'us-east-1'; // Replace with the appropriate AWS region
        // Wasabi endpoint for S3-compatible storage
        $endpoint = 'https://s3.wasabisys.com';
        // Create an S3 client
        $s3 = new S3Client([
            'version' => 'latest',
            'region' => $region,
            'credentials' => $credentials,
            'endpoint' => $endpoint,  // Use the correct Wasabi endpoint
        ]);
        try {
            // Delete the object
            $s3->deleteObject([
                'Bucket' => $bucketName,
                'Key' => $objectKey,
            ]);

            // echo 'Object deleted successfully.';
        } catch (AwsException $e) {
            echo 'Error deleting the object: ' . $e->getMessage();
            die;
        }
    }
    public function wasabi_storage_file_delete($file_path = "")
    {
        require_once APPPATH . 'libraries/s3-vendor/autoloader.php';

        $bucketName = get_settings('wasabi_bucketname'); // Replace with your actual bucket name

        // AWS credentials and configuration
        $credentials = [
            'key'    => get_settings('wasabi_key'),
            'secret' => get_settings('wasabi_secret_key'),
        ];
        $region = get_settings('wasabi_region'); // Replace with the appropriate AWS region
        // Wasabi endpoint for S3-compatible storage
        $endpoint = 'https://s3.wasabisys.com';
        // Create an S3 client
        $s3 = new S3Client([
            'version' => 'latest',
            'region' => $region,
            'credentials' => $credentials,
            'endpoint' => $endpoint,  // Use the correct Wasabi endpoint
        ]);
        try {
            // Delete the object
            $s3->deleteObject([
                'Bucket' => $bucketName,
                'Key' => $file_path,
            ]);

            // echo 'Object deleted successfully.';
        } catch (AwsException $e) {
        }
    }


    function assignEmailToSendList($emails = array(), $subject = "", $description = "")
    {
        $chunkSize = 100; // Adjust the chunk size as needed
        $chunks = array_chunk($emails, $chunkSize);

        foreach ($chunks as $chunk_emails) {
            $row_data = array();
            $data = array();
            foreach ($chunk_emails as $email) {
                $data['email'] = $email;
                $data['subject'] = $subject;
                $data['description'] = $description;
                $data['status'] = 'pending';
                $data['tried_times'] = 0;
                $data['created_at'] = time();
                $row_data[] = $data;
            }
            $this->db->insert_batch('newsletter_histories', $row_data);
        }

        $this->sendEmailToAssignedAddresses();
    }

    function sendEmailToAssignedAddresses()
    {

        //if multiple call received with in 5 minutes, then return
        $lastEmailSendingTime = $this->db->where('key', 'lastEmailSendingTime')->get('settings');
        if ($lastEmailSendingTime->num_rows() > 0) {
            $lastEmailSendingTime = $lastEmailSendingTime->row('value');
            if (($lastEmailSendingTime + 300) > time()) {
                return;
            } else {
                $this->db->where('key', 'lastEmailSendingTime')->update('settings', ['value' => time()]);
            }
        } else {
            $this->db->insert('settings', ['key' => 'lastEmailSendingTime', 'value' => time()]);
        }
        //if multiple call received with in 5 minutes, then return END

        $email_list = $this->db->where('status', 'pending')->limit(20)->get('newsletter_histories');
        foreach ($email_list->result_array() as $row) {
            $response = $this->email_model->send_smtp_mail($row['description'], $row['subject'], $row['email']);

            if ($response) {
                $update_data['status'] = 'sent';
                $update_data['sent_at'] = time();
                $update_data['tried_times'] = $row['tried_times'] + 1;
                $update_data['updated_at'] = time();
            } else {
                $update_data['status'] = 'faild';
                $update_data['tried_times'] = $row['tried_times'] + 1;
                $update_data['updated_at'] = time();
            }
            $this->db->where('id', $row['id'])->update('newsletter_histories', $update_data);
        }

        if ($email_list->num_rows() == 0) {
            $email_list = $this->db->where('status', 'faild')->limit(20)->get('newsletter_histories');
            foreach ($email_list->result_array() as $row) {
                $response = $this->email_model->send_smtp_mail($row['description'], $row['subject'], $row['email']);
                if ($response) {
                    $update_data['status'] = 'sent';
                    $update_data['sent_at'] = time();
                } else {
                    if ($row['tried_times'] > 10) {
                        $update_data['status'] = 'unable';
                    }
                }
                $update_data['tried_times'] = $row['tried_times'] + 1;
                $update_data['updated_at'] = time();
                $this->db->where('id', $row['id'])->update('newsletter_histories', $update_data);
            }
        }


        if ($email_list->num_rows() == 0) {
            return 'no_data_found';
        }
    }


    // BBB Function to make API calls
    function callBbbApi($endpoint, $data, $meeting_id)
    {

        $meetingInfo = $this->checkBbbMeetingExists('getMeetingInfo', $meeting_id);
        if ($meetingInfo) {
            $xml = simplexml_load_string($meetingInfo);
            $returncode = (string)$xml->returncode;

            $meeting_status = (string)$xml->running ?? '';

            if ($returncode == 'SUCCESS' && $meeting_status) {
                return $meetingInfo; // Meeting exists
            }
        }


        $secret = get_settings('bbb_setting', true)['secret'] ?? '';
        //Sanitize API URL START
        $api_url = get_settings('bbb_setting', true)['endpoint'] ?? '';
        // Parse the URL
        $parsed_url = parse_url($api_url);
        // Remove the 'api' part if it exists in the path
        $path = rtrim(str_replace('/api', '', $parsed_url['path']), '/');
        // Rebuild the URL
        $api_url = $parsed_url['scheme'] . '://' . $parsed_url['host'] . $path;
        //Sanitize API URL END

        $api_url = $api_url . "/api/$endpoint";

        $checksum = sha1($endpoint . $data . $secret);

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $api_url . '?' . $data . '&checksum=' . $checksum);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $response = curl_exec($ch);
        curl_close($ch);

        return $response;
    }

    function checkBbbMeetingExists($endpoint, $meeting_id)
    {
        $secret = get_settings('bbb_setting', true)['secret'] ?? '';
        //Sanitize API URL START
        $api_url = get_settings('bbb_setting', true)['endpoint'] ?? '';
        // Parse the URL
        $parsed_url = parse_url($api_url);
        // Remove the 'api' part if it exists in the path
        $path = rtrim(str_replace('/api', '', $parsed_url['path']), '/');
        // Rebuild the URL
        $api_url = $parsed_url['scheme'] . '://' . $parsed_url['host'] . $path;
        //Sanitize API URL END

        $api_url = $api_url . "/api/$endpoint";


        $data = http_build_query(array(
            'meetingID' => $meeting_id
        ));
        $checksum = sha1($endpoint . $data . $secret);

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $api_url . $endpoint . '?' . $data . '&checksum=' . $checksum);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $response = curl_exec($ch);
        curl_close($ch);

        return $response;
    }
}
