<?php 
    session_start(); 
    require 'config.php';
    require 'KooKoo-PHP/kookoophp/response.php';//include response.php into your code
    
    $PLAY_FROM = 'AUDIO'; //"TEXT"    
    $WELCOME = 'Welcome';
    $SELECT_LANG = 'Language';
    $MAIN_MENU = 'MainMenu';
    $LABOUR_BOARD_REG = 'LabourBoardReg';
    $OPEN_BANK_ACCOUNT = 'OpenBankAccount';
    $INFO_BOARD_BENEFITS = 'BoardBenefitsInfo';
    $SUPPORT_MEDICAL_ISSUES = 'SupportMedical';
    $SUPPORT_GOVT_SCHOOLS = 'GovtSchool';
    $SCHOOL_SKILLS_WAGE = 'SchoolSkillsWageDisputes';
    $REPEAT_PINCODE = 'PinCode';
    $PINCODE_CONFIRMATION = 'CheckPincode';
    $SUPPORT_MEDICAL_ISSUES_PROCESSED = 'SupportMedicalSMSSent';
    $SUPPORT_GOVT_SCHOOLS_PROCESSED = 'GovtSchoolSMSSent';
    $EXIT_REPEAT_MENU = 'BackMenu';
    $REQUEST_CALL_BACK = "CallBack";
    $OFFICE_ADDRESS = 'WRCOfficeAddress';
    $THANK_YOU = 'ThankYou';
    $INVALID_NO_RESPONSE = "InvalidInput";
    $EXCEEDED_MAX_ATTEMPTS = "MaxAttemptsExceeded";


    $audio_list = array(
        "$SELECT_LANG" => ["language_selection.wav"],
        "$WELCOME" => ["welcome1.wav"],
        "$MAIN_MENU" => ["main_menu_new1.wav"],
        "$LABOUR_BOARD_REG" => ["labour_board_reg.wav"],
        "$OPEN_BANK_ACCOUNT" => ["open_bank_account.wav"],
        "$INFO_BOARD_BENEFITS" => ["info_board_benefits.wav"],
        "$SUPPORT_MEDICAL_ISSUES" => ["enter_pin_code.wav"],
        "$SUPPORT_GOVT_SCHOOLS" => ["enter_pin_code.wav"],
        "$SCHOOL_SKILLS_WAGE" => ["visit_office_other_services.wav"],
        "$REPEAT_PINCODE" => ["pin_code_entered.wav"],
        "$PINCODE_CONFIRMATION" => ["confirm_pin_code.wav"],
        "$SUPPORT_MEDICAL_ISSUES_PROCESSED" => ["medical_issues_sms_sent.wav"],
        "$SUPPORT_GOVT_SCHOOLS_PROCESSED" => ['govt_school_sms_sent.wav'],    
        "$EXIT_REPEAT_MENU" => ["exit_repeat_menu.wav"],
        "$REQUEST_CALL_BACK" => ["request_call_back.wav"],
        "$OFFICE_ADDRESS" => ["wrc_office_address.wav"],
        "$THANK_YOU" => ["thank_you.wav"],
        "$INVALID_NO_RESPONSE" => ['invalid_no_response.wav'],
        "$EXCEEDED_MAX_ATTEMPTS" => ["max_attempts_exceeded.wav"]
        // "0" => ["0.wav"],
        // "1" => ["1.wav"],
        // "2" => ["2.wav"],
        // "3" => ["3.wav"],
        // "4" => ["4.wav"],
        // "5" => ["5.wav"],
        // "6" => ["6.wav"],
        // "7" => ["7.wav"],
        // "8" => ["8.wav"],
        // "9" => ["9.wav"]
    );

    $text_list = array(
        "$SELECT_LANG" => ["Press 1 for Kannada", 
                            "Press 2 for Hindi"],
        "$WELCOME" => ["Welcome to Shramik Sahayavani"],
        "$MAIN_MENU" => [   "Press 1 for Registration With Labour Board",
                            "Press 2 for Support in Opening Bank Account",
                            "Press 3 for Information on Board Benefits",
                            "Press 4 for Support on Medical Issues",
                            "Press 5 for Support on Government School Admissions"
                        ],
        "$LABOUR_BOARD_REG" => ["Details of Labour Board Registration"],
        "$OPEN_BANK_ACCOUNT" => ["Details of Support provided in opening a bank account"],
        "$INFO_BOARD_BENEFITS" => ["Details of Information on Board Benefits"],
        "$SUPPORT_MEDICAL_ISSUES" => ["Please enter your Pincode followed by # key"],
        "$SUPPORT_GOVT_SCHOOLS" => ["Please enter your Pincode followed by # key"],
        "$SCHOOL_SKILLS_WAGE" =>  ["Please visit our office for support related to Skills Training and Wage Disputes"],
        "$REPEAT_PINCODE" => ["You have entered Pincode "],
        "$PINCODE_CONFIRMATION" => ["Press 1 to Confirm",
                                    "Press 2 to change"],
        "$SUPPORT_MEDICAL_ISSUES_PROCESSED" => ["Facility details sent in SMS"],
        "$SUPPORT_GOVT_SCHOOLS_PROCESSED" => ["Government School details sent in SMS"],
        "$EXIT_REPEAT_MENU" => ["Press 1 to Return Back to Main Menu",
                                "Press 2 to Request a Call Back from Shramik Sahayavani Team",
                                "Press 3 for WRC Office Address"
                               ],
        "$OFFICE_ADDRESS" => ["WRC Office Address One",
                               "WRC Office Address Two"],
        "$REQUEST_CALL_BACK" => ["Your number is shared with Shramik Sahayavani Team and you will receive a call back"],
        "$THANK_YOU" => ["Thank you for using Shramik Sahayavani"],
        "$INVALID_NO_RESPONSE" => ["You have not selected any options"],
        "$EXCEEDED_MAX_ATTEMPTS" => ["You have exceeded maximum number of attempts"]
    );

    $main_menu_codes = [1=>$LABOUR_BOARD_REG,2=>$OPEN_BANK_ACCOUNT,3=>$INFO_BOARD_BENEFITS, 4=>$SUPPORT_MEDICAL_ISSUES, 5=>$SUPPORT_GOVT_SCHOOLS];
    $exit_menu_codes = [1=>$MAIN_MENU,2=>$REQUEST_CALL_BACK,3=>$OFFICE_ADDRESS];
    $arr_store_step = array('NewCall', $SELECT_LANG, $WELCOME, $MAIN_MENU, $LABOUR_BOARD_REG, $OPEN_BANK_ACCOUNT,
                            $INFO_BOARD_BENEFITS, $SUPPORT_MEDICAL_ISSUES_PROCESSED, $SUPPORT_GOVT_SCHOOLS_PROCESSED,
                            $EXIT_REPEAT_MENU, $OFFICE_ADDRESS, $REQUEST_CALL_BACK,$EXCEEDED_MAX_ATTEMPTS,
                            'Hangup', 'Disconnect');

    function play_message($response, $short_code)
    {
        global $PLAY_FROM;
        $item_list = getList($short_code);        
        if($PLAY_FROM == 'TEXT')
        {
            foreach($item_list as $x=>$item)
            {
                $response->addPlayText($item);    
            }
        }
        else 
        {   
            foreach($item_list as $x=>$item)
            {
                $response->addPlayAudio($item);    
            }
        }
    }
        
    function create_collect_dtmf_with_messages($prepend_list, $append_list, $short_code,$max_chars=-1, $term_char='')
    {
        $cd_item_list = getList($short_code);
        $item_list = array();
        array_push($item_list, ...$prepend_list);
        array_push($item_list, ...$cd_item_list);
        array_push($item_list, ...$append_list);
        return create_collect_dtmf_from_list($item_list,$max_chars,$term_char);
    }

    function create_collect_dtmf($short_code, $max_chars=-1, $term_char='')
    {
        $item_list = getList($short_code);
        return create_collect_dtmf_from_list($item_list, $max_chars=-1, $term_char='');
    }

    function create_collect_dtmf_from_list($item_list, $max_chars=-1, $term_char='')
    {
        global $PLAY_FROM;
        error_log("Items:".print_r($item_list,true));
        if($max_chars == -1)
        {
            $cd = new CollectDtmf();
        }
        else
        {
            $cd = new CollectDtmf($max_chars, $term_char,5000);
        }
        if($PLAY_FROM == 'TEXT')
        {
            foreach($item_list as $x=>$item)
            {
                //error_log("item:[$x]".$item);
                $cd->addPlayText($item);
            }
        }
        else 
        {   
            foreach($item_list as $x=>$item)
            {
                $cd->addPlayAudio($item);
            }
        }
        return $cd;
    }

    function getList($short_code)
    {
        global $APP_IVR_URL;
        global $text_list;
        global $audio_list;
        try
        {
            global $PLAY_FROM;
            $item_list = array();

            if($PLAY_FROM == 'TEXT')
            {
                foreach($text_list[$short_code] as $item)
                {
                    //error_log("$item");
                    array_push($item_list,$item);
                }
            }
            else 
            {   
                $lang = '';
                if(isset($_SESSION['selected_language']))
                {
                    $lang = $_SESSION['selected_language'].'/';
                }
                //error_log("lang:$lang");
                foreach($audio_list[$short_code] as $item)
                {
                    //error_log("$item");
                    array_push($item_list,$APP_IVR_URL."/$lang".$item);
                }
            }
            //error_log("list:".print_r($item_list,true));
        }
        catch(Exception $e)
        {
            error_log("Error:".$e->getMessage());
        }
        return $item_list;
    }

    function getNumbers($input)
    {
        global $PLAY_FROM;
        global $APP_IVR_URL;

        $pin_array = str_split($input,1);
        $item_list = array();
        if($PLAY_FROM == 'TEXT')
        {
            array_push($item_list,...$pin_array);
        }
        else 
        {
            $lang = '';
            if(isset($_SESSION['selected_language']))
            {
                $lang = $_SESSION['selected_language'].'/';
            }
            foreach($pin_array as $i=>$n)
            {
                array_push($item_list,$APP_IVR_URL."/$lang".$n.".wav");
            }
        }
        return $item_list;
    }

    //params 
    // response - response object to handle repeat
    // session_key - session key used for tracking repeat count
    // max_repeat_count - max times the options has to repeat on invalid or no response
    // repeat goto - php file in case of continue repeat
    // max_attempts_goto - php file in case of max attempts reached
    // repeat_unset_arr - session keys to unset in case of repeat flow
    // max_attempts_unset_arr - session keys to unset in case of max attempts reached flow
    function handle_step_repeat($response, $session_key, $max_repeat_count, $repeat_goto, $max_attempts_goto, $repeat_unset_arr, $max_attempts_unset_arr)
    {
        global $EXCEEDED_MAX_ATTEMPTS;
        global $INVALID_NO_RESPONSE;
        global $APP_BASE_URL;

        $repeat_count = 1;
        if (isset($_SESSION[$session_key]))
        {
            $repeat_count = $_SESSION[$session_key] + 1;
        }
        if($repeat_count < $max_repeat_count)
        {
            play_message($response, $INVALID_NO_RESPONSE);
            add_step($INVALID_NO_RESPONSE);
            $_SESSION[$session_key] = $repeat_count;
            $response->addGoto($APP_BASE_URL."/$repeat_goto");
            foreach($repeat_unset_arr as $key)
            {
                if(isset($_SESSION[$key]))
                {
                    unset($_SESSION[$key]);
                }
            }
        }
        else
        {
            unset($_SESSION[$session_key]);
            play_message($response, $EXCEEDED_MAX_ATTEMPTS);
            add_step($EXCEEDED_MAX_ATTEMPTS);
            $response->addGoto($APP_BASE_URL."/$max_attempts_goto");
            foreach($max_attempts_unset_arr as $key)
            {
                if(isset($_SESSION[$key]))
                {
                    unset($_SESSION[$key]);
                }
            }
        }
    }

    function check_call_end($response)
    {
        global $APP_BASE_URL;
        if(isset($_REQUEST['event']) && ($_REQUEST['event'] == 'Hangup' || $_REQUEST['event'] == 'Disconnect'))
        {
            //add_step($_REQUEST['event']);
            //handle_call_end($_REQUEST['event']);
            // $response->addGoto($APP_BASE_URL."/hangup.php");
            // $response->send();
            handle_call_end($_REQUEST['event']);
            add_step($_REQUEST['event']);
            error_log('checkcallend-'.$_SESSION['call_flow_steps']);
            $response->addHangup();
            $response->send();
            return true;
        }
        return false;
    }


    function handle_call_end($event)
    {
        error_log("Event:$event");
        error_log(print_r($_REQUEST,true));
        error_log($_SESSION['call_flow_steps']);
    }

    function add_step($short_code)
    {
        global $arr_store_step;
        if(!isset($_SESSION['call_flow_steps']) || $_SESSION['call_flow_steps'] == "")
        {
            $_SESSION['call_flow_steps'] = "$short_code";
        }
        else
        {
            $_SESSION['call_flow_steps'] .= "|$short_code";
        }
        if(in_array($short_code, $arr_store_step, true))
        {
            $caller_id = '';//cid
            $session_id = '';//sid
            $caller_type = ''; //mobile or landline
            $called_number = '';
            $circle = '';
            $operator = '';
            $request_time = '';//request_time
            $call_steps = '';
            $last_short_code = '';
            $total_call_duration = 0;

            if(isset($_REQUEST['cid'])) { $caller_id = $_REQUEST['cid'];}
            if(isset($_REQUEST['cid_type'])) { $caller_type = $_REQUEST['cid_type'];}
            if(isset($_REQUEST['sid'])) { $session_id = $_REQUEST['sid'];}
            if(isset($_REQUEST['called_number'])) { $called_number = $_REQUEST['called_number'];}
            if(isset($_REQUEST['circle'])) { $circle = $_REQUEST['circle'];}
            if(isset($_REQUEST['operator'])) { $operator = $_REQUEST['operator'];}
            if(isset($_REQUEST['request_time'])) { $request_time = $_REQUEST['request_time'];}
            if(isset($_SESSION['call_flow_steps'])) { $call_steps = $_SESSION['call_flow_steps'];}
            $last_short_code = $short_code;
            if(isset($_REQUEST['total_call_duration'])) { $total_call_duration = $_REQUEST['total_call_duration'];}

            $data = array("caller_id" => $caller_id,"session_id" => $session_id,
                          "called_number" =>$called_number,"circle" =>$circle,
                          "operator" =>$operator,"request_time" =>$request_time,
                          "call_steps" => $call_steps, "last_short_code"=> $last_short_code,
                          "total_call_duration" => $total_call_duration, "cid_type" => $caller_type
                        );
            store_call_data($data);
        }
    }

    function store_call_data($data)
    {
        global $CALL_DATA_STORE_URL;
        try
        {
            $url = $CALL_DATA_STORE_URL;
            error_log("store_call_data called:".print_r($data,true));
            $postdata = json_encode($data);
            $ch = curl_init($url);
            try{
                curl_setopt($ch, CURLOPT_POST, 1);
                curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
                $result = curl_exec($ch);
                error_log("CURL_EXEC_RESULT:".$result);
                if($result !== false)
                {
                    $message = "Success".print_r(json_decode($result),true);
                }
                else 
                {   $message = "Failure:";
                    $message .= "Errono(".curl_errno($ch).")";
                    $message .= ":".curl_error($ch);
                }
                error_log("CURL_RESPONSE:".$message);
            }
            finally
            {
                curl_close($ch);
            }
        }
        catch(Exception $e)
        {
            error_log("Error in store_call_data:".$e->getMessage());
        }
    }
?>
