/**
  * Update the specified user in storage.
  * @param  string        $username
  * @param GenericRequest $request
  * @return \Illuminate\Http\Response
  */
 public function update($username, GenericRequest $request)
 {
     $user = User::where('username', $username)->firstOrFail();
     $ownAccount = $user->id == $this->user->id;
     // If performing a general save then validate the inputs and perform the
     // update, setting the account type as necessary. If updating the active
     // user, the restricted attributes will be set to their current values.
     if ($request->get('action') == 'save') {
         $data = $request->stripped('name', 'username', 'nickname', 'email', 'phone', 'dob', 'address', 'tool_colours', 'type') + ['show_email' => $request->has('show_email'), 'show_phone' => $request->has('show_phone'), 'show_address' => $request->has('show_address'), 'show_age' => $request->has('show_age')];
         $data['dob'] = $data['dob'] ?: null;
         if ($ownAccount) {
             $data['username'] = $user->username;
             $data['type'] = $user->type;
         }
         $validator = Validator::make($data, $user->getProfileValidationRules(), $user->getProfileValidationMessages());
         if ($validator->fails()) {
             return redirect()->back()->withInput($data)->withErrors($validator);
         } else {
             if ($user->update($data)) {
                 Flash::success('User updated');
                 return redirect(route('user.index'));
             } else {
                 Flash::error('Something went wrong while updating the user');
                 return redirect(route('user.edit', $username));
             }
         }
     } else {
         if ($request->get('action') == 'archive') {
             if ($ownAccount) {
                 Flash::warning('You cannot archive your own account');
             } else {
                 if ($user->archive()) {
                     Flash::success('User archived');
                 } else {
                     Flash::error('Something went wrong when archiving the user');
                 }
             }
             return redirect(route('user.edit', $username));
         } else {
             if ($request->get('action') == 'unarchive') {
                 if ($user->update(['status' => true])) {
                     Flash::success('User unarchived');
                 } else {
                     Flash::error('Something went wrong when unarchiving the user');
                 }
                 return redirect(route('user.edit', $username));
             } else {
                 if ($request->get('action') == 'change-pic') {
                     $file = $request->file('avatar');
                     if (!$file) {
                         Flash::warning('Please select an image to use');
                     } else {
                         $user->setAvatar($file);
                         Flash::success('Profile picture changed');
                     }
                     return redirect(route('user.edit', $username));
                 } else {
                     if ($request->get('action') == 'remove-pic') {
                         if ($user->hasAvatar()) {
                             $path = base_path('public') . $user->getAvatarUrl();
                             if (is_writeable($path)) {
                                 unlink($path);
                                 Flash::success("Profile picture removed");
                             } else {
                                 Flash::error("The user's picture is not writeable");
                             }
                         }
                         return redirect(route('user.edit', $username));
                     } else {
                         if ($request->get('action') == 'reset-password') {
                             $password = str_random(15);
                             $user->update(['password' => bcrypt($password)]);
                             Flash::success('New password sent');
                             Mail::queue('emails.users.reset_password', ['name' => $user->forename, 'password' => $password], function ($message) use($user) {
                                 $message->subject('Your new password')->to($user->email, $user->name);
                             });
                             return redirect(route('user.edit', $username));
                         } else {
                             return redirect(route('user.edit', $username));
                         }
                     }
                 }
             }
         }
     }
 }
 /**
  * Validate a event crew form submission.
  * @param \App\Http\Requests\GenericRequest $request
  * @param \App\Event                        $event
  * @param bool                              $validateUser
  */
 private function validateCrew(GenericRequest $request, Event $event, $validateUser = true)
 {
     if ($request->has('guest') && $event->isSocial()) {
         $this->validate($request, ['guest_name' => 'required'], ['guest_name.required' => 'Please enter the guest\'s name']);
     } else {
         $this->validate($request, ['user_id' => 'required' . ($validateUser ? '|exists:users,id' : ''), 'name' => 'required_if:core,1'], ['user_id.required' => 'Please select a member', 'user_id.exists' => 'Please select a member', 'name.required_if' => 'Please enter a role title']);
     }
 }