<?php

namespace App\Http\Controllers\Admin\LMS;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Http;
use App\Models\Setting;
use App\Models\Batch;
use Carbon\Carbon;

class ZoomController extends Controller
{

    public function __construct()
    {
    }


    // public function index(Request $request)
    // {
    //     if (!$request->code) {
    //         $this->get_oauth_step_1();
    //     } else {
    //         $getToken = $this->get_oauth_step_2($request->code);

    //         if ($getToken['success']) {


    //             // $get_zoom_details = $this->create_a_zoom_meeting([
    //             //     'topic'      => 'Interview With Code-180',
    //             //     'start_time' => date('Y-m-d\TH:i:00') . 'Z',
    //             //     'agenda'     => "We are having interview with @code-180",
    //             //     'jwtToken'   => $getToken['response']['access_token'],
    //             // ]);
    //             $accessToken = $getToken['response']['access_token'];
    //             $get_zoom_details = $this->fetchZoomMeetings($accessToken);

    //             $code = $request->code;
    //             // dd($code);
    //             // $this->listMeetings($code); 

    //             // if ($get_zoom_details['success']) {
    //             //     $get_zoom_details['access_token'] = $getToken['response']['access_token'];
    //             //     return view('admin.LMS.zoom.index')->with('respond', json_encode($get_zoom_details));
    //             // } else {
    //             //     // Handle error from create_a_zoom_meeting function
    //             //     return view('admin.LMS.zoom.index')->with('respond', json_encode($get_zoom_details));
    //             // }
    //         } else {
    //             // Handle error from get_oauth_step_2 function
    //             // return view('admin.LMS.zoom.index')->with('respond', json_encode($getToken));
    //         }
    //     }
    // }


    public function generateZoomAccessToken(Request $request)
    {
        $redirectURL  = 'https://beta.teamgradding.com/LMS/zoom/generateZoomAccessToken';

        if (!$request->code) {
            $this->get_oauth_step_1($redirectURL);
        } else {
            $getToken = $this->get_oauth_step_2($request->code, $redirectURL);

            if ($getToken['success']) {
                $setting = Setting::first();

                $setting->zoom_access_token = $getToken['response']['access_token'];

                $setting->save();
                flashSuccess("Zoom AccessToken created successfully!");
                return redirect()->route('admin.batch.index');
            } else {
                flashError("Something Went Wrong!");
                return redirect()->route('admin.batch.index');
            }
        }
    }


    public function zoomMeetingList(Request $request)
    {

        $redirectURL  = 'https://beta.teamgradding.com/LMS/zoom/zoomMeetingList';

        if (!$request->code) {
            $this->get_oauth_step_1($redirectURL);
        } else {


            $getToken = $this->get_oauth_step_2($request->code, $redirectURL);

            if ($getToken['success']) {
                $accessToken = $getToken['response']['access_token'];
                $meetings = $this->getMeetings($accessToken);
                dd($meetings);

                // $get_zoom_details = $this->create_a_zoom_meeting([
                //     'topic'      => 'Interview With Code-180',
                //     'start_time' => date('Y-m-d\TH:i:00') . 'Z',
                //     'agenda'     => "We are having interview with @code-180",
                //     'jwtToken'   => $getToken['response']['access_token'],
                // ]);



                // if ($get_zoom_details['success']) {
                //     $get_zoom_details['access_token'] = $getToken['response']['access_token'];
                //     return view('admin.LMS.zoom.index')->with('respond', json_encode($get_zoom_details));
                // } else {
                //     // Handle error from create_a_zoom_meeting function
                //     return view('admin.LMS.zoom.index')->with('respond', json_encode($get_zoom_details));
                // }
            } else {
                // Handle error from get_oauth_step_2 function
                return view('admin.LMS.zoom.index')->with('respond', json_encode($getToken));
            }
        }
    }


    public function meetingCreate(Request $request)
    {



        $redirectURL  = 'https://beta.teamgradding.com/LMS/zoom/meetingCreate';

        if (!$request->code) {
            $this->get_oauth_step_1($redirectURL);
        } else {


            $getToken = $this->get_oauth_step_2($request->code, $redirectURL);

            if ($getToken['success']) {
                $accessToken = $getToken['response']['access_token'];
               
                $meetings = $this->getMeetings($accessToken);
               

                // $get_zoom_details = $this->create_a_zoom_meeting([
                //     'topic'      => 'Interview With Code-180',
                //     'start_time' => date('Y-m-d\TH:i:00') . 'Z',
                //     'agenda'     => "We are having interview with @code-180",
                //     'jwtToken'   => $getToken['response']['access_token'],
                // ]);



                // if ($get_zoom_details['success']) {
                //     $get_zoom_details['access_token'] = $getToken['response']['access_token'];
                //     return view('admin.LMS.zoom.index')->with('respond', json_encode($get_zoom_details));
                // } else {
                //     // Handle error from create_a_zoom_meeting function
                //     return view('admin.LMS.zoom.index')->with('respond', json_encode($get_zoom_details));
                // }
            } else {
                // Handle error from get_oauth_step_2 function
                return view('admin.LMS.zoom.index')->with('respond', json_encode($getToken));
            }
        }
    }

    public function meetingCreateBYBatch(Request $request)
    { 
        $id = @$request->id;
          
        $batch = Batch::where('id', $id)->first();
      
        if ($batch) {
           
            $setting = Setting::first();

            $accessToken =  $setting->zoom_access_token;

            if (!empty($accessToken)) {
                $batchDate = $batch->start_date;
                $batchDate = Carbon::parse($batchDate)->tz(env('APP_TIMEZONE', 'UTC'));
                $classTime = $batch->class_time;
              
                if ($classTime) {
                    $batchDate = Carbon::parse($batchDate)->tz(env('APP_TIMEZONE', 'UTC'))->setTimeFromTimeString($classTime);
                }
                $formattedBatchDate = $batchDate->format('Y-m-d\TH:i:00\Z');
                // dd($formattedBatchDate);
                $get_zoom_details = $this->create_a_zoom_meeting([
                    'topic'      =>  $batch->batch_name. ' (#'.$batch->batch_code.')',
                    'start_time' => $formattedBatchDate,
                    'agenda'     => "--",
                    'jwtToken'   => $accessToken,
                ]);

               
                if ($get_zoom_details['success']) {
                   
                    if(@$get_zoom_details['response']['code'] == "124"){
                        flashError("Zoom Access Token not found.");
                        return back();
                    }
                    $meeting_id = @$get_zoom_details['response']['id'] ? @$get_zoom_details['response']['id'] : null;
                    $meeting_password = @$get_zoom_details['response']['password'] ? @$get_zoom_details['response']['password'] : null;

                    $batch->meeting_id = $meeting_id;
                    $batch->meeting_password = $meeting_password;
                    $batch->save();
                     
                    flashSuccess("Zoom Metting created successfully!");
                    return redirect()->route('admin.batch.index');
                } else {
                    flashError("Something Went Wrong!");
                    return redirect()->route('admin.batch.index');
                }
            } else {
                flashError("Zoom Access Token not found.");
                return back();
            }

           
        } else {
           
            flashError("Batch not found.");
            return back();
        }
    }




    public function getZoomAccessToken()
    {
        $clientId = env("ZOOM_CLIENT_ID");
        $clientSecret = env("ZOOM_CLIENT_SECRECT");

        $url = 'https://zoom.us/oauth/token';

        $data = [
            'grant_type' => 'client_credentials',
            'client_id' => $clientId,
            'client_secret' => $clientSecret,
        ];

        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));

        $response = curl_exec($ch);

        curl_close($ch);

        return json_decode($response, true)['access_token'];
    }

    //++++++++++++++++++++++++++++++++++++++++++++++++
    //++++++++++++++++++++++++++++++++++++++++++++++++
    private function get_oauth_step_1($redirectURL = null)
    {

        //++++++++++++++++++++++++++++++++++++++++++++++++
        //++++++++++++++++++++++++++++++++++++++++++++++++
        $redirectURL = $redirectURL ? $redirectURL : 'https://beta.teamgradding.com/LMS/zoom/zoomMeetingList';
        $authorizeURL = 'https://zoom.us/oauth/authorize';
        //++++++++++++++++++++++++++++++++++++++++++++++++++
        $clientID     = env("ZOOM_CLIENT_ID");
        $clientSecret = env("ZOOM_CLIENT_SECRECT");
        //++++++++++++++++++++++++++++++++++++++++++++++++
        //++++++++++++++++++++++++++++++++++++++++++++++++
        $authURL = $authorizeURL . '?client_id=' . $clientID . '&redirect_uri=' . $redirectURL . '&response_type=code&scope=&state=xyz';
        // $authURL = $authorizeURL . '?client_id=' . $clientID . '&redirect_uri=' . urlencode('https://beta.teamgradding.com/LMS/zoom/zoomMeetingList') . '&response_type=code&scope=meeting:write meeting:write:admin&state=xyz';
        // $authURL = $authorizeURL . '?client_id=' . $clientID . '&redirect_uri=' . urlencode('https://beta.teamgradding.com/LMS/zoom/zoomMeetingList') . '&response_type=code&scope=meeting:write meeting:write:admin&state=xyz';

        header('Location: ' . $authURL);
        exit;
    }


    private function get_oauth_step_2($code, $redirectURL = null)
    {

        $tokenURL = 'https://zoom.us/oauth/token';
        $redirectURL = $redirectURL ? $redirectURL : 'https://beta.teamgradding.com/LMS/zoom/zoomMeetingList';

        $clientID = env("ZOOM_CLIENT_ID");
        $clientSecret = env("ZOOM_CLIENT_SECRECT");

        $curl = curl_init();
        $params = array(
            CURLOPT_URL => $tokenURL,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_MAXREDIRS => 10,
            CURLOPT_TIMEOUT => 30,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST => "POST",
            CURLOPT_POSTFIELDS => http_build_query(array(
                'code' => $code,
                'grant_type' => 'authorization_code',
                'client_id' => $clientID,
                'client_secret' => $clientSecret,
                'redirect_uri' => $redirectURL,
            )),
            CURLOPT_HTTPHEADER => array(
                "cache-control: no-cache",
                "content-type: application/x-www-form-urlencoded",
                "accept: *",
            ),
        );

        curl_setopt_array($curl, $params);
        $response = curl_exec($curl);

        if ($response === false) {
            $error = curl_error($curl);
            curl_close($curl);
            return [
                'success' => false,
                'msg' => 'cURL Error: ' . $error,
                'response' => null,
            ];
        }

        curl_close($curl);

        $responseArray = json_decode($response, true);

        if (isset($responseArray['access_token'])) {
            return [
                'success' => true,
                'msg' => 'success',
                'response' => $responseArray,
                'code' => $code
            ];
        } else {
            return [
                'success' => false,
                'msg' => 'Error getting access token from Zoom API',
                'response' => $responseArray,
                'code' => $code
            ];
        }
    }


    //++++++++++++++++++++++++++++++++++++++++++++++++
    //++++++++++++++++++++++++++++++++++++++++++++++++
    private function create_a_zoom_meeting($meetingConfig = [])
    {
        //++++++++++++++++++++++++++++++++++++++++++++++++
        //++++++++++++++++++++++++++++++++++++++++++++++++
        $requestBody = [
            'topic'      => $meetingConfig['topic'] ?? 'New Meeting General Talk',
            'type'       => $meetingConfig['type'] ?? 2,
            'start_time' => $meetingConfig['start_time'] ?? date('Y-m-dTh:i:00') . 'Z',
            'duration'   => $meetingConfig['duration'] ?? 30,
            'password'   => $meetingConfig['password'] ?? mt_rand(),
            'timezone'   => 'Asia/Kolkata',
            'agenda'     => $meetingConfig['agenda'] ?? 'Interview Meeting',
            'settings'   => [
                'host_video'        => false,
                'participant_video' => true,
                'cn_meeting'        => false,
                'in_meeting'        => false,
                'join_before_host'  => true,
                'mute_upon_entry'   => true,
                'watermark'         => false,
                'use_pmi'           => false,
                'approval_type'     => 0,
                'registration_type' => 0,
                'audio'             => 'voip',
                'auto_recording'    => 'none',
                'waiting_room'      => false,
            ],
        ];
        //++++++++++++++++++++++++++++++++++++++++++++++++
        //++++++++++++++++++++++++++++++++++++++++++++++++
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // Skip SSL Verification
        curl_setopt_array($curl, array(
            CURLOPT_URL            => "https://api.zoom.us/v2/users/me/meetings",
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_ENCODING       => "",
            CURLOPT_MAXREDIRS      => 10,
            CURLOPT_SSL_VERIFYHOST => 0,
            CURLOPT_SSL_VERIFYPEER => 0,
            CURLOPT_TIMEOUT        => 30,
            CURLOPT_HTTP_VERSION   => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST  => "POST",
            CURLOPT_POSTFIELDS     => json_encode($requestBody),
            CURLOPT_HTTPHEADER     => array(
                "Authorization: Bearer " . $meetingConfig['jwtToken'],
                "Content-Type: application/json",
                "cache-control: no-cache",
            ),
        ));
        $response = curl_exec($curl);
        $err      = curl_error($curl);
        curl_close($curl);
        //++++++++++++++++++++++++++++++++++++++++++++++++
        if ($err) {
            return [
                'success'  => false,
                'msg'      => 'cURL Error #:' . $err,
                'response' => null,
            ];
        } else {

            return [
                'success'  => true,
                'msg'      => 'success',
                'response' => json_decode($response, true),
            ];
        }
    }



    public function joinMeeting(Request $request)
    {

        if (!empty($request->url)) {
            $url = $request->url;
            return view('admin.LMS.zoom.join', compact('url'));
        }
        return view('admin.LMS.zoom.join');
    }


    private function fetchZoomMeetings($accessToken)
    {
        // Set up the cURL request to fetch Zoom meetings list
        $url = 'https://api.zoom.us/v2/users/me/meetings';
        $curl = curl_init($url);
        curl_setopt_array($curl, [
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_HTTPHEADER => [
                "Authorization: Bearer $accessToken",
            ],
        ]);

        // Execute the cURL request
        $response = curl_exec($curl);

        // Check for errors
        if ($response === false) {
            $error = curl_error($curl);
            curl_close($curl);
            return [
                'success' => false,
                'msg' => 'cURL Error: ' . $error,
                'response' => null,
            ];
        }

        // Close the cURL session
        curl_close($curl);

        // Decode the JSON response
        $responseData = json_decode($response, true);

        // Check if the response contains meetings data
        if (isset($responseData['meetings'])) {
            // Meetings list fetched successfully, return success response
            return [
                'success' => true,
                'msg' => 'Meetings fetched successfully',
                'meetings' => $responseData['meetings'],
            ];
        } else {
            // Meetings data not found in the response, return error response
            return [
                'success' => false,
                'msg' => 'Error fetching meetings from Zoom API',
                'response' => $responseData,
            ];
        }
    }

    public function listMeetings(Request $request)
    {

        $code = $this->getZoomAccessTokens();
        dd($code);
        if ($code == null) {
            // $code = $this->get_oauth_step_1();
        } else {
            dd('Hello This is meating id ', $code);
            dd($request->all());
        }
    }


    private function getZoomAccessTokens($code = null)
    {
        $redirectURL  = 'https://beta.teamgradding.com/LMS/zoom/zoomMeetingList';
        $authorizeURL = 'https://zoom.us/oauth/authorize';
        $tokenURL     = 'https://zoom.us/oauth/token';

        $clientID     = env("ZOOM_CLIENT_ID");
        $clientSecret = env("ZOOM_CLIENT_SECRECT");

        // Step 1: Redirect user to Zoom authorization URL
        if (is_null($code)) {
            $authURL = $authorizeURL . '?client_id=' . $clientID . '&redirect_uri=' . $redirectURL . '&response_type=code&scope=&state=xyz';
            header('Location: ' . $authURL);
            exit;
        }

        // Step 2: Exchange authorization code for access token
        $curl = curl_init();
        $params = array(
            CURLOPT_URL => $tokenURL,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_MAXREDIRS => 10,
            CURLOPT_TIMEOUT => 30,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST => "POST",
            CURLOPT_POSTFIELDS => http_build_query(array(
                'code' => $code,
                'grant_type' => 'authorization_code',
                'client_id' => $clientID,
                'client_secret' => $clientSecret,
                'redirect_uri' => $redirectURL,
            )),
            CURLOPT_HTTPHEADER => array(
                "cache-control: no-cache",
                "content-type: application/x-www-form-urlencoded",
                "accept: *",
            ),
        );

        curl_setopt_array($curl, $params);
        $response = curl_exec($curl);

        if ($response === false) {
            $error = curl_error($curl);
            curl_close($curl);
            return [
                'success' => false,
                'msg' => 'cURL Error: ' . $error,
                'response' => null,
            ];
        }

        curl_close($curl);

        $responseArray = json_decode($response, true);

        if (isset($responseArray['access_token'])) {
            return [
                'success' => true,
                'msg' => 'success',
                'response' => $responseArray,
                'code' => $code
            ];
        } else {
            return [
                'success' => false,
                'msg' => 'Error getting access token from Zoom API',
                'response' => $responseArray,
                'code' => $code
            ];
        }
    }


    public function getMeetings($token)
    {

        // Base URL for Zoom API
        $baseUrl = 'https://api.zoom.us/v2/';

        $headers = [
            'Authorization' => 'Bearer ' . $token,
            'Content-Type' => 'application/json',
        ];

        try {
            // Make a GET request to retrieve all meetings
            $response = Http::withHeaders($headers)->get($baseUrl . 'users/me/meetings');

            // Check if the request was successful
            if ($response->status() === 200) {
                $data = $response->json();
                // Return the list of meetings
                return $data['meetings'];
            } else {
                // Log error message if request was not successful

                echo "Failed to retrieve meetings. Status Code: " . $response->status() . "\n";
                return [];
            }
        } catch (\Exception $e) {
            echo "An error occurred: " . $e->getMessage() . "\n";
            return [];
        }
    }
}
