File "Controller.php"

Full Path: /home/trinadezambia/public_html/admin_panel/app/Http/Controllers/Controller.php
File size: 38.08 KB
MIME-type: text/x-php
Charset: utf-8

<?php

namespace App\Http\Controllers;

use App\Models\Announcement;
use App\Models\ClassGroup;
use App\Models\ClassSchool;
use App\Models\Faq;
use App\Models\Feature;
use App\Models\FeatureSection;
use App\Models\Gallery;
use App\Models\Language;
use App\Models\Package;
use App\Models\School;
use App\Models\SchoolSetting;
use App\Models\SessionYear;
use App\Models\Slider;
use App\Models\Stream;
use App\Models\Students;
use App\Models\User;
use App\Repositories\ExtraFormField\ExtraFormFieldsInterface;
use App\Repositories\Guidance\GuidanceInterface;
use App\Repositories\SystemSetting\SystemSettingInterface;
use App\Services\CachingService;
use App\Services\GeneralFunctionService;
use App\Services\ResponseService;
use App\Services\SubscriptionService;
use App\Services\UploadService;
use App\Services\FeaturesService;
use Carbon\Carbon;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\Validator;
use Str;
use Throwable;
use App\Repositories\FormField\FormFieldsInterface;
use App\Repositories\ContactInquiry\ContactInquiryInterface;


class Controller extends BaseController
{
    use AuthorizesRequests, DispatchesJobs, ValidatesRequests;

    private SystemSettingInterface $systemSettings;
    private GuidanceInterface $guidance;
    private SubscriptionService $subscriptionService;
    private CachingService $cache;
    private FormFieldsInterface $formFields;
    private ExtraFormFieldsInterface $extraFormFields;
    private ContactInquiryInterface $contactInquiry;

    public function __construct(SystemSettingInterface $systemSettings, GuidanceInterface $guidance, SubscriptionService $subscriptionService, CachingService $cache, FormFieldsInterface $formFields, ExtraFormFieldsInterface $extraFormFields, ContactInquiryInterface $contactInquiry)
    {
        $this->systemSettings = $systemSettings;
        $this->guidance = $guidance;
        $this->subscriptionService = $subscriptionService;
        $this->cache = $cache;
        $this->formFields = $formFields;
        $this->extraFormFields = $extraFormFields;
        $this->contactInquiry = $contactInquiry;
    }

    public function makeParentPassword($mobile)
    {
        return $mobile;
    }

    public function makeStudentPassword($dob)
    {
        return str_replace('-', '', date('d-m-Y', strtotime($dob)));
    }

    public function index()
    {


        $connection = DB::getDefaultConnection();
        if ($connection == 'school' && Auth::user()) {
            return redirect('/dashboard');
        }
        DB::setDefaultConnection('mysql');
        Session::forget('school_database_name');
        Session::put('school_database_name', null);

        if (Auth::user() && (Auth::user()->two_factor_enabled == 1 && Auth::user()->two_factor_expires_at)) {
            return redirect('/dashboard');
        }

        if (Auth::user()) {
            return redirect('/dashboard');
        }
        $currentDatabaseName = DB::connection()->getDatabaseName();
        // School website
        $fullDomain = $_SERVER['HTTP_HOST'];
        $fullDomain = str_replace("www.", "", $fullDomain);
        $parts = explode('.', $fullDomain);
        $subdomain = $parts[0];
        $school = '';
        $extraFields = [];
        $demoSchoolUrl = '';
        $isDemoSchool = 0;
        try {
            $demoDomain = School::where('type', 'demo')->where('status', 1)->pluck('domain')->first();

            if ($demoDomain) {
                $baseUrl = url('/');
                $baseUrlParts = parse_url($baseUrl);
                $host = $baseUrlParts['host'];
                $host = str_replace("www.", "", $host);
                $hostParts = explode('.', $host);
                $isDemoSchool = 1;

                // Check if it's a subdomain or main domain
                if (count($hostParts) < 2) {
                    $hostParts[0] = $demoDomain;
                } else {
                    array_unshift($hostParts, $demoDomain);
                }

                $newHost = implode('.', $hostParts);
                $demoSchoolUrl = $baseUrlParts['scheme'] . '://' . $newHost;

                if (!empty($baseUrlParts['port'])) {
                    $demoSchoolUrl .= ':' . $baseUrlParts['port'];
                }

                if (!empty($baseUrlParts['path'])) {
                    $demoSchoolUrl .= $baseUrlParts['path'];
                }
            }
        } catch (\Throwable $th) {
        }

        try {
            $school = School::on('mysql')->where('domain', $fullDomain)->orwhere('domain', $subdomain)->where('installed', 1)->first();
        } catch (\Throwable $th) {
        }

        if ($school) {
            // Get current subscription features
            $subscription = $this->subscriptionService->active_subscription($school->id);
            if ($subscription) {
                $features = $subscription->subscription_feature->pluck('feature.name')->toArray();
                $addons = $subscription->addons->pluck('feature.name')->toArray();
                $features = array_merge($features, $addons);
                // Check website management feature
                if (in_array('Website Management', $features)) {
                    return $this->school_website($school);
                }
            }
        }

        if ($this->isSchoolWebsiteRequest()) {
            $features = $this->cache->getFeatures();

            $settings = app(CachingService::class)->getSystemSettings();
            $schoolSettings = SchoolSetting::where('name', 'horizontal_logo')->get();

            $about_us_lists = $settings['about_us_points'] ?? 'Affordable price, Easy to manage admin panel, Data Security';
            $about_us_lists = explode(",", $about_us_lists);
            $faqs = $this->cache->getSystemFaqs();
            $featureSections = FeatureSection::with('feature_section_list')->orderBy('rank', 'ASC')->get();
            $guidances = $this->cache->getGuidances();
            $languages = $this->cache->getLanguages();

            $school = School::count();
            $allSchools = School::all();

            try {
                $student = User::role('Student')->whereHas('school', function ($q) {
                    $q->whereNull('deleted_at')->where('status', 1);
                })->count();
                $teacher = User::role('Teacher')->whereHas('school', function ($q) {
                    $q->whereNull('deleted_at')->where('status', 1);
                })->count();
            } catch (Throwable) {
                // If role does not exist in fresh installation then set the counter to 0
                $student = 0;
                $teacher = 0;
            }


            $counter = [
                'school' => $school,
                'student' => $student,
                'teacher' => $teacher,
            ];

            $packages = Package::where('status', 1)->with('package_feature.feature')->where('status', 1)->orderBy('rank', 'ASC')->get();

            $trail_package = $packages->where('is_trial', 1)->first();
            if ($trail_package) {
                $trail_package = $trail_package->id;
            }

            $extraFields = $this->cache->getSchoolExtraFields();

            //
            // try {
            //     $demoSchool = School::where('type', 'demo')->withTrashed()->first() !== null ? 1 : 0;
            // } catch (\Exception $e) {
            //     $demoSchool = 0;
            // }

            return view('home', compact('features', 'packages', 'settings', 'faqs', 'guidances', 'languages', 'schoolSettings', 'featureSections', 'about_us_lists', 'counter', 'trail_package', 'extraFields', 'demoSchoolUrl', 'allSchools', 'isDemoSchool'));
        } else {
            if ($school && $school->status == 1) {
                return redirect()->route('login')->with('error', trans("Your current subscription does not include the Website Management Feature. To continue, you'll need to: 1) Upgrade to a plan that includes this Website Management Feature, or 2) Purchase the Website Management Feature Add-On"));
            } else {
                return redirect()->to(config('app.url'));
            }
        }
        // End school website
    }

    public function school_website($school)
    {

        Config::set('database.connections.school.database', $school->database_name);
        DB::purge('school');
        DB::connection('school')->reconnect();
        DB::setDefaultConnection('school');

        $schoolSettings = $this->cache->getSchoolSettings('*', $school->id);

        $sliders = Slider::where('school_id', $school->id)->whereIn('type', [2, 3])->get();
        if (!count($sliders)) {
            $sliders = [
                url('assets/school/images/heroImg1.jpg'),
                url('assets/school/images/heroImg2.jpg'),
            ];
        }
        $faqs = Faq::where('school_id', $school->id)->get();

        $students = Students::where('school_id', $school->id)->whereHas('user', function ($q) {
            $q->where('status', 1);
        })->count();

        $classes = ClassSchool::where('school_id', $school->id)->count();
        $streams = Stream::where('school_id', $school->id)->count();

        $counters = [
            'students' => $students,
            'classes' => $classes,
            'streams' => $streams,
        ];

        $announcements = Announcement::where('school_id', $school->id)->whereHas('announcement_class', function ($q) {
            $q->where('class_subject_id', null);
        })->with('announcement_class.class_section.class.stream', 'announcement_class.class_section.section', 'announcement_class.class_section.medium', 'file')->where('session_year_id', $schoolSettings['session_year'] ?? null)->orderBy('id', 'DESC')->take(10)->get();

        $class_groups = ClassGroup::where('school_id', $school->id)->get();
        $slider_management = true;
        $features = app(FeaturesService::class)->getFeatures($school->id);
        if (!in_array('Slider Management', $features)) {
            $slider_management = false;
        }
        return view('school-website.index', compact('sliders', 'faqs', 'counters', 'announcements', 'class_groups', 'slider_management'));
    }

    public function isSchoolWebsiteRequest()
    {
        $host = request()->getHost();
        $host = str_replace('www.', '', $host);

        $appUrlHost = parse_url(env('APP_URL'), PHP_URL_HOST);
        $appUrlHost = str_replace('www.', '', $appUrlHost);

        $isLocal = in_array(request()->ip(), ['127.0.0.1', '::1']);

        // Dump to see results
        // dd([
        //     'Request Host' => $host,
        //     'App URL Host' => $appUrlHost,
        //     'Is Local' => $isLocal,
        //     'Matches' => ($host === $appUrlHost)
        // ]);

        // Check if the host is the same as the app URL host
        if ($host === $appUrlHost) {
            return true;
        };

        if ($isLocal) {
            return true;
        }

        return false;
    }



    public function contact(Request $request)
    {
        try {
            $admin_email = app(CachingService::class)->getSystemSettings('mail_username');
            $data = [
                'name' => $request->name,
                'email' => $request->email,
                'description' => $request->message,
                'admin_email' => $admin_email
            ];

            if (env('RECAPTCHA_SECRET_KEY') ?? '') {
                $validator = Validator::make(
                    $request->all(),
                    [
                        'g-recaptcha-response' => 'required',
                    ],
                    [
                        'g-recaptcha-response.required' => 'Please complete the human verification to proceed.',
                    ]
                );

                if ($validator->fails()) {
                    ResponseService::errorResponse($validator->errors()->first());
                }

                $googleCaptcha = app(GeneralFunctionService::class)->reCaptcha($request);

                if (!$googleCaptcha) {
                    ResponseService::errorResponse('reCAPTCHA verification failed. Please try again.');
                }
            }

            $this->contactInquiry->create($request->only(['name', 'email', 'message']));

            Mail::send('contact', $data, static function ($message) use ($data) {
                $message->to($data['admin_email'])->subject('Get In Touch');
            });

            ResponseService::successResponse('Message send successfully');
        } catch (Throwable $e) {
            if (Str::contains($e->getMessage(), ['Failed', 'Mail', 'Mailer', 'MailManager'])) {
                ResponseService::warningResponse("Data has been stored successfully, but the email could not be sent.");
            } else {
                ResponseService::errorResponse('Apologies for the Inconvenience: Please Try Again Later');
            }
        }
    }

    public function cron_job()
    {
        Artisan::call('schedule:run');
    }

    public function relatedDataIndex($table, $id)
    {
        $databaseName = config('database.connections.mysql.database');

        //Fetch all the tables in which current table's id used as foreign key
        $relatedTables = DB::select("SELECT TABLE_NAME,COLUMN_NAME
            FROM information_schema.KEY_COLUMN_USAGE
            WHERE REFERENCED_TABLE_NAME = ? AND TABLE_SCHEMA = ?", [$table, $databaseName]);
        $data = [];
        foreach ($relatedTables as $relatedTable) {
            $q = DB::table($relatedTable->TABLE_NAME)->where($relatedTable->TABLE_NAME . "." . $relatedTable->COLUMN_NAME, $id);
            $data[$relatedTable->TABLE_NAME] = $this->buildRelatedJoinStatement($q, $relatedTable->TABLE_NAME)->get()->toArray();
        }

        $currentDataQuery = DB::table($table);

        $currentData = $this->buildRelatedJoinStatement($currentDataQuery, $table)->first();
        return view('related-data.index', compact('data', 'currentData', 'table'));
    }

    private function buildSelectStatement($query, $table)
    {
        $select = [
            "classes" => "classes.*,CONCAT(classes.name,'(',mediums.name,')') as name,streams.name as stream_name,shifts.name as shift_name",
            "class_sections" => "class_sections.*,CONCAT(classes.name,' ',sections.name,'(',mediums.name,')') as class_section",
            "users" => "users.first_name,users.last_name",
            //            "student_subjects" => "student_subjects.*,CONCAT(users.first_name,' ',users.last_name) as student,"
        ];
        return $query->select(DB::raw($select[$table] ?? "*," . $table . ".id as id"));
    }


    private function buildRelatedJoinStatement($query, $table)
    {
        $databaseName = config('database.connections.mysql.database');
        // If all the child tables further have foreign keys than fetch that table also
        $getTableSchema = DB::select("SELECT CONSTRAINT_NAME, COLUMN_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME
            FROM information_schema.KEY_COLUMN_USAGE
            WHERE TABLE_NAME = ? AND TABLE_SCHEMA = ? AND REFERENCED_TABLE_NAME IS NOT NULL", [$table, $databaseName]);

        $tableAlias = [];
        //Build Join query for all the foreign key using the Table Schema
        foreach ($getTableSchema as $foreignKey) {
            //, 'edited_by', 'created_by', 'guardian_id'
            if ($foreignKey->REFERENCED_TABLE_NAME == $table) {
                //If Related table has foreign key of the same table then no need to add that in join to reduce the query load
                continue;
            }

            // Sometimes there will be same table is used in multiple foreign key at that time alias of the table should be different
            if (in_array($foreignKey->REFERENCED_TABLE_NAME, $tableAlias)) {
                $count = array_count_values($tableAlias)[$foreignKey->REFERENCED_TABLE_NAME] + 1;
                $currentAlias = $foreignKey->REFERENCED_TABLE_NAME . $count;
            } else {
                $currentAlias = $foreignKey->REFERENCED_TABLE_NAME;
            }
            $tableAlias[] = $foreignKey->REFERENCED_TABLE_NAME;

            if (!in_array($foreignKey->COLUMN_NAME, ['school_id', 'session_year_id'])) {
                $query->leftJoin($foreignKey->REFERENCED_TABLE_NAME . " as " . $currentAlias, $foreignKey->REFERENCED_TABLE_NAME . "." . $foreignKey->REFERENCED_COLUMN_NAME, '=', $table . "." . $foreignKey->COLUMN_NAME);
            }
        }

        return $this->buildSelectStatement($query, $table);
    }

    public function relatedDataDestroy($table, $id)
    {
        try {
            DB::table($table)->where('id', $id)->delete();
            ResponseService::successResponse("Data Deleted Permanently");
        } catch (Throwable $e) {
            ResponseService::logErrorResponse($e, "Controller -> relatedDataDestroy Method", 'cannot_delete_because_data_is_associated_with_other_data');
            ResponseService::errorResponse();
        }
    }

    public function about_us()
    {
        return view('school-website.about_us');
    }

    public function contact_us()
    {

        $status = $this->checkPageStatus('contact_us_status');

        if ($status['status'] == 0) {
            return redirect()->route('index');
        }

        return view('school-website.contact');
    }

    public function checkPageStatus($page)
    {
        $fullDomain = $_SERVER['HTTP_HOST'];
        $parts = explode('.', $fullDomain);
        $subdomain = $parts[0];

        $fullDomain = str_replace('www.', '', $fullDomain);
        $subdomain = str_replace('www.', '', $subdomain);

        $school = School::on('mysql')->where('domain', $fullDomain)->orwhere('domain', $subdomain)->first();

        Config::set('database.connections.school.database', $school->database_name);
        DB::purge('school');
        DB::connection('school')->reconnect();
        DB::setDefaultConnection('school');

        $schoolSettings = $this->cache->getSchoolSettings('*', $school->id);
        $status = '';
        if (($schoolSettings[$page] ?? 0) == 0 || ($schoolSettings[$page] ?? '') == null) {
            $status = 0;
        } else {
            $status = 1;
        }

        return [
            'school' => $school,
            'status' => $status
        ];
    }

    public function contact_form(Request $request)
    {


        $fullDomain = $_SERVER['HTTP_HOST'];
        $parts = explode('.', $fullDomain);
        $subdomain = $parts[0];

        $fullDomain = str_replace('www.', '', $fullDomain);
        $subdomain = str_replace('www.', '', $subdomain);

        $school = School::on('mysql')->where('domain', $fullDomain)->orwhere('domain', $subdomain)->first();

        // Verify google captcha
        $schoolSettings = $this->cache->getSchoolSettings('*', $school->id);
        if ($schoolSettings['SCHOOL_RECAPTCHA_SITE_KEY'] ?? '') {
            $validator = Validator::make(
                $request->all(),
                [
                    'g-recaptcha-response' => 'required',
                ],
                [
                    'g-recaptcha-response.required' => 'Please complete the human verification to proceed.',
                ]
            );
            if ($validator->fails()) {
                ResponseService::errorResponse($validator->errors()->first());
            }
            $googleCaptcha = app(GeneralFunctionService::class)->schoolreCaptcha($request, $schoolSettings);

            if (!$googleCaptcha) {
                ResponseService::errorResponse('reCAPTCHA verification failed. Please try again.');
            }
        }

        try {
            $admin_email = app(CachingService::class)->getSystemSettings('mail_username');
            $data = [
                'name' => $request->name,
                'email' => $request->email,
                'subject' => $request->subject,
                'description' => $request->message,
                'admin_email' => $admin_email,
                'school_email' => $request->school_email
            ];

            try {

                Config::set('database.connections.school.database', $school->database_name);
                DB::purge('school');
                DB::connection('school')->reconnect();
                DB::setDefaultConnection('school');

                $this->contactInquiry->create($request->only(['name', 'email', 'subject', 'message']));
            } catch (Throwable $e) {
                ResponseService::logErrorResponse($e, "Contact Form Controller -> contact_form Method");
            }

            Mail::send('contact', $data, static function ($message) use ($data) {
                $message->to($data['school_email'])->subject($data['subject']);
            });

            ResponseService::successResponse('Your message has been sent successfully. We will get back to you soon.');
        } catch (Throwable $e) {
            if (Str::contains($e->getMessage(), ['Failed', 'Mail', 'Mailer', 'MailManager'])) {
                ResponseService::warningResponse("Data has been stored successfully, but the email could not be sent.");
            } else {
                ResponseService::errorResponse('Apologies for the Inconvenience: Please Try Again Later');
            }
        }
    }

    public function photo()
    {

        $status = $this->checkPageStatus('gallery_status');

        if ($status['status'] == 0) {
            return redirect()->route('index');
        }

        return view('school-website.photo');
    }

    public function photo_file($id)
    {
        try {

            $status = $this->checkPageStatus('gallery_status');

            if ($status['status'] == 0) {
                return redirect()->route('index');
            }

            $photos = Gallery::with([
                'file' => function ($q) {
                    $q->where('type', 1);
                }
            ])->find($id);
            if ($photos) {
                return view('school-website.photo_file', compact('photos'));
            } else {
                return redirect('school/photos');
            }
        } catch (\Throwable $th) {
            return redirect('school/photos');
        }
    }

    public function video()
    {
        return view('school-website.video');
    }

    public function video_file($id)
    {
        try {
            $videos = Gallery::with([
                'file' => function ($q) {
                    $q->where('type', 2);
                }
            ])->find($id);
            if ($videos) {
                return view('school-website.video_file', compact('videos'));
            } else {
                return redirect('school/videos');
            }
        } catch (\Throwable $th) {
            return redirect('school/videos');
        }
    }

    public function terms_conditions()
    {
        return view('school-website.terms_conditions');
    }

    public function privacy_policy()
    {
        return view('school-website.privacy_policy');
    }

    public function refund_cancellation()
    {
        return view('school-website.refund_cancellation');
    }

    public function systemLinks($type = null)
    {
        if ($type) {

            $faqs = Faq::where('school_id', null)->get();
            $guidances = $this->guidance->builder()->get();
            $languages = Language::get();

            $settings = app(CachingService::class)->getSystemSettings();

            $packages = Package::where('status', 1)->with('package_feature.feature')->where('status', 1)->orderBy('rank', 'ASC')->get();

            $trail_package = $packages->where('is_trial', 1)->first();
            if ($trail_package) {
                $trail_package = $trail_package->id;
            }

            $extraFields = $this->formFields->defaultModel()->orderBy('rank')->get();

            return view('terms_conditions', compact('faqs', 'guidances', 'languages', 'settings', 'type', 'trail_package', 'extraFields'));
        }

        return redirect()->back();
    }

    public function admission()
    {
        // School website

        $status = $this->checkPageStatus('online_registration_status');

        if ($status['status'] == 0) {
            return redirect()->route('index');
        }

        $school = $status['school'];

        // $schoolId = $school->id;
        $classes = ClassSchool::with('medium', 'stream', 'shift')->where('school_id', $school->id)->get();
        if ($school) {
            $extraFields = $this->formFields->defaultModel()->where('user_type', 1)->orderBy('rank')->get();
        } else {
            $extraFields = $this->formFields->defaultModel()->orderBy('rank')->get();
        }
        return view('school-website.admission', compact('classes', 'extraFields'));
    }

    public function registerStudent(Request $request)
    {
        $status = $this->checkPageStatus('online_registration_status');

        if ($status['status'] == 0) {
            return redirect()->route('index');
        }

        $school = $status['school'];

        if ($school) {
            $extraFields = $this->formFields->defaultModel()->where('user_type', 1)->orderBy('rank')->get();
        } else {
            $extraFields = $this->formFields->defaultModel()->orderBy('rank')->get();
        }

        $request->validate([
            'first_name' => 'required',
            'last_name' => 'required',
            'mobile' => 'nullable|digits_between:6,15|regex:/^([0-9\s\-\+\(\)]*)$/',
            'image' => 'nullable|mimes:jpeg,png,jpg,svg|image|max:2048',
            'dob' => 'required',
            'class_id' => 'required|numeric',
            /*NOTE : Unique constraint is used because it's not school specific*/
            'guardian_email' => 'required|email|max:255|regex:/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/',
            'guardian_first_name' => 'required|string',
            'guardian_last_name' => 'required|string',
            'guardian_mobile' => 'required|numeric|digits_between:6,15',
            'guardian_gender' => 'required|in:male,female',
            'guardian_image' => 'nullable|mimes:jpg,jpeg,png|max:4096',
            'status' => 'nullable|in:0,1',
        ], [
            'guardian_email.regex' => 'Please enter a valid guardian email (e.g. user@example.com).',
        ]);

        $rules = [];
        $messages = [];

        foreach ($extraFields as $key => $field) {
            if ($field->is_required) {
                $rules["extra_fields.$key.data"] = 'required';

                // Type-specific rules
                switch ($field->type) {
                    case 'number':
                        $rules["extra_fields.$key.data"] .= '|numeric';
                        break;

                    case 'email':
                        $rules["extra_fields.$key.data"] .= '|email';
                        break;

                    case 'file':
                        $rules["extra_fields.$key.data"] .= '|file|mimes:jpg,png,pdf|max:2048';
                        break;
                }

                // Custom message
                $messages["extra_fields.$key.data.required"] = "{$field->name} is required.";
            }
        }

        $request->validate($rules, $messages);


        try {
            DB::beginTransaction();
            $admission_date = Carbon::now()->format('Y-m-d');
            $fullDomain = $_SERVER['HTTP_HOST'];
            $parts = explode('.', $fullDomain);
            $subdomain = $parts[0];
            // remove www
            $fullDomain = str_replace('www.', '', $fullDomain);
            $subdomain = str_replace('www.', '', $subdomain);

            $school = School::on('mysql')->where('domain', $fullDomain)->orwhere('domain', $subdomain)->first();

            Config::set('database.connections.school.database', $school->database_name);
            DB::purge('school');
            DB::connection('school')->reconnect();
            DB::setDefaultConnection('school');

            // $defaultSessionYear = SessionYear::where('school_id',$school->id)->where('default', 1)->first();
            $sessionYear = $this->cache->getDefaultSessionYear($school->id);
            $sessionYearId = $sessionYear->id;
            $get_student = Students::where('school_id', $school->id)->latest('id')->withTrashed()->pluck('id')->first();
            $admission_no = $sessionYear->name . '0' . $school->id . '0' . ($get_student + 1);

            // Verify google captcha
            $schoolSettings = $this->cache->getSchoolSettings('*', $school->id);
            if ($schoolSettings['SCHOOL_RECAPTCHA_SITE_KEY'] ?? '') {
                $validator = Validator::make(
                    $request->all(),
                    [
                        'g-recaptcha-response' => 'required',
                    ],
                    [
                        'g-recaptcha-response.required' => 'Please complete the human verification to proceed.',
                    ]
                );

                if ($validator->fails()) {
                    ResponseService::errorResponse($validator->errors()->first());
                }

                $googleCaptcha = app(GeneralFunctionService::class)->schoolreCaptcha($request, $schoolSettings);

                if (!$googleCaptcha) {
                    ResponseService::errorResponse('reCAPTCHA verification failed. Please try again.');
                }
            }

            // Get the user details from the guardian details & identify whether that user is guardian or not. if not the guardian and has some other role then show appropriate message in response
            $guardianUser = User::whereHas('roles', function ($q) {
                $q->where('name', '!=', 'Guardian');
            })->where('email', $request->guardian_email)->withTrashed()->first();
            if ($guardianUser) {
                ResponseService::errorResponse("Email ID is already taken for Other Role");
            }

            $password = $this->makeParentPassword($request->guardian_mobile);

            $parent = array(
                'first_name' => $request->guardian_first_name,
                'last_name' => $request->guardian_last_name,
                'mobile' => $request->guardian_mobile,
                'gender' => $request->guardian_gender,
                'school_id' => $school->id
            );

            //NOTE : This line will return the old values if the user is already exists
            $parentUser = User::where('email', $request->guardian_email)->first();
            if (!empty($request->guardian_image)) {
                $parent['image'] = UploadService::upload($request->guardian_image, 'guardian');
            }
            if (!empty($parentUser)) {
                if (isset($parent['image'])) {
                    if ($parentUser->getRawOriginal('image') && Storage::disk('public')->exists($parentUser->getRawOriginal('image'))) {
                        Storage::disk('public')->delete($parentUser->getRawOriginal('image'));
                    }
                }

                $parentUser->update($parent);
            } else {
                $parent['password'] = Hash::make($password);
                $parent['email'] = $request->guardian_email;
                $parentUser = User::create($parent);
                $parentUser->assignRole('Guardian');
            }
            $image = null;
            if ($request->hasFile('image')) {
                $image = UploadService::upload($request->image, 'user');
            }
            $password = $this->makeStudentPassword($request->dob);
            //Create Student User First
            $user = User::create([
                'first_name' => $request->first_name,
                'last_name' => $request->last_name,
                'email' => $admission_no,
                'mobile' => $request->mobile,
                'dob' => date('Y-m-d', strtotime($request->dob)),
                'gender' => $request->gender,
                'password' => Hash::make($password),
                'school_id' => $school->id,
                'image' => $image,
                'status' => 0,
                'current_address' => $request->current_address,
                'permanent_address' => $request->permanent_address,
                'deleted_at' => $request->status == 1 ? null : '1970-01-01 01:00:00'
            ]);
            $user->assignRole('Student');
            $student = Students::create([
                'user_id' => $user->id,
                'class_section_id' => null,
                'admission_no' => $admission_no,
                'roll_number' => null,
                'admission_date' => date('Y-m-d', strtotime($admission_date)),
                'guardian_id' => $parentUser->id,
                'session_year_id' => $sessionYearId,
                'class_id' => $request->class_id ?? null,
                'application_type' => "online",
                'application_status' => 0,
                'school_id' => $school->id,
            ]);

            $extraDetails = array();
            foreach ($request->extra_fields ?? [] as $fields) {
                $data = null;
                if (isset($fields['data'])) {
                    $data = (is_array($fields['data']) ? json_encode($fields['data'], JSON_THROW_ON_ERROR) : $fields['data']);
                }
                $extraDetails[] = array(
                    'user_id' => $user->id,
                    'form_field_id' => $fields['form_field_id'],
                    'data' => $data,
                    'school_id' => $school->id,
                );
            }
            if (!empty($extraDetails)) {
                $this->extraFormFields->createBulk($extraDetails);
            }

            DB::commit();
            ResponseService::successResponse('Student Registered successfully');
        } catch (Throwable $e) {
            DB::rollBack();
            ResponseService::logErrorResponse($e, "Student Controller -> Store method");
            ResponseService::errorResponse();
        }
    }

    public function school_db_test()
    {
        // return 1;
        // return $request;
        // Config::set('database.connections.school.database', 'eschool_saas_2_school');
        // DB::purge('school');
        // DB::connection('school')->reconnect();
        // DB::setDefaultConnection('school');
        return Auth::user();
    }

    public function emailVerify()
    {
        try {
            $user = Auth::user();



            if (!$user) {
                return redirect()->route('login')->with('error', trans('Please login to verify your email'));
            }

            DB::setDefaultConnection('mysql');
            $mainUser = User::on('mysql')->where('id', $user->id)->first();

            if (!$mainUser->hasVerifiedEmail()) {
                // Check if already verified in main MySQL database and sync


                if ($mainUser && $mainUser->email_verified_at) {
                    // Already verified in main DB - sync to school database
                    if ($user->school_id) {
                        $school = School::where('id', $user->school_id)->first();
                        if ($school) {
                            Config::set('database.connections.school.database', $school->database_name);
                            DB::purge('school');
                            DB::connection('school')->reconnect();
                            DB::setDefaultConnection('school');
                            $user->email_verified_at = $mainUser->email_verified_at;
                            $user->save();
                        }
                    }
                } else {
                    Auth::logout();
                    return redirect()->route('login');
                }

                // Rate limit verification email sending (every 2 hours)
                $now = Carbon::now();
                if ($now->diffInHours($user->updated_at) >= 2) {
                    $user->sendEmailVerificationNotification();
                    $user->touch();
                }

                // Show the verification notice view - keep user logged in
                // return view('auth.verify');
            }

            // User is verified - sync to both databases
            if ($mainUser->email_verified_at) {
                DB::setDefaultConnection('mysql');
                DB::connection('mysql')->table('users')->where('id', $user->id)->update(['email_verified_at' => $user->email_verified_at]);

                if ($user->school_id) {
                    $school = School::where('id', $user->school_id)->first();
                    if ($school) {
                        Config::set('database.connections.school.database', $school->database_name);
                        DB::purge('school');
                        DB::connection('school')->reconnect();
                        DB::setDefaultConnection('school');
                        User::on('school')->where('id', $user->id)->update(['email_verified_at' => $user->email_verified_at]);
                    }
                }
            }
            return redirect()->route('home');
        } catch (\Throwable $th) {
            Auth::logout();
            return redirect()->route('login')->with('error', trans('An error occurred Please try again later'));
        }
    }

    public function cacheFlush()
    {
        $school_database_name = Session::get('school_database_name');
        if ($school_database_name) {
            DB::setDefaultConnection('school');
            Config::set('database.connections.school.database', $school_database_name);
            DB::purge('school');
            DB::connection('school')->reconnect();
            DB::setDefaultConnection('school');
            if (Auth::user()) {
                $this->cache->removeSchoolCache(config('constants.CACHE.SCHOOL.SETTINGS'));
            }
        } else {
            DB::purge('school');
            DB::connection('mysql')->reconnect();
            DB::setDefaultConnection('mysql');

            $this->cache->removeSystemCache(config('constants.CACHE.SYSTEM.SETTINGS'));
        }

        // return DB::getDatabaseName();

        Cache::flush();
        Session::put('landing_locale', null);
        Session::save();

        return redirect()->back();
    }
}