<?php

namespace App\Http\Controllers;

use App\DataTables\UsersDataTable;
use App\DataTables\UsersNewDataTable;
use App\Jobs\UserCreationJob;
use App\Models\Helpers\General;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Session;
use Yajra\DataTables\DataTables;

class UsersController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth');
    }

    public function index(UsersNewDataTable $dataTable)
    {
        // return $dataTable->render('users.index');
        if(request()->ajax()) {
            $data = User::query()->where('id', '<>',auth()->user()->id);
               return DataTables::of($data)
                       ->addColumn('custom_column', function($row) {
                           // Custom column content here
                       })
                       ->addColumn('action', function($query) {
                        return '
                        <div class="dropdown">
                    <button class="btn dropdown-toggle" type="button" id="dropdownMenuButton" data-bs-toggle="dropdown" aria-expanded="false">
                        <i class="fas fa-cog" aria-hidden="true"></i>
                    </button>
                    <ul class="dropdown-menu" aria-labelledby="dropdownMenuButton">
                        <a class="dropdown-item" href="'.route('users.show.edit', $query->id).'">Edit</a>
                        <a class="dropdown-item" href="'.route('users.delete', $query->id).'" onclick="return confirm(\'Do you want to delete this user?\')">Delete</a>
                    </ul>
                </div>';
                       })
                       ->rawColumns(['custom_column', 'action'])
                       ->make(true);
               }
           
               return view('users.index');
    }

    public function show_create()
    {
        return view('users.create');
    }

    public function store_user(Request $request)
    {
        $prefixes = ['02', '05'];

        Session::put('user_name', $request->name);
        Session::put('user_email', $request->email);
        Session::put('user_phone', $request->phone);

        $request->validate([
            'name' => 'required|string',
            'email' => 'required|email',
            'phone' => 'required',
        ]);

        $check_phone = General::validate_phone($prefixes, $request->phone);
        if (!$check_phone) {
            General::logError('USER CREATION', 'Phone number is not valid', 'store_user in UsersController');
            return back()->with('error', 'Invalid phone number');
        } else {
            try {
                $phone_check = User::query()->where('phone', $request->phone)->first() ?? null;
                if ($phone_check !== null) {
                    return back()->with('error', 'Please use a different phone number');
                }

                $email_check = User::query()->where('email', $request->email)->first() ?? null;
                if ($email_check !== null) {
                    return back()->with('error', 'Please use a different email');
                }

                $password = General::generate_password();

                $data['name'] = $request->name;
                $data['email'] = $request->email;
                $data['phone'] = $request->phone;
                $data['password'] = Hash::make($password);

                $user = User::create($data);

                Session::forget('user_name');
                Session::forget('user_email');
                Session::forget('user_phone');
                
                $login_url = route('login');
                //Dispatch UserCreationJob to send credentials to the created user
                UserCreationJob::dispatch($user, $password, $login_url);

                //Sending credential to the created user
                $sms_data['name'] = $request->name;
                $sms_data['email'] = $request->email;
                $sms_data['phone'] = $request->phone;
                $sms_data['password'] = $password;

                General::send_user_credential($sms_data);

                return back()->with('success', 'User has been created successfully');
            } catch (\Throwable $th) {
                General::logError('USER CREATION', $th->getMessage(), 'store_user in UsersController');
                return back()->with('error', 'User creation failed');
            }
        }
    }

    public function show_edit($id)
    {
        $user = User::find($id) ?? null;
        if ($user !== null) {
            return view('users.edit', compact('user'));
        } else {
            return back()->with('error', 'This user cannot be identified');
        }
        
    }

    public function store_user_edit(Request $request, $id)
    {
        General::logError('EDITING A USER', json_encode($request->all()), 'store_user_edit in UserController');
        $prefixes = ['02', '05'];

        $request->validate([
            'name' => 'required|string',
            'email' => 'required|email',
            'phone' => 'required',
        ]);

        $check_phone = General::validate_phone($prefixes, $request->phone);
        if (!$check_phone) {
            General::logError('EDITING USER DATA', 'Phone number is not valid', 'store_user in UsersController');
            return back()->with('error', 'Invalid phone number');
        } else {
            try {
                $user = User::find($id) ?? null;
                if ($user !== null) {
                    $data['name'] = $request->name;
                    $data['email'] = $request->email;
                    $data['phone'] = $request->phone;

                    $user->update($data);

                    return back()->with('success', 'User has been edited successfully');
                } else {
                    General::logError('EDITING USER', 'User does not seem to exist', 'store_user_edit in UsersController');
                    return back()->with('error', 'Failed to make changes to user data');
                }
            } catch (\Throwable $th) {
                General::logError('USER CREATION', $th->getMessage(), 'store_user in UsersController');
                return back()->with('error', 'User creation failed');
            }
        }
    }

    public function delete_user($id)
    {
        $user = User::find($id) ?? null;
        if ($user !== null) {
            $user->delete();
            return back()->with('success', 'User has been deleted');
        } else {
            General::logError('DELETING A USER', 'Failed to delete the user with id: '. $id, 'delete_user in UsersController');
        }
        
    }
}
