name : DLRController.php
<?php

    namespace App\Http\Controllers\Customer;

    use App\Events\MessageReceived;
    use App\Http\Controllers\Controller;
    use App\Models\Blacklists;
    use App\Models\Campaigns;
    use App\Models\ChatBox;
    use App\Models\ChatBoxMessage;
    use App\Models\ContactGroups;
    use App\Models\ContactGroupsOptinKeywords;
    use App\Models\ContactGroupsOptoutKeywords;
    use App\Models\Contacts;
    use App\Models\Country;
    use App\Models\Keywords;
    use App\Models\Notifications;
    use App\Models\PhoneNumbers;
    use App\Models\PlansSendingServer;
    use App\Models\Reports;
    use App\Models\Senderid;
    use App\Models\SendingServer;
    use App\Models\User;
    use App\Repositories\Eloquent\EloquentCampaignRepository;
    use Illuminate\Http\JsonResponse;
    use Illuminate\Http\Request;
    use libphonenumber\NumberParseException;
    use libphonenumber\PhoneNumberUtil;
    use Throwable;
    use Twilio\TwiML\Messaging\Message;
    use Twilio\TwiML\MessagingResponse;
    use function PHPUnit\Framework\isNull;

    class DLRController extends Controller
    {

        /**
         * update dlr
         *
         * @param      $message_id
         * @param      $status
         * @param null $sender_id
         * @param null $phone
         *
         * @return mixed
         */
        public static function updateDLR($message_id, $status, $phone = null, $sender_id = null): mixed
        {

            $get_data = Reports::query()->when($message_id, function ($query) use ($message_id) {
                $query->whereLike(['status'], $message_id);
            })->when($sender_id, function ($query) use ($sender_id) {
                $query->whereLike(['from'], $sender_id);
            })->when($phone, function ($query) use ($phone) {
                $query->whereLike(['to'], $phone);
            })->first();


            if ($get_data) {

                $get_data->status = $status . '|' . $message_id;
                $get_data->save();

                if ($get_data->campaign_id) {
                    Campaigns::find($get_data->campaign_id)->updateCache();
                }
            }

            return $status;
        }


        /**
         *twilio dlr
         *
         * @param Request $request
         */
        public function dlrTwilio(Request $request)
        {
            $message_id = $request->MessageSid;
            $status     = $request->MessageStatus;

            if ($status == 'delivered' || $status == 'sent') {
                $status = 'Delivered';
            }

            $this::updateDLR($message_id, $status);

        }

        /**
         * Route mobile DLR
         *
         * @param Request $request
         */
        public function dlrRouteMobile(Request $request)
        {
            $message_id = $request->sMessageId;
            $status     = $request->sStatus;
            $sender_id  = $request->sSender;
            $phone      = $request->sMobileNo;

            if ($status == 'DELIVRD' || $status == 'ACCEPTED') {
                $status = 'Delivered';
            }

            $this::updateDLR($message_id, $status, $sender_id, $phone);
        }


        /**
         * text local DLR
         *
         * @param Request $request
         */
        public function dlrTextLocal(Request $request)
        {
            $message_id = $request->customID;
            $status     = $request->status;
            $phone      = $request->number;

            if ($status == 'D') {
                $status = 'Delivered';
            }

            $this::updateDLR($message_id, $status, null, $phone);
        }


        /**
         * Plivo DLR
         *
         * @param Request $request
         */
        public function dlrPlivo(Request $request)
        {
            $message_id = $request->MessageUUID;
            $status     = $request->Status;
            $phone      = $request->To;
            $sender_id  = $request->From;

            if ($status == 'delivered' || $status == 'sent') {
                $status = 'Delivered';
            }

            $this::updateDLR($message_id, $status, $phone, $sender_id);
        }

        /**
         * SMS Global DLR
         *
         * @param Request $request
         */
        public function dlrSMSGlobal(Request $request)
        {
            $message_id = $request->msgid;
            $status     = $request->dlrstatus;

            if ($status == 'DELIVRD') {
                $status = 'Delivered';
            }

            $this::updateDLR($message_id, $status);
        }


        /**
         * Advance Message System Delivery reports
         *
         * @param Request $request
         */
        public function dlrAdvanceMSGSys(Request $request)
        {
            $message_id = $request->MessageId;
            $status     = $request->Status;
            $phone      = $request->Destination;
            $sender_id  = $request->Source;

            if ($status == 'DELIVRD') {
                $status = 'Delivered';
            }

            $this::updateDLR($message_id, $status, $phone, $sender_id);
        }


        /**
         * nexmo now Vonage DLR
         *
         * @param Request $request
         */
        public function dlrVonage(Request $request)
        {
            $message_id = $request->messageId;
            $status     = $request->status;
            $phone      = $request->msisdn;
            $sender_id  = $request->to;

            if ($status == 'delivered' || $status == 'accepted') {
                $status = 'Delivered';
            }

            $this::updateDLR($message_id, $status, $phone, $sender_id);
        }

        /**
         * infobip DLR
         *
         * @param Request $request
         */
        public function dlrInfobip(Request $request)
        {
            $get_data = $request->getContent();

            $get_data = json_decode($get_data, true);
            if (isset($get_data) && is_array($get_data) && array_key_exists('results', $get_data)) {
                $message_id = $get_data['results']['0']['messageId'];

                foreach ($get_data['results'] as $msg) {

                    if (isset($msg['status']['groupName'])) {

                        $status = $msg['status']['groupName'];

                        if ($status == 'DELIVERED') {
                            $status = 'Delivered';
                        }

                        $this::updateDLR($message_id, $status);
                    }

                }
            }
        }

        public function dlrEasySendSMS(Request $request)
        {
            $message_id = $request->messageid;
            $status     = $request->status;
            $phone      = $request->mobile;
            $sender_id  = $request->sender;

            if ($status == 'delivered') {
                $status = 'Delivered';
            }

            $this::updateDLR($message_id, $status, $phone, $sender_id);
        }


        /**
         * AfricasTalking delivery reports
         *
         * @param Request $request
         */
        public function dlrAfricasTalking(Request $request)
        {
            $message_id = $request->id;
            $status     = $request->status;
            $phone      = str_replace(['(', ')', '+', '-', ' '], '', $request->phoneNumber);

            if ($status == 'Success') {
                $status = 'Delivered';
            }

            $this::updateDLR($message_id, $status, $phone);
        }


        /**
         * 1s2u delivery reports
         *
         * @param Request $request
         */
        public function dlr1s2u(Request $request)
        {
            $message_id = $request->msgid;
            $status     = $request->status;
            $phone      = str_replace(['(', ')', '+', '-', ' '], '', $request->mno);
            $sender_id  = $request->sid;

            if ($status == 'DELIVRD') {
                $status = 'Delivered';
            }

            $this::updateDLR($message_id, $status, $phone, $sender_id);
        }


        /**
         * dlrKeccelSMS delivery reports
         *
         * @param Request $request
         */
        public function dlrKeccelSMS(Request $request)
        {
            $message_id = $request->messageID;
            $status     = $request->status;

            if ($status == 'DELIVERED') {
                $status = 'Delivered';
            }

            $this::updateDLR($message_id, $status);
        }

        /**
         * dlrGatewayApi delivery reports
         *
         * @param Request $request
         */
        public function dlrGatewayApi(Request $request)
        {

            $message_id = $request->id;
            $status     = $request->status;
            $phone      = str_replace(['(', ')', '+', '-', ' '], '', $request->msisdn);

            if ($status == 'DELIVRD' || $status == 'DELIVERED') {
                $status = 'Delivered';
            }

            $this::updateDLR($message_id, $status, $phone);
        }


        /**
         * bulk sms delivery reports
         *
         * @param Request $request
         */
        public function dlrBulkSMS(Request $request)
        {

            logger($request->all());

        }

        /**
         * SMSVas delivery reports
         *
         * @param Request $request
         */
        public function dlrSMSVas(Request $request)
        {

            logger($request->all());

        }


        /**
         * receive inbound message
         *
         * @param      $to
         * @param      $message
         * @param      $sending_sever
         * @param      $cost
         * @param null $from
         * @param null $media_url
         * @param null $extra
         * @param int  $user_id
         *
         * @return JsonResponse|string
         * @throws NumberParseException
         * @throws Throwable
         */
        public static function inboundDLR($to, $message, $sending_sever, $cost, $from = null, $media_url = null, $extra = null, int $user_id = 1): JsonResponse|string
        {
            if (config('app.stage') == 'demo') {
                return response()->json([
                    'status'  => 'error',
                    'message' => 'Sorry!! This options is not available in demo mode',
                ]);
            }

            $to = str_replace(['(', ')', '+', '-', ' '], '', trim($to));

            if ($from != null) {
                $from = str_replace(['(', ')', '+', '-', ' '], '', trim($from));
            }
            $success = 'Success';
            $failed  = null;

            if ($extra != null) {
                $sender_id = Senderid::where('sender_id', $extra)->first();

                if ($sender_id) {
                    $user_id = $sender_id->user_id;
                    $user    = User::find($user_id);

                    $sending_servers = SendingServer::where('settings', $sending_sever)->where('status', true)->first();

                    if (isset($user->customer)) {

                        // Check the customer has permissions using sending servers and has his own sending servers
                        if ($user->customer->getOption('create_sending_server') == 'yes' && in_array('create_sending_servers', json_decode($user->customer->customerPermissions(), true))) {
                            $plan_id = $user->customer->activeSubscription()->plan_id;
                            if (PlansSendingServer::where('plan_id', $plan_id)->count()) {
                                $sending_servers = SendingServer::where('user_id', $user->id)->where('settings', $sending_sever)->where('status', true)->first();
                            } else {
                                $sending_servers = SendingServer::where('settings', $sending_sever)->where('status', true)->first();
                            }
                        } else {
                            // If customer don't have permission creating sending servers
                            $sending_servers = SendingServer::where('settings', $sending_sever)->where('status', true)->first();
                        }

                        //checking chat box
                        $chatBox = ChatBox::where('to', $to)->where('from', $extra)->where('user_id', $user_id)->first();

                        if ($chatBox) {
                            $chatBox->notification += 1;
                            $chatBox->save();
                        } else {
                            $chatBox = ChatBox::create([
                                'user_id'           => $user_id,
                                'from'              => $extra,
                                'to'                => $to,
                                'notification'      => 1,
                                'sending_server_id' => $sending_servers->id,
                            ]);
                        }

                        if ($chatBox && $sending_servers) {

                            Notifications::create([
                                'user_id'           => $user_id,
                                'notification_for'  => 'customer',
                                'notification_type' => 'chatbox',
                                'message'           => 'New chat message arrive',
                            ]);

                            ChatBoxMessage::create([
                                'box_id'            => $chatBox->id,
                                'message'           => $message,
                                'media_url'         => $media_url,
                                'sms_type'          => 'sms',
                                'send_by'           => 'to',
                                'sending_server_id' => $sending_servers->id,
                            ]);

                            $user = User::find($user_id);
                            event(new MessageReceived($user, $message, $chatBox));

                        } else {
                            $failed .= 'Failed to create chat message ';
                        }
                    }
                    if ($sending_servers) {
                        Reports::create([
                            'user_id'           => $user_id,
                            'from'              => $from,
                            'to'                => $to,
                            'message'           => $message,
                            'sms_type'          => 'plain',
                            'status'            => "Delivered",
                            'send_by'           => "to",
                            'cost'              => $cost,
                            'media_url'         => $media_url,
                            'sending_server_id' => $sending_servers->id,
                        ]);
                    }
                }
            } else {

                $phone_number = PhoneNumbers::where('number', $from)->where('status', 'assigned')->first();

                if ($media_url) {
                    $sms_type = 'mms';
                } else {
                    $sms_type = 'plain';
                }

                if ($phone_number) {
                    $user_id = $phone_number->user_id;
                }
                $user = User::find($user_id);

                // Check the customer has permissions using sending servers and has his own sending servers
                if ($user->customer->getOption('create_sending_server') == 'yes' && in_array('create_sending_servers', json_decode($user->customer->customerPermissions(), true))) {
                    $plan_id = $user->customer->activeSubscription()->plan_id;

                    if (PlansSendingServer::where('plan_id', $plan_id)->count()) {
                        $sending_servers = SendingServer::where('user_id', $user->id)->where('settings', $sending_sever)->where('status', true)->first();
                    } else {
                        $sending_servers = SendingServer::where('settings', $sending_sever)->where('status', true)->first();
                    }
                } else {
                    // If customer don't have permission creating sending servers
                    $sending_servers = SendingServer::where('settings', $sending_sever)->where('status', true)->first();
                }

                if ($sending_servers) {

                    Reports::create([
                        'user_id'           => $user_id,
                        'from'              => $from,
                        'to'                => $to,
                        'message'           => $message,
                        'sms_type'          => $sms_type,
                        'status'            => "Delivered",
                        'send_by'           => "to",
                        'cost'              => $cost,
                        'media_url'         => $media_url,
                        'sending_server_id' => $sending_servers->id,
                    ]);

                    if (isset($user->customer)) {

                        //checking chat box
                        $chatBox = ChatBox::where('to', $to)->where('from', $from)->where('user_id', $user_id)->first();

                        if ($chatBox) {
                            $chatBox->notification += 1;
                            $chatBox->save();
                        } else {
                            $chatBox = ChatBox::create([
                                'user_id'           => $user_id,
                                'from'              => $from,
                                'to'                => $to,
                                'notification'      => 1,
                                'sending_server_id' => $sending_servers->id,
                            ]);
                        }

                        if ($chatBox) {

                            Notifications::create([
                                'user_id'           => $user_id,
                                'notification_for'  => 'customer',
                                'notification_type' => 'chatbox',
                                'message'           => 'New chat message arrive',
                            ]);

                            ChatBoxMessage::create([
                                'box_id'            => $chatBox->id,
                                'message'           => $message,
                                'media_url'         => $media_url,
                                'sms_type'          => 'sms',
                                'send_by'           => 'to',
                                'sending_server_id' => $sending_servers->id,
                            ]);

                            $user = User::find($user_id);
                            event(new MessageReceived($user, $message, $chatBox));

                        } else {
                            $failed .= 'Failed to create chat message ';
                        }

                        //check keywords
                        $keyword = Keywords::where('user_id', $user_id)
                            ->select('*')
                            ->selectRaw('lower(keyword_name) as keyword,keyword_name')
                            ->where('keyword_name', strtolower($message))
                            ->where('status', 'assigned')->first();

                        if ($keyword) {

                            $phoneUtil         = PhoneNumberUtil::getInstance();
                            $phoneNumberObject = $phoneUtil->parse('+' . $to);
                            $country_code      = $phoneNumberObject->getCountryCode();

                            $country = Country::where('country_code', $country_code)->first();
                            if ( ! $country) {
                                $failed .= "Permission to send an SMS has not been enabled for the region indicated by the 'To' number: " . $to;
                            }

                            //checking contact message
                            $contact_groups = ContactGroups::where('customer_id', $user_id)->select('id')->cursor()->pluck('id')->toArray();
                            $optInContacts  = ContactGroupsOptinKeywords::whereIn('contact_group', $contact_groups)->where('keyword', $message)->cursor();
                            $optOutContacts = ContactGroupsOptoutKeywords::whereIn('contact_group', $contact_groups)->where('keyword', $message)->cursor();

                            $blacklist = Blacklists::where('user_id', $user_id)->where('number', $to)->first();


                            if ($optInContacts->count()) {
                                foreach ($optInContacts as $contact) {
                                    $exist = Contacts::where('group_id', $contact->contact_group)->where('phone', $to)->first();

                                    if ($blacklist) {
                                        $blacklist->delete();
                                    }

                                    if ( ! $exist) {
                                        $data = Contacts::create([
                                            'customer_id' => $user_id,
                                            'group_id'    => $contact->contact_group,
                                            'phone'       => $to,
                                            'first_name'  => null,
                                            'last_name'   => null,
                                        ]);

                                        if ($data && $country) {

                                            $sendMessage = new EloquentCampaignRepository($campaign = new Campaigns());

                                            if ($contact->ContactGroups->send_keyword_message) {
                                                if ($keyword->reply_text) {

                                                    $sendMessage->quickSend($campaign, [
                                                        'sender_id'      => $keyword->sender_id,
                                                        'sms_type'       => 'plain',
                                                        'message'        => $keyword->reply_text,
                                                        'recipient'      => $phoneNumberObject->getNationalNumber(),
                                                        'user_id'        => $user_id,
                                                        'sending_server' => $contact->ContactGroups->sending_server,
                                                        'country_code'   => $country_code,
                                                        'exist_c_code'   => true,
                                                    ]);

                                                }
                                            } else {
                                                if ($contact->ContactGroups->send_welcome_sms && $contact->ContactGroups->welcome_sms) {

                                                    $sendMessage->quickSend($campaign, [
                                                        'sender_id'      => $contact->ContactGroups->sender_id,
                                                        'sms_type'       => 'plain',
                                                        'message'        => $contact->ContactGroups->welcome_sms,
                                                        'recipient'      => $phoneNumberObject->getNationalNumber(),
                                                        'user_id'        => $user_id,
                                                        'sending_server' => $contact->ContactGroups->sending_server,
                                                        'country_code'   => $country_code,
                                                        'exist_c_code'   => true,
                                                    ]);

                                                }
                                            }

                                            $contact->ContactGroups->updateCache('SubscribersCount');
                                        } else {
                                            $failed .= 'Failed to subscribe contact list';
                                        }
                                    } else {

                                        if ($country) {
                                            $sendMessage = new EloquentCampaignRepository($campaign = new Campaigns());

                                            $sendMessage->quickSend($campaign, [
                                                'sender_id'      => $keyword->sender_id,
                                                'sms_type'       => 'plain',
                                                'message'        => __('locale.contacts.you_have_already_subscribed', ['contact_group' => $contact->ContactGroups->name]),
                                                'recipient'      => $phoneNumberObject->getNationalNumber(),
                                                'user_id'        => $user_id,
                                                'sending_server' => $contact->ContactGroups->sending_server,
                                                'country_code'   => $country_code,
                                                'exist_c_code'   => true,
                                            ]);
                                        }

                                        $exist->update([
                                            'status' => 'subscribe',
                                        ]);
                                    }

                                }
                            } else if ($optOutContacts->count()) {

                                foreach ($optOutContacts as $contact) {

                                    if ( ! $blacklist) {
                                        $exist = Contacts::where('group_id', $contact->contact_group)->where('phone', $to)->first();
                                        if ($exist) {
                                            $data = $exist->update([
                                                'status' => 'unsubscribe',
                                            ]);

                                            if ($data && $country) {
                                                Blacklists::create([
                                                    'user_id' => $user_id,
                                                    'number'  => $to,
                                                    'reason'  => "Optout by User",
                                                ]);

                                                $chatbox_messages = ChatBox::where('user_id', $user_id)->where('to', $to)->cursor();
                                                foreach ($chatbox_messages as $messages) {
                                                    $check_delete = ChatBoxMessage::where('box_id', $messages->id)->delete();
                                                    if ($check_delete) {
                                                        $messages->delete();
                                                    }
                                                }

                                                $sendMessage = new EloquentCampaignRepository($campaign = new Campaigns());

                                                if ($contact->ContactGroups->send_keyword_message) {
                                                    if ($keyword->reply_text) {

                                                        $sendMessage->quickSend($campaign, [
                                                            'sender_id'      => $keyword->sender_id,
                                                            'sms_type'       => 'plain',
                                                            'message'        => $keyword->reply_text,
                                                            'recipient'      => $phoneNumberObject->getNationalNumber(),
                                                            'user_id'        => $user_id,
                                                            'sending_server' => $contact->ContactGroups->sending_server,
                                                            'country_code'   => $country_code,
                                                            'exist_c_code'   => true,
                                                        ]);

                                                    }
                                                } else {
                                                    if ($contact->ContactGroups->unsubscribe_notification && $contact->ContactGroups->unsubscribe_sms) {

                                                        $sendMessage->quickSend($campaign, [
                                                            'sender_id'      => $contact->ContactGroups->sender_id,
                                                            'sms_type'       => 'plain',
                                                            'message'        => $contact->ContactGroups->unsubscribe_sms,
                                                            'recipient'      => $phoneNumberObject->getNationalNumber(),
                                                            'user_id'        => $user_id,
                                                            'sending_server' => $contact->ContactGroups->sending_server,
                                                            'country_code'   => $country_code,
                                                            'exist_c_code'   => true,
                                                        ]);

                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            } else {

                                if ($keyword->reply_text && $country) {
                                    $sendMessage = new EloquentCampaignRepository($campaign = new Campaigns());
                                    $sendMessage->quickSend($campaign, [
                                        'sender_id'      => $keyword->sender_id,
                                        'sms_type'       => 'plain',
                                        'message'        => $keyword->reply_text,
                                        'recipient'      => $phoneNumberObject->getNationalNumber(),
                                        'user_id'        => $user_id,
                                        'sending_server' => $sending_servers->id,
                                        'country_code'   => $country_code,
                                        'exist_c_code'   => true,
                                    ]);

                                } else {
                                    $failed .= 'Related keyword reply message not found.';
                                }
                            }
                        }
                    }
                }

            }

            if (strtolower($message) == 'stop') {
                $blacklist = Blacklists::where('user_id', $user_id)->where('number', $to)->first();
                if ( ! $blacklist) {
                    Blacklists::create([
                        'user_id' => $user_id,
                        'number'  => $to,
                        'reason'  => "Optout by User",
                    ]);

                    $chatbox_messages = ChatBox::where('user_id', $user_id)->where('to', $to)->cursor();
                    foreach ($chatbox_messages as $messages) {
                        $check_delete = ChatBoxMessage::where('box_id', $messages->id)->delete();
                        if ($check_delete) {
                            $messages->delete();
                        }
                    }
                }
            }


            if ($failed == null) {
                return $success;
            }

            return $failed;

        }


        /**
         * twilio inbound sms
         *
         * @param Request $request
         *
         * @return Message|MessagingResponse
         * @throws NumberParseException
         * @throws Throwable
         */
        public function inboundTwilio(Request $request): Message|MessagingResponse
        {
            $to      = $request->input('From');
            $from    = $request->input('To');
            $message = $request->input('Body');

            if ($message == 'NULL') {
                $message = null;
            }

            $response = new MessagingResponse();

            if ($to == null || $from == null) {
                $response->message('From and To value required');

                return $response;
            }

            $feedback = 'Success';

            $NumMedia = (int) $request->input('NumMedia');
            if ($NumMedia > 0) {
                $cost = 1;
                for ($i = 0; $i < $NumMedia; $i++) {
                    $mediaUrl = $request->input("MediaUrl$i");
                    $feedback = $this::inboundDLR($to, $message, 'Twilio', $cost, $from, $mediaUrl);
                }
            } else {
                $message_count = strlen(preg_replace('/\s+/', ' ', trim($message))) / 160;
                $cost          = ceil($message_count);

                $feedback = $this::inboundDLR($to, $message, 'Twilio', $cost, $from);
            }


            if ($feedback == 'Success') {
                return $response;
            }

            return $response->message($feedback);
        }

        /**
         * TwilioCopilot inbound sms
         *
         * @param Request $request
         *
         * @return Message|MessagingResponse
         * @throws NumberParseException
         * @throws Throwable
         */
        public function inboundTwilioCopilot(Request $request): Message|MessagingResponse
        {
            $to      = $request->input('From');
            $from    = $request->input('To');
            $message = $request->input('Body');
            $extra   = $request->input('MessagingServiceSid');

            if ($message == 'NULL') {
                $message = null;
            }

            $response = new MessagingResponse();

            if ($to == null || $from == null || $extra == null) {
                $response->message('From, To, and MessagingServiceSid value required');

                return $response;
            }

            $feedback = 'Success';

            $NumMedia = (int) $request->input('NumMedia');
            if ($NumMedia > 0) {
                $cost = 1;
                for ($i = 0; $i < $NumMedia; $i++) {
                    $mediaUrl = $request->input("MediaUrl$i");
                    $feedback = $this::inboundDLR($to, $message, 'TwilioCopilot', $cost, $from, $mediaUrl, $extra);
                }
            } else {
                $message_count = strlen(preg_replace('/\s+/', ' ', trim($message))) / 160;
                $cost          = ceil($message_count);

                $feedback = $this::inboundDLR($to, $message, 'TwilioCopilot', $cost, $from, null, $extra);
            }


            if ($feedback == 'Success') {
                return $response;
            }

            return $response->message($feedback);
        }

        /**
         * text local inbound sms
         *
         * @param Request $request
         *
         * @return JsonResponse|string
         * @throws NumberParseException
         * @throws Throwable
         */
        public function inboundTextLocal(Request $request): JsonResponse|string
        {
            $to      = $request->input('sender');
            $from    = $request->input('inNumber');
            $message = $request->input('content');

            if ($to == null || $from == null || $message == null) {
                return 'Sender, inNumber and content value required';
            }

            $message_count = strlen(preg_replace('/\s+/', ' ', trim($message))) / 160;
            $cost          = ceil($message_count);

            return $this::inboundDLR($to, $message, 'TextLocal', $cost, $from);
        }


        /**
         * inbound plivo messages
         *
         * @param Request $request
         *
         * @return JsonResponse|string
         * @throws NumberParseException
         * @throws Throwable
         */
        public function inboundPlivo(Request $request): JsonResponse|string
        {
            $to      = $request->input('From');
            $from    = $request->input('To');
            $message = $request->input('Text');

            if ($to == null || $message == null) {
                return 'Destination number and message value required';
            }

            $message_count = strlen(preg_replace('/\s+/', ' ', trim($message))) / 160;
            $cost          = ceil($message_count);

            return $this::inboundDLR($to, $message, 'Plivo', $cost, $from);
        }


        /**
         * inbound plivo powerpack messages
         *
         * @param Request $request
         *
         * @return JsonResponse|string
         * @throws NumberParseException
         * @throws Throwable
         */
        public function inboundPlivoPowerPack(Request $request): JsonResponse|string
        {
            $to      = $request->input('From');
            $from    = $request->input('To');
            $message = $request->input('Text');

            if ($to == null || $message == null) {
                return 'Destination number and message value required';
            }

            $message_count = strlen(preg_replace('/\s+/', ' ', trim($message))) / 160;
            $cost          = ceil($message_count);

            return $this::inboundDLR($to, $message, 'PlivoPowerpack', $cost, $from);
        }


        /**
         * inbound bulk sms messages
         *
         * @param Request $request
         *
         * @return JsonResponse|string
         * @throws NumberParseException
         * @throws Throwable
         */
        public function inboundBulkSMS(Request $request): JsonResponse|string
        {
            $to      = $request->input('msisdn');
            $from    = $request->input('sender');
            $message = $request->input('message');

            if ($to == null || $message == null) {
                return 'Destination number and message value required';
            }

            $message_count = strlen(preg_replace('/\s+/', ' ', trim($message))) / 160;
            $cost          = ceil($message_count);

            return $this::inboundDLR($to, $message, 'BulkSMS', $cost, $from);
        }

        /**
         * inbound Vonage messages
         *
         * @param Request $request
         *
         * @return JsonResponse|string
         * @throws NumberParseException
         * @throws Throwable
         */
        public function inboundVonage(Request $request): JsonResponse|string
        {
            $to      = $request->input('msisdn');
            $from    = $request->input('to');
            $message = $request->input('text');

            if ($to == null || $message == null) {
                return 'Destination number, Source number and message value required';
            }

            $message_count = strlen(preg_replace('/\s+/', ' ', trim($message))) / 160;
            $cost          = ceil($message_count);

            return $this::inboundDLR($to, $message, 'Vonage', $cost, $from);
        }

        /**
         * inbound messagebird messages
         *
         * @param Request $request
         *
         * @return JsonResponse|string
         * @throws NumberParseException
         * @throws Throwable
         */
        public function inboundMessagebird(Request $request): JsonResponse|string
        {

            $to      = $request->input('originator');
            $from    = $request->input('recipient');
            $message = $request->input('body');

            if ($to == null || $message == null) {
                return 'Destination number, Source number and message value required';
            }

            $message_count = strlen(preg_replace('/\s+/', ' ', trim($message))) / 160;
            $cost          = ceil($message_count);

            return $this::inboundDLR($to, $message, 'MessageBird', $cost, $from);
        }

        /**
         * inbound signalwire messages
         *
         * @param Request $request
         *
         * @return Message|MessagingResponse
         * @throws NumberParseException
         * @throws Throwable
         */
        public function inboundSignalwire(Request $request): Message|MessagingResponse
        {

            $response = new MessagingResponse();

            $to      = $request->input('From');
            $from    = $request->input('To');
            $message = $request->input('Body');

            if ($to == null || $from == null || $message == null) {
                $response->message('From, To and Body value required');

                return $response;
            }

            $message_count = strlen(preg_replace('/\s+/', ' ', trim($message))) / 160;
            $cost          = ceil($message_count);

            $feedback = $this::inboundDLR($to, $message, 'SignalWire', $cost, $from);

            if ($feedback == 'Success') {
                return $response;
            }

            return $response->message($feedback);
        }


        /**
         * inbound telnyx messages
         *
         * @param Request $request
         *
         * @return JsonResponse|string
         * @throws NumberParseException
         * @throws Throwable
         */
        public function inboundTelnyx(Request $request): JsonResponse|string
        {

            $get_data = $request->getContent();

            $get_data = json_decode($get_data, true);

            if (isset($get_data) && is_array($get_data) && array_key_exists('data', $get_data) && array_key_exists('payload', $get_data['data'])) {
                if ($get_data['data']['event_type'] == 'message.received') {
                    $to      = $get_data['data']['payload']['from']['phone_number'];
                    $from    = $get_data['data']['payload']['to'][0]['phone_number'];
                    $message = $get_data['data']['payload']['text'];

                    if ($to == '' || $message == '' || $from == '') {
                        return 'Destination or Sender number and message value required';
                    }

                    $message_count = strlen(preg_replace('/\s+/', ' ', trim($message))) / 160;
                    $cost          = ceil($message_count);

                    return $this::inboundDLR($to, $message, 'Telnyx', $cost, $from);
                }

                return 'Invalid request';
            }

            return 'Invalid request';
        }


        /**
         * inbound Teletopiasms messages
         *
         * @param Request $request
         *
         * @return JsonResponse|string
         * @throws NumberParseException
         * @throws Throwable
         */
        public function inboundTeletopiasms(Request $request): JsonResponse|string
        {

            $to      = $request->input('sender');
            $from    = $request->input('recipient');
            $message = $request->input('text');

            if ($to == null || $message == null) {
                return 'Destination number, Source number and message value required';
            }

            $message_count = strlen(preg_replace('/\s+/', ' ', trim($message))) / 160;
            $cost          = ceil($message_count);

            return $this::inboundDLR($to, $message, 'Teletopiasms', $cost, $from);
        }


        /**
         * receive FlowRoute message
         *
         * @param Request $request
         *
         * @return JsonResponse|string
         * @throws NumberParseException
         * @throws Throwable
         */
        public function inboundFlowRoute(Request $request): JsonResponse|string
        {

            $data = json_decode($request->getContent(), true);

            if (isset($data) && is_array($data) && array_key_exists('data', $data)) {

                $to      = $data['data']['attributes']['from'];
                $from    = $data['data']['attributes']['to'];
                $message = $data['data']['attributes']['body'];

                if ($from == '' || $message == '' || $to == '') {
                    return 'From, To and Body value required';
                }

                $message_count = strlen(preg_replace('/\s+/', ' ', trim($message))) / 160;
                $cost          = ceil($message_count);

                return $this::inboundDLR($to, $message, 'FlowRoute', $cost, $from);
            }

            return 'valid data not found';
        }

        /**
         * receive inboundEasySendSMS message
         *
         * @param Request $request
         *
         * @return JsonResponse|string
         * @throws NumberParseException
         * @throws Throwable
         */
        public function inboundEasySendSMS(Request $request): JsonResponse|string
        {

            $to      = $request->input('From');
            $from    = null;
            $message = $request->input('message');

            if ($message == '' || $to == '') {
                return 'To and Message value required';
            }

            $message_count = strlen(preg_replace('/\s+/', ' ', trim($message))) / 160;
            $cost          = ceil($message_count);

            return $this::inboundDLR($to, $message, 'FlowRoute', $cost, $from);
        }


        /**
         * receive Skyetel message
         *
         * @param Request $request
         *
         * @return JsonResponse|string
         * @throws NumberParseException
         * @throws Throwable
         */
        public function inboundSkyetel(Request $request): JsonResponse|string
        {

            $to      = $request->input('from');
            $from    = $request->input('to');
            $message = $request->input('text');

            if ($to == '' || $from == '') {
                return 'To and From value required';
            }


            if (isset($request->media) && is_array($request->media) && array_key_exists('1', $request->media)) {

                $mediaUrl = $request->media[1];

                return $this::inboundDLR($to, $message, 'Skyetel', 1, $from, $mediaUrl);
            } else {

                $message_count = strlen(preg_replace('/\s+/', ' ', trim($message))) / 160;
                $cost          = ceil($message_count);

                return $this::inboundDLR($to, $message, 'Skyetel', $cost, $from);
            }

        }

        /**
         * receive chat-api message
         *
         * @return JsonResponse|bool|string
         * @throws NumberParseException
         * @throws Throwable
         */
        public function inboundChatApi(): JsonResponse|bool|string
        {

            $data = json_decode(file_get_contents('php://input'), true);

            foreach ($data['messages'] as $message) {

                $to      = $message['author'];
                $from    = $message['senderName'];
                $message = $message['body'];

                if ($message == '' || $to == '' || $from == '') {
                    return 'Author, Sender Name and Body value required';
                }

                $message_count = strlen(preg_replace('/\s+/', ' ', trim($message))) / 160;
                $cost          = ceil($message_count);

                return $this::inboundDLR($to, $message, 'WhatsAppChatApi', $cost, $from);
            }

            return true;
        }

        /**
         * callr delivery reports
         *
         * @param Request $request
         */
        public function dlrCallr(Request $request)
        {

            $get_data = json_decode($request->getContent(), true);

            $message_id = $get_data['data']['user_data'];
            $status     = $get_data['data']['status'];

            if ($status == 'RECEIVED' || $status == 'SENT') {
                $status = 'Delivered|' . $message_id;
            }

            $this::updateDLR($message_id, $status);
        }


        /**
         * receive callr message
         *
         * @param Request $request
         *
         * @return JsonResponse|string
         * @throws NumberParseException
         * @throws Throwable
         */
        public function inboundCallr(Request $request): JsonResponse|string
        {

            $get_data = json_decode($request->getContent(), true);

            $to      = str_replace('+', '', $get_data['data']['from']);
            $from    = str_replace('+', '', $get_data['data']['to']);
            $message = $get_data['data']['text'];

            if ($message == '' || $to == '' || $from == '') {
                return 'From, To and Text value required';
            }

            $message_count = strlen(preg_replace('/\s+/', ' ', trim($message))) / 160;
            $cost          = ceil($message_count);

            return $this::inboundDLR($to, $message, 'Callr', $cost, $from);
        }


        /**
         * cm com delivery reports
         *
         * @param Request $request
         *
         * @return mixed|string
         */
        public function dlrCM(Request $request)
        {

            $get_data = json_decode($request->getContent(), true);
            if (is_array($get_data) && array_key_exists('messages', $get_data)) {
                $message_id = $get_data['messages']['msg']['reference'];
                $status     = $get_data['messages']['msg']['status']['errorCode'];

                if ($status == 'delivered') {
                    $status = 'Delivered|' . $message_id;
                }

                return $this::updateDLR($message_id, $status);
            }

            return 'Null Value Return';
        }


        /**
         * receive cm com message
         *
         * @param Request $request
         *
         * @return JsonResponse|string
         * @throws NumberParseException
         * @throws Throwable
         */
        public function inboundCM(Request $request): JsonResponse|string
        {

            $get_data = json_decode($request->getContent(), true);

            $to      = str_replace('+', '', $get_data['from']['number']);
            $from    = str_replace('+', '', $get_data['to']['number']);
            $message = $get_data['message']['text'];

            if ($message == '' || $to == '' || $from == '') {
                return 'From, To and Text value required';
            }

            $message_count = strlen(preg_replace('/\s+/', ' ', trim($message))) / 160;
            $cost          = ceil($message_count);

            return $this::inboundDLR($to, $message, 'CMCOM', $cost, $from);
        }


        /**
         * receive bandwidth message
         *
         * @param Request $request
         *
         * @return bool|JsonResponse|string|null
         * @throws NumberParseException
         * @throws Throwable
         */
        public function inboundBandwidth(Request $request): bool|JsonResponse|string|null
        {

            $data = $request->all();

            if (isset($data) && is_array($data) && count($data) > 0) {
                if ($data['0']['type'] == 'message-received') {
                    if (isset($data[0]['message']) && is_array($data[0]['message'])) {
                        $to      = $data[0]['message']['from'];
                        $from    = $data[0]['to'];
                        $message = $data[0]['message']['text'];


                        if ($message == '' || $to == '' || $from == '') {
                            return 'From, To and Text value required';
                        }

                        $message_count = strlen(preg_replace('/\s+/', ' ', trim($message))) / 160;
                        $cost          = ceil($message_count);

                        return $this::inboundDLR($to, $message, 'Bandwidth', $cost, $from);
                    } else {
                        return $request->getContent();
                    }
                } else {
                    return $request->getContent();
                }
            } else {
                return $request->getContent();
            }

        }


        /**
         * receive Solucoesdigitais message
         *
         * @param Request $request
         *
         * @return bool|false
         * @throws NumberParseException
         * @throws Throwable
         */
        public function inboundSolucoesdigitais(Request $request): bool
        {
            $data        = $request->all();
            $id_campanha = $data['id_campanha'];
            $report      = Reports::where('status', 'LIKE', "%{$id_campanha}%")->first();

            $message       = $data['sms_resposta'];
            $to            = $data['nro_telefone'];
            $message_count = strlen(preg_replace('/\s+/', ' ', trim($message))) / 160;
            $cost          = ceil($message_count);

            if ($report) {
                $from = $report->from;

                if ($message == '' || $to == '' || $from == '') {
                    return 'From, To and Text value required';
                }

                return $this::inboundDLR($to, $message, 'Solucoesdigitais', $cost, $from, null, null, $report->user_id);
            }

            return $this::inboundDLR($to, $message, 'Solucoesdigitais', $cost);
        }


        /**
         * receive inboundGatewayApi message
         *
         * @param Request $request
         *
         * @return bool|false
         * @throws NumberParseException
         * @throws Throwable
         */
        public function inboundGatewayApi(Request $request): bool
        {

            $to      = $request->input('msisdn');
            $from    = $request->input('receiver');
            $message = $request->input('message');

            if ($message == '' || $to == '') {
                return 'To and Message value required';
            }

            $message_count = strlen(preg_replace('/\s+/', ' ', trim($message))) / 160;
            $cost          = ceil($message_count);

            return $this::inboundDLR($to, $message, 'Gatewayapi', $cost, $from);
        }


        /**
         * @param Request $request
         * @return JsonResponse|string
         * @throws NumberParseException
         * @throws Throwable
         */

        public function inboundInteliquent(Request $request)
        {

            $to      = $request->input('to')[0];
            $from    = $request->from;
            $message = $request->text;

            if ($message == '' || $to == '' || $from == '') {
                return 'From, To and Message value required';
            }

            $message_count = strlen(preg_replace('/\s+/', ' ', trim($message))) / 160;
            $cost          = ceil($message_count);

            return $this::inboundDLR($to, $message, 'Inteliquent', $cost, $from);
        }

    }

© 2025 UnknownSec
afwwrfwafr45458465
Password