<?php

namespace App\Http\Controllers\Admin;

use App\Actions\User\CreateUser;
use App\Actions\User\UpdateUser;
use Spatie\Permission\Models\Role;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use App\Http\Requests\UserFormRequest;
use App\Models\Admin;
use App\Models\Countries;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Http\Request;

class UserController extends Controller
{
    use ValidatesRequests;

    public function dashboard()
    {
        session(['layout_mode' => 'left_nav']);

        return view('admin.index');
    }

    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index(Request $request)
    {
        abort_if(!userCan('admin.view'), 403);
        $query = Admin::query();
        $query->where('id', '!=', 1);
        if ($request->keyword && $request->keyword != null) {
            $query->where('name', 'LIKE', "%$request->keyword%")
            ->orWhere('email', 'LIKE', "%$request->keyword%");
        }
        $users = $query->where('id', '!=', 1)->Paginate(10);
        // $users = Admin::where('id', '!=', 1)->Paginate(10);
        return view('admin.users.index', compact('users'));
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        abort_if(!userCan('admin.create'), 403);

        $roles = Role::all();
        return view('admin.users.create', compact('roles'));
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\UserFormRequest  $request
     * @return \Illuminate\Http\Response
     */
    public function store(UserFormRequest $request)
    {
        abort_if(!userCan('admin.create'), 403);

        try {
            CreateUser::create($request);

            flashSuccess(__('user_created_successfully'));
            return back();
        } catch (\Throwable $th) {
            flashError($th->getMessage());
            return back();
        }
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit(Admin $user)
    {
        abort_if(!userCan('admin.edit'), 403);

        $roles = Role::all();
        return view('admin.users.edit', compact('roles', 'user'));
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(UserFormRequest $request, Admin $user)
    {
        abort_if(!userCan('admin.edit'), 403);

        try {
            UpdateUser::update($request, $user);

            flashSuccess(__('user_updated_successfully'));
            return back();
        } catch (\Throwable $th) {
            flashError($th->getMessage());
            return back();
        }
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy(Admin $user)
    {
        abort_if(!userCan('admin.delete'), 403);

        try {
            if (!is_null($user)) {
                $user->delete();
            }

            flashSuccess(__('user_deleted_successfully'));
            return back();
        } catch (\Throwable $th) {
            flashError($th->getMessage());
            return back();
        }
    }

    public function userStatusChange(Request $request)
    {

        abort_if(!userCan('admin.edit'), 403);
        $user = Admin::findOrFail($request->id);
        if($request->type == 'status'){
            $user->status = $request->status;
        }
        if($request->type == 'allowed_ip'){
            if(userCan('admin.allowedIP')){
                $user->allowed_ip = $request->status;
            }else{
                return response()->json(['error' => 'Something Went Wrong. .'], 500);
            }
            
        }
        $user->save();
       
        if ($request->status == 1) {
            return responseSuccess(__('Activated successfully'));
        } else {
            return responseSuccess(__('Deactivated successfully'));
        }
    }


    
    public function assignedUser(Request $request)
    {
        abort_if(!userCan('leadAssignSystem.view'), 403);

        $roleEnvNames = explode(',', env('AVAILABLE_LEAD_ROLES', 'Lead Manager,Operation Manager'));
 
        $query = Admin::query();
        $query->where('id', '!=', 1);
        $query->where('status', 1);
        $query->whereHas('roles', function ($query) use ($roleEnvNames) {
            $query->whereIn('name', $roleEnvNames);
        });
    
        if ($request->keyword && $request->keyword != null) {
            $query->where(function ($query) use ($request) {
                $query->where('name', 'LIKE', "%$request->keyword%")
                    ->orWhere('email', 'LIKE', "%$request->keyword%");
            });
        }
      
       
        $users = $query->where('id', '!=', 1)->Paginate(10);
        $countries = Countries::all('id', 'name');
      
        return view('admin.users.assignedUser', compact('users','countries'));
    }

    
    public function userAssignleadChange(Request $request)
    {

        // DD($request->all());
        abort_if(!userCan('leadAssignSystem.view'), 403);
        $user = Admin::findOrFail($request->id);
        if($request->type == 'assign_lead'){
            $user->assign_lead = $request->assign_lead;
        }
      
        $user->save();

        if ($request->assign_lead == 1) {
            return responseSuccess(__('Activated successfully'));
        } else {
            return responseSuccess(__('Deactivated successfully'));
        }
    }

    public function userAssignCountryID(Request $request)
    {
   
        abort_if(!userCan('leadAssignSystem.assigneCountry'), 403);
        $user = Admin::findOrFail($request->id);
        if($request->country_id){
            $country_ids = implode(",", $request->country_id);
            $user->assign_country_id = $country_ids;
        }
      
        $user->save();
        return responseSuccess("Country Assign successfully");
       
    }
    


}
