<?php /** @noinspection PhpUndefinedMethodInspection */

namespace App\Http\Controllers\Admin;

use App\AdminAccessRight;
use App\DataTables\Admin\AdminUsersDataTable;
use App\Role;
use App\Tools\SmsTools;
use App\User;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Mail;

class AdminUsersController extends Controller
{
    public function index(AdminUsersDataTable $root)
    {
        return $root->render('admin.root.users.index');
    }

    public function create(Request $request)
    {
        if($request->isMethod('POST')):

            $this->validate($request, [
                'email' => 'required|email|unique:users,email',
                'phone_number' => 'required|digits_between:9,16',
            ]);


            $inputs = $request->all();
            $inputs['phone_number'] = SmsTools::format_gh_number($request->get('phone_number'));
            $inputs['password'] = bcrypt($request['password']);
            $inputs['full_name'] = $request->first_name.' '.$request->last_name;


            $words = explode(" ", trim($inputs['first_name']).' '.trim($inputs['last_name']));
            $acronym = "";
            foreach ($words as $w) {
                if($w && isset($w[0]) && !empty($w[0]))
                    $acronym .= $w[0];
            }

            $demo = strtolower($acronym.trim($inputs['last_name']));

            $password = substr(hash('sha512',rand()),0,6);

            $username =  $this->verifyUsername($demo);

            $inputs['username'] = $username;
            $inputs['role_id'] = Role::where('name', 'admin')->first()->id;
            $inputs['password'] = bcrypt($password);
            $inputs['status'] = 'active';
            $inputs['pass'] = $password;

            DB::beginTransaction();
                $user = User::query()->create($inputs);
                AdminAccessRight::query()->create([
                   'user_id' => $user->id,
                   'value' => $request->right
                ]);
                Auth::user()->trail("CREATED ADMIN USER: $username");


            $data['email']     = $user->email;
            $data['name']      = $user->full_name;
            $data['username']  = $user->username;
            $data['password']  = $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('Login Credentials');
            });


            $route = route('admin.login');
            $msg = "Hello {$data['name']},
use the following credentisals to login
username: {$data['username']}
and password: {$password}
url: {$route}
Thank You.";
            $this->sendSms($msg,$request->input('phone_number'));


            DB::commit();

            return redirect()->route('admin.root.users')->with('success',"ADMIN: {$username} successfully created");


        endif;

        return view('admin.root.users.create');
    }

    private function verifyUsername($string)
    {
        $length = 2;
        $query = User::query()->where('username',$string)->first();
        //if query returns true that means we ought to regenerate the user the name.

        //while $query remains true
        while($query):
            $random = substr(str_shuffle(str_repeat($x='0123456789',ceil($length/strlen($x)))),1,$length);
            $string = $string.$random;
            break;
        endwhile;

        return $string;
    }

    public function destroy(Request $request)
    {
        $id = $request->id;
        if(!$id)
            return redirect()->back()->withErrors('Failure In passing User ID');

        $user = User::query()->find($id);
        try {
            $user->delete();
            \Auth::user()->logs("DELETED USER: {$user->username}");
        } catch (\Exception $e) {
            return redirect()->back()->withErrors($e->getMessage());
        }
        return redirect()->back()->with('success',"User Successfully Deleted");
    }

    public function edit(Request $request,$id)
    {
        $user  = User::query()->find($id);
        $level = AdminAccessRight::query()->where('user_id',$id)->first();

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

            $this->validate($request, [
                'email' => 'required|email|unique:users,email,'.$id,
                'phone_number' => 'required|digits_between:9,16',
            ]);


            $inputs = $request->all();
            $inputs['phone_number'] = SmsTools::format_gh_number($request->get('phone_number'));
            $inputs['full_name'] = $request->first_name.' '.$request->last_name;

            $inputs['role_id'] = Role::where('name', 'admin')->first()->id;
            $inputs['value'] = $request->right;

            DB::beginTransaction();
                     $user->update($inputs);
                     if(empty($level)):
                         AdminAccessRight::query()->create([
                             'user_id' => $user->id,
                             'value' => $request->right
                         ]);
                     else:
//
                         $level->update($inputs);

                         endif;


                Auth::user()->trail("EDITED USER: $user->username");


            DB::commit();

            return redirect()->route('admin.root.users')->with('success',"ADMIN: {$user->username} successfully updated");


        endif;

        return view('admin.root.users.edit',compact('user','level'));
    }


}
