<?php

namespace App\Opt;

use App\AdminAccessRight;
use App\AppTicket;
use App\CompanyStatus;
use App\DataTables\Admin\CompanyDataTable;
use App\DataTables\Admin\DirectCompanyDataTable;
use App\DataTables\AppTicketDataTable;
use App\DataTables\ClientSenderIDTable;
use App\DataTables\SingleUserDataTable;
use App\Role;
use App\Tools\SmsTools;
use App\User;
use App\Company;
use App\UserSenderId;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Storage;

trait CompanyTrait
{

    public function tickets(AppTicketDataTable $ticket)
    {
        return $ticket->render('admin.company.ticket');
    }

    public function ticket_update(Request $request, AppTicket $ticket)
    {
        if ($request->isMethod('post')):
            $ticket->update($request->all());
            return redirect()->route('admin.tickets')->with('Ticket successfully updated');
        endif;


        return view('admin.company.edit_ticket', compact('ticket'));
    }

    public function approval($id)

    {

        $update = CompanyStatus::query()->where('company_id', $id)->first();

        if (empty($update))
            return redirect()->back()->withErrors('REQUEST CODE COULD NOT BE FOUND FOR THIS COMPANY');

        $balance = $update->company->users->credit->price * 50;
        $update->company->users->credit->update(['new_bal' => $balance, 'credited' => $balance]);

        $records['status'] = 1;
        $update->update($records);

        $string = null;

        $s_ids = UserSenderId::query()->where('user_id', $update->company->users->id)->get();

        foreach ($s_ids as $ss_ids):
            $string .= $ss_ids->sender_id . ', ';  //forms into a string
            $ss_ids->update(['status' => true]);  //updates sender Ids
        endforeach;

        $url = $update->company->users->role_id == 3 ? route('reseller.login') : route('login');

        Auth::user()->trail("Approved Company {$update->company->name}");


        //         $msg = "Hello {$update->company->name},
        // Your account for Deywuro has been created with username and password
        // username : {$update->company->users->username}
        // password : {$update->company->users->pass}
        // url : {$url}
        // Thank You,
        // Deywuro";

        $msg = "Hello {$update->company->name},\n\n" .
            "Your account for Deywuro has been created.\n" .
            "Username: {$update->company->users->username}\n" .
            "Password: {$update->company->users->pass}\n" .
            "URL: {$url}\n\n" .
            "Thank you,\nDeywuro";




        try {

            $this->sendSms($msg, $update->company->users->phone_number);

            $data['email']      = $update->company->users->email;
            $data['name']       = $update->company->name;
            $data['c_username'] = $update->company->users->username;
            $data['c_password'] = $update->company->users->pass;
            $data['url']        = $url;
            $data['content']    = "Your account for Deywuro has been created with username and password";

            /** @noinspection PhpUndefinedClassInspection */
            Mail::send('emails.admin_login', $data, function ($m) use ($data) {
                $m->from('sms@deywuro.com', 'Deywuro');
                $m->to($data['email'],  $data['name']);
                $m->subject('Deywuro');
            });
        } catch (\Exception $ex) {
        }

        return redirect()->route('admin.root.company')->with('success', 'Company Successfully Approved');
    }

    public function rejection(Request $request, $id)
    {
        $update = CompanyStatus::query()->where('company_id', $id)->first();
        if (empty($update))
            return redirect()->back()->withErrors('REQUEST CODE COULD NOT BE FOUND FOR THIS COMPANY');

        if (empty($request->comment))
            return redirect()->back()->withErrors('COMMENT CANNOT BE NULL');

        $records['status'] = 2;
        $records['comment'] = $request->comment;

        $update->update($records);

        $msg = "Hello {$update->company->name},
Your registration has been declined because: {$request->comment}.
kindly review the data you provided and apply again.";
        $this->sendSms($msg, $update->company->users->phone_number);

        //        Auth::user()->logs("APPROVED COMPANY WITH REQUEST CODE {$update->r_code}");


        $data['email']     = $update->company->users->email;
        $data['name']      = $update->company->name;
        $data['content']   = "Your registration was not unsuccessful";
        $data['reason']   = $request->comment;


        /** @noinspection PhpUndefinedClassInspection */
        Mail::send('emails.admin_login', $data, function ($m) use ($data) {
            $m->from('sms@deywuro.com', 'Deywuro');
            $m->to($data['email'],  $data['name']);
            $m->subject('Deywuro');
        });

        return redirect()->route('admin.root.company')->with('success', 'Company Successfully Rejected');
    }

    public function user(SingleUserDataTable $single, $user_id)
    {
        $user = User::query()->find($user_id);
        if (empty($user))
            return redirect()->back()->withErrors('User details could not be found, it may be that it has been deleted from the system');

        session(['c_user' => $user_id]);
        return $single->render('admin.root.user.index', compact('user'));
    }

    public function second_approval($id)
    {
        $update = CompanyStatus::query()->where('company_id', $id)->first();
        if (empty($update))
            return redirect()->back()->withErrors('COMPANY COULD NOT BE FOUND');

        /** Push Record to next staff  **/
        $records['status'] = 3;
        $update->update($records);

        $adminEmail  = AdminAccessRight::query()->where('value', 2)->get();

        $emails['email'] = array();
        $emails['approval'] = 'hello';

        //finds 2nd level admins and push their emails in an array
        foreach ($adminEmail as $mail):
            $search = User::query()->find($mail->user_id);
            if ($search):
                array_push($emails['email'], $search->email);
            endif;
        endforeach;

        /** Sends Email To The Client with sender ID approval list **/
        if (!empty($emails)):
            Mail::send('emails.admin_login', $emails, function ($m) use (&$emails) {
                $m->from('sms@deywuro.com', 'Deywuro');
                $m->to($emails['email']);
                $m->subject('Deywuro');
            });
        endif;

        /** End pushing of message to next staff */
        $senderArray = array();
        $string = null;

        $s_ids = UserSenderId::query()->where('user_id', $update->company->users->id)->get();

        foreach ($s_ids as $ss_ids):
            $string .= $ss_ids->sender_id . ', ';  //forms into a string
            $ss_ids->update(['status' => true]);  //updates sender Ids
        endforeach;


        $senderArray['sender_ids'] = rtrim(strtoupper($string), ', ');    //trims string
        $senderArray['email'] = $update->company->users->email;
        $senderArray['name'] = $update->company->name;


        return redirect()->route('admin.root.company')->with('success', 'Registration successfully moved to next staff for approval');
    }

    public function user_sender_id(ClientSenderIDTable $client, $id)
    {
        session(['this_user_id' => $id]);
        return $client->render('admin.company.senderId.single', [
            'name' => User::query()->find($id)
        ]);
    }

    private function editUserInfo(Request $request)
    {

        $inputs['phone_number'] = SmsTools::format_gh_number($request->input('company_phone_number'));
        $inputs['full_name'] = $request->input('name');
        $inputs['organisation'] = $request->input('name');;
        $inputs['website_url'] = !empty($request->input('website_url')) ? $request->input('website_url') : null;
        $inputs['email'] = $request->input('contact_person_email');
        $inputs['role_id'] = Role::where('name', $request->input('register_as'))->first()->id;
        $inputs['location'] = $request->input('physical_address');

        return $inputs;
    }

    private function editSavedFiles(Request $request, $company)
    {
        $records = array();

        if ($request->hasFile('business_document')):

            $bc = $request->file('business_document');
            $records['business_document'] = date('Y-m-d h:i:s') . '_' . $bc->getClientOriginalName();
            $bc->storePubliclyAs('public/business_doc', $records['business_document']);
            Storage::delete('public/business_doc/' . $company->business_document);

        endif;

        if ($request->hasFile('sender_id_document')):

            $sendID = $request->file('sender_id_document');
            $records['sender_id_document'] = date('Y-m-d h:i:s') . '_' . $sendID->getClientOriginalName();
            $sendID->storePubliclyAs('public/sender_docs', $records['sender_id_document']);
            Storage::delete('public/business_doc/' . $company->sender_id_document);

        endif;

        if ($request->has('business_logo')) {

            $sendID = $request->file('business_logo');
            $records['business_logo'] = date('Y-m-d h:i:s') . '_' . $sendID->getClientOriginalName();
            $sendID->storePubliclyAs('public/business_logo', $records['business_logo']);
            Storage::delete('public/business_doc/' . $company->sender_id_document);
        }

        if ($request->hasFile('contact_person_id')):

            $contactID = $request->file('contact_person_id');
            $records['contact_person_id'] = date('Y-m-d h:i:s') . '_' . $contactID->getClientOriginalName();
            $contactID->storePubliclyAs('public/contact_person', $records['contact_person_id']);
            Storage::delete('public/business_doc/' . $company->contact_person_id);
        endif;

        return $records;
    }

    public function update_user_sender_id(Request $request, $id)
    {

        $find             = UserSenderId::query()->find($id);
        $user             = User::query()->find($find->user_id);
        $organisationName = $user->organisation;
        $userName         = $user->username;
        $data             = $request->all();



        $msg1 = "Hello $organisationName,
your sender ID {$find->sender_id} has been approved on account with username $userName.";
        $msg2 =  "Hello $organisationName,
your sender ID {$find->sender_id} has been disapproved on account with username $userName. Reason : {$request->comment}";


        $content = [

            'body'     =>  $request->status == 1 ? $msg1 : $msg2,
            'email'    =>  $user->email,
            'username' =>  $user->username,
            'subject'  =>  $request->status == 1 ? 'SENDER ID APPROVAL' : ($request->status == 2 ? 'SENDER ID REJECTION' : 'SENDER ID PENDING APPROVAL'),

        ];



        try {

            if ($data['status'] == 2 && empty($data['comment']))
                return redirect()->back()->withErrors('Rejection should not go without a comment');

            $data['status'] = $request->status;

            $find->update($data);
        } catch (\Exception $ex) {
            return redirect()->back()->withErrors('Sorry request could not be processed, contact platforms for assistance');
        }


        // send email notification to client
        Mail::send('emails.sender_id', $content, function ($m) use ($content) {
            $m->from('npontualph@gmail.com', 'DEYWURO');
            $m->replyTo('support@npontu.com', 'Npontu Support');
            $m->to($content['email'], $content['username']);
            $m->cc('support@npontu.com');
            $m->subject($content['subject']);
        });

        $msg = $content['body'];

        $this->sendSms($msg, '0244304528,0243375520,' . $user->phone_number);

        return redirect()->back()->with('success', 'Client sender id successfully reviewed');
    }



    public  function direct(DirectCompanyDataTable $company)
    {
        return $company->render('admin.company.direct');
    }
}
