<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2019/4/9 0009
 * Time: 14:05
 */

namespace App\Http\Controllers\Admin;


use App\Http\Models\Permission;
use App\Http\Models\Role;
use App\Http\Models\Site;
use App\Http\Models\User;
use App\Http\Requests\CustomerUser\CustomerUserSaveRequest;
use App\Http\Traits\HasSites;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;

/**
 * 客户用户管理
 * Class CustomerUserController
 * @package App\Http\Controllers\Admin
 */
class CustomerUserController extends Controller
{
    use HasSites;

    //用户列表
    public function index(Request $request)
    {

        $oneSite = $this->hasUserOneSite();
        if (!$request->ajax()) {
            return view('admin/customer_user/user', [
                'roles' => Role::all()
            ]);
        }


        if ($keyword = $request->input('keyword')) {
            $filter[] = ['username', 'like', '%' . $keyword . '%'];
        }

        $filter[] = ['role_id', '=', Role::TYPE_TYPE_CUSTOMER_STAFF];

        $select = ['id', 'username', 'email', 'created_at', 'role_id', 'status', 'is_super', 'nickname'];
        $roles = User::query()->with('role')->select($select)
            ->where($filter ?? [])->whereHas('sites', function (Builder $builder) use ($oneSite) {
                $builder->where('id', $oneSite->id);
            })->orderByDesc('id')
            ->paginate($request->input('pageSize') ?? TABLE_PAGE_SIZE);


        $items = $roles->items();

        array_walk($items, function ($item) {
            $item->role_name = '客户雇员';
            $item->status_title = $item->status_with_css;
            unset($item->role);
        });
        return response()->json([
            'rows' => $items,
            'total' => $roles->total()
        ]);
    }

    //用户权限
    public function userPermission(Request $request)
    {

        $userIds = $request->input('userIds');
        if (!$request->ajax()) {

            $selects = [];
            if (count($userIds) == 1) {
                $user = User::query()->where(['id' => $userIds[0]])->first();
                if (!$user) {
                    return response()->json(['message' => '参数错误'], 400);
                }
                $selects = $user->permissions->pluck('id')->toArray();
            }


            /*  $nowUser = auth()->user();
              $permissions = $nowUser->permissions()
                  ->select(['title as name', 'id', 'parent_id', 'type'])->get()->toArray();*/

            $permissionsIds = DB::table('role_has_permissions')->where('role_id', Role::TYPE_CUSTOMER)->pluck('permission_id');
            $permissions = Permission::query()->whereIn('id', $permissionsIds)->get()->toArray();

            array_walk($permissions, function (&$item) use ($selects) {
                $item['open'] = true;
                $item['name'] = $item['title'] . ($item['type'] == 1 ? '【菜单】' : '【功能】');
                if (in_array($item['id'], $selects)) {
                    $item['checked'] = true;
                }
            });
            $trees = list_to_tree($permissions, 'id', 'parent_id', 'children');
            return view('admin/customer_user/user_permission', [
                'trees' => $trees,
                'userIds' => $userIds
            ]);
        }

        $permissionIds = $request->input('permissionIds');
        $records = User::query()->whereIn('id', $userIds)->get();
        foreach ($records as $record) {
            $record->permissions()->sync($permissionIds);
        }
        return response()->json(['message' => '操作成功']);


    }

    //保存
    public function store(CustomerUserSaveRequest $request)
    {
        $validated = $request->validated();

        $validated['password'] = bcrypt($validated['password']);
        $validated['profile_img'] = asset('img/social_round_github_64px_1196568_easyicon.net.png');

        $validated['role_id'] = Role::TYPE_TYPE_CUSTOMER_STAFF;//公司雇员
        $user = User::query()->create($validated);
        /**@var  \App\Http\Models\User $user * */

        $oneSite = $this->hasUserOneSite();
        if (!$oneSite) {
            return response()->json(['message' => '当前用户未分配站点'], 400);
        }

        $user->sites()->sync([$oneSite->id]);

        $nowUserPermissions = auth()->user()->permissions->pluck('id')->toArray();
        //剔除用户管理的权限
        $searchIndex = array_search(39, $nowUserPermissions);
        if ($searchIndex !== false) {
            unset($nowUserPermissions[$searchIndex]);
        }

        $user->permissions()->sync(array_values($nowUserPermissions));

        return response()->json(['message' => '操作成功']);
    }

    //修改
    public function update(CustomerUserSaveRequest $request, $id)
    {
        $user = User::query()->where(['id' => $id])->first();
        /**@var  \App\Http\Models\User $user * */
        if (!$user) return response()->json(['message' => '数据不存在']);
        $validated = $request->validated();

        $user->update($validated);
        return response()->json(['message' => '操作成功']);
    }

    public function show($id)
    {
        if ($id > 0) {
            $user = User::query()->with('sites')->where(['id' => $id])->first();
            $hasSiteIds = $user->sites->pluck('id')->toArray(); //用户所关联的站点
        }
        return view('admin/customer_user/user_show', [
            'user' => $user ?? null,
            'roles' => Role::query()->select(['id', 'name'])->get(),
            'sites' => Site::all(),
            'hasSiteIds' => $hasSiteIds ?? []
        ]);
    }

    public function detail($id)
    {
        $user = User::query()->select()->find($id);
        return view('/admin/customer_user/user_detail', [
            'user' => $user
        ]);
    }

    public function destroy($id)
    {
        User::destroy($id);
        return response()->json(['message' => '操作成功']);
    }

    public function batchDestroy(Request $request)
    {
        $ids = $request->input('ids');
        User::destroy($ids);
        return response()->json(['message' => '操作成功']);
    }

    //用户状态切换 启用
    public function on(Request $request)
    {
        $ids = $request->input('ids');
        User::query()->whereIn('id', $ids)->update(['status' => 1]);
        return response()->json(['message' => '操作成功']);
    }

    //用户状态切换 禁用
    public function off(Request $request)
    {
        $ids = $request->input('ids');
        User::query()->whereIn('id', $ids)->update(['status' => 0]);
        return response()->json(['message' => '操作成功']);
    }
}