<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use App\Http\Requests\Auth\User as Request;
use Illuminate\Http\Request as ARequest;
use App\Models\Auth\User;
use App\Models\Auth\Role;

use Auth;

class Users extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return Response
     */
    public function index()
    {
        $users = User::with('roles')->collect();

        $roles = collect(Role::all()->pluck('display_name', 'id'))
            ->prepend(trans('general.all_type', ['type' => trans_choice('general.roles', 2)]), '');

        return view('auth.users.index', compact('users', 'roles'));
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return Response
     */
    public function create()
    {
        $roles = Role::all()->reject(function($r) {
            return $r->hasPermission('read-customer-panel');
        });

        $companies = Auth::user()->companies()->get()->sortBy('name');
        foreach ($companies as $company) {
            $company->setSettings();
        }

        return view('auth.users.create', compact('roles', 'companies'));
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  Request  $request
     *
     * @return Response
     */
    public function store(Request $request)
    {
        // Upload picture
        $picture = $request->file('picture');
        if ($picture && $picture->isValid()) {
            $request['picture'] = $picture->store('uploads/users');
        }
        
        // Create user
        $user = User::create($request->input());

        // Attach roles
        $user->roles()->attach($request['roles']);

        // Attach companies
        $user->companies()->attach($request['companies']);

        $message = trans('messages.success.added', ['type' => trans_choice('general.users', 1)]);

        flash($message)->success();

        return redirect('auth/users');
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  User  $user
     *
     * @return Response
     */
    public function edit(User $user)
    {
        if ($user->customer) {
            // Show only roles with customer permission
            $roles = Role::all()->reject(function($r) {
                return !$r->hasPermission('read-customer-panel');
            });
        } else {
            // Don't show roles with customer permission
            $roles = Role::all()->reject(function($r) {
                return $r->hasPermission('read-customer-panel');
            });
        }

        $companies = Auth::user()->companies()->get()->sortBy('name');
        foreach ($companies as $company) {
            $company->setSettings();
        }

        return view('auth.users.edit', compact('user', 'companies', 'roles'));
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  User  $user
     * @param  Request  $request
     *
     * @return Response
     */
    public function update(User $user, Request $request)
    {
        // Upload picture
        $picture = $request->file('picture');
        if ($picture && $picture->isValid()) {
            $request['picture'] = $picture->store('users');
        }

        // Do not reset password if not entered/changed
        if (empty($request['password'])) {
            unset($request['password']);
            unset($request['password_confirmation']);
        }

        // Update user
        $user->update($request->input());

        // Sync roles
        $user->roles()->sync($request['roles']);

        // Sync companies
        $user->companies()->sync($request['companies']);

        $message = trans('messages.success.updated', ['type' => trans_choice('general.users', 1)]);

        flash($message)->success();

        return redirect('auth/users');
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  User  $user
     *
     * @return Response
     */
    public function destroy(User $user)
    {
        // Can't delete yourself
        if ($user->id == \Auth::user()->id) {
            $message = trans('auth.error.self_delete');

            flash($message)->error();

            return redirect('auth/users');
        }

        $user->delete();

        $message = trans('messages.success.deleted', ['type' => trans_choice('general.users', 1)]);

        flash($message)->success();

        return redirect('auth/users');
    }

    /**
     * Mark upcoming bills notifications are read and redirect to bills page.
     *
     * @param  User  $user
     *
     * @return Response
     */
    public function readUpcomingBills(User $user)
    {
        // Mark bill notifications as read
        foreach ($user->unreadNotifications as $notification) {
            // Not a bill notification
            if ($notification->getAttribute('type') != 'App\Notifications\Expense\Bill') {
                continue;
            }

            $notification->markAsRead();
        }

        // Redirect to bills
        return redirect('expenses/bills');
    }

    /**
     * Mark overdue invoices notifications are read and redirect to invoices page.
     *
     * @param  User  $user
     *
     * @return Response
     */
    public function readOverdueInvoices(User $user)
    {
        // Mark invoice notifications as read
        foreach ($user->unreadNotifications as $notification) {
            // Not an invoice notification
            if ($notification->getAttribute('type') != 'App\Notifications\Income\Invoice') {
                continue;
            }

            $notification->markAsRead();
        }

        // Redirect to invoices
        return redirect('incomes/invoices');
    }

    /**
     * Mark items out of stock notifications are read and redirect to items page.
     *
     * @param  User  $user
     *
     * @return Response
     */
    public function readItemsOutOfStock(User $user)
    {
        // Mark item notifications as read
        foreach ($user->unreadNotifications as $notification) {
            // Not an item notification
            if ($notification->getAttribute('type') != 'App\Notifications\Item\Item') {
                continue;
            }

            $notification->markAsRead();
        }

        // Redirect to items
        return redirect('items/items');
    }

    public function autocomplete(ARequest $request)
    {
        $user = false;

        $column = $request['column'];
        $value = $request['value'];

        if (!empty($column) && !empty($value)) {
            switch ($column) {
                case 'id':
                    $user = User::find();
                    break;
                case 'email':
                    $user = User::where('email', $value)->first();
                    break;
                default:
                    $user = User::where($column, $value)->first();
            }
        }

        return response()->json([
            'errors'  => ($user) ? false: true,
            'success' => ($user) ? true: false,
            'data'    => $user
        ]);
    }
}