<?php

namespace App\Http\Controllers;
use App\Admin;
use App\Client;
use App\DataTables\AuditTrailDataTable;
use App\DataTables\ClientDataTable;
use App\DataTables\UserDataTable;
use App\dev\extras;
use App\discount;
use App\Mail\pingAdmin;
use App\pub_size;
use App\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Validator;
use App\Notifications\RequestState;
use Illuminate\Support\Facades\Storage;
use App\category;
use App\upload;
use App\advert;
class AdminController extends Controller
{




    public  function verify(Request $request,$id)
    {
        $find = Client::query()->find($id);
        $code  = $request->code;
        if($find->unique_code == $code):
            $find->status = 'Verified';
            $find->otp = $this->randomString(5);
            $find->save();


            $message = "Your OTP is {$this->randomString(5)}";
            $phone =    $find->phone_number;

            $this->sendSms($message,$phone);

            return redirect()->back()->with('success','Client Authenticated');

            else:
               return   redirect()->back()->withErrors('Invalid Unique Code');


            endif;


    }

    private function randomString($length)
    {
        return $random = substr(str_shuffle(str_repeat($x='0123456789ABCDEFGHIJ',ceil($length/strlen($x)))),1,$length);

    }

    private function sendSms($text,$phone)
    {
        $message = urlencode($text);
        $num = urlencode($phone);
        $sender=urlencode('NEW REG');
        $url = "https://deywuro.com/api/sms?username=Sammy&password=password&source=$sender&destination=" . $num . "&message=" . $message;

        $curl = curl_init($url);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_exec($curl);
        curl_close($curl);
    }


    public function root_index(UserDataTable $users)
    {
        return $users->render('root');
    }

    public function  audit_trail(AuditTrailDataTable $audit)
    {
        $logged = Auth::user();
        $logged->log('Viewed Audit Trails');
        return $audit->render('audit');
    }


    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {

        $logged = Auth::user();
        $logged->log('Access Dashboard');

        return view('admin.dash');

    }

    public function root_create(Request $request)
    {
        if($request->isMethod('POST'))
        {
            $request->validate([
                'first_name' => 'required',
                'last_name' => 'required',
                'middle_name' => 'sometimes|nullable',
                'email' => 'required|unique:users',
                'access_right' => 'required',
            ]);

                   $data = $request->all();
                   $fn = str_split($data['first_name']);
                   $mn = str_split($data['middle_name']);
                   $ln = str_split($data['last_name']);

                   $virtual_name  =  strtolower($fn[0].$mn[0].$data['last_name']);
                   $username = $this->getUserName($virtual_name);
                   $virtual_password = substr(hash('sha512',$username),0,6);
                   $password = bcrypt($virtual_password);

                   $data['username'] = $username;
                   $data['password'] = $password;
                   $data['role_id'] = $data['access_right'];

                   $user = User::query()->create($data);

                   //send email here
                    $email = $request->email;
                    $message = "Hello {$user->getFullNameAttribute()},  
                    Username : **{$username}**  
                    Password: **{$virtual_password}**";

                    $subject = 'Access credentials';

                    Mail::send(new pingAdmin($email, $message, $subject));

            return redirect()->route('root.admin.index')->with('success','User Successfully Registered');
        }

        return view('rt-create');
    }

    public function root_edit(Request $request, $id)
    {
        $root = User::query()->find($id);

        if($request->isMethod('POST')):

            $request->validate(
                [
                    'first_name'   => 'required',
                    'last_name'    => 'required',
                    'middle_name'  => 'sometimes|nullable',
                    'email'        => 'required|email|unique:users,email,'.$root->id,
                    'access_right' => 'required',
                ]
            );

                $data = $request->all();

                try{
                    $root->update($data);
                    Auth::user()->log("UPDATED ROOT USER:  {$root->getFullNameAttribute()}");
                }catch (\Exception $ex)
                {
                    return redirect()->bacK()->withErrors($ex->getMessage());
                }

                return redirect()->route('root.admin.index')->with('success','User successfully updated');

            endif;

            return view('rt-edit',compact('root'));
    }
    public function root_view(Request $request, $id)
    {
        $root = User::query()->find($id);

        if($request->isMethod('POST')):

            $request->validate(
                [
                    'first_name'   => 'required',
                    'last_name'    => 'required',
                    'middle_name'  => 'sometimes|nullable',
                    'email'        => 'required|email|unique:users,email,'.$root->id,
                    'access_right' => 'required',
                ]
            );

                $data = $request->all();

                try{
                    $root->update($data);
                    Auth::user()->log("UPDATED ROOT USER:  {$root->getFullNameAttribute()}");
                }catch (\Exception $ex)
                {
                    return redirect()->bacK()->withErrors($ex->getMessage());
                }

                return redirect()->route('root.admin.index')->with('success','User successfully updated');

            endif;

            return view('rt-view',compact('root'));
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function users(ClientDataTable $client)
    {
        $logged = Auth::user();
        $logged->log('Viewed Clients List');

        return $client->render('clients');
    }

    public function upload()
    {
        $logged = Auth::user();
        $logged->log('Access Bulk upload button');

//        dd($logged);
        return view('upload',[
            'logged'=>$logged
        ]);
    }

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


        $user = Client::query()->find($id);

        if($request->isMethod('POST'))
        {
            $data = $request->except(['id_photo']);




            try {
                $user->update($data);

                if(!empty($request->id_photo))
                {

                    $img  = $request->id_photo;   //base64 code

                    $name = $user->name().date('h:i:s').'.jpg';
                    $name = str_replace(' ', '_', $name);


                    $img = str_replace(' ', '+', $img);

                    /*** End of Base64 Conversion ***/
                    $img = base64_decode($img);
                    \File::put(storage_path(). '/app/public/otherfiles/' . $name, $img);
                    Storage::delete('public/otherfiles/'.$user->id_photo);
                    $data['id_photo'] = $name;
//
                    $user->update($data);

                }
            }
            catch (\Exception $ex){
                return redirect()->back()->withErrors('There is an error contact platforms to look into it');
            }

            $logged = Auth::user();
            $logged->log("Updated {$user->name()}");

            return redirect()->route('root.users.index')->with('success','Client records successfully updated');

        }

        $logged = Auth::user();
        $logged->log("View client: {$user->name()}");

        return view ('admin.edit',compact('user'));


    }

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

        $user = Client::query()->find($id);

        $logged = Auth::user();
        $logged->log("Viewed Client: {$user->name()}");



        return view ('admin.view',compact('user'));


    }

    public function destroy($id)
    {
            $purge = Client::query()->find($id);

            $logged = Auth::user();

            $logged->log("Deleted client: {$purge->name()}");

            $purge->delete();

        return redirect()->back()->with('success','Client successfully deleted');

    }


    private function getUserName($username)
    {
                $spoolUser = User::query()->where('username',$username)->first();
                if(!empty($spoolUser)){
                    return $this->getUserName($username.$this->extraCode());
                }
                else
                {
                    return $username;
                }
    }

    private function extraCode($length = 3)
    {
        return $random = substr(str_shuffle(str_repeat($x='0123456789',ceil($length/strlen($x)))),1,$length);
    }

}
