<?php

namespace App\Http\Controllers\Admin;

use App\Article;
use App\Http\Resources\UserResource;
use App\Laravue\Models\Role;
use App\Laravue\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use App\Http\Resources\Admin\CareResource;
use App\Http\Controllers\Controller;
use App\Helpers\Helper;
use App\Care;
use Illuminate\Support\Facades\Hash;
use Validator;
use Auth;

/**
 * Class CareController
 *
 * @package App\Http\Controllers
 */
class CareController extends Controller
{
    const ITEM_PER_PAGE = 20;
    protected $_pathFile;
    protected $_pathTemp;

    public function __construct()
    {
        $this->_pathFile = public_path('uploads/image/article/');
        $this->_pathTemp = storage_path('app/public/uploads/temp/image/');
    }

    public function index(Request $request)
    {
        $searchParams = $request->all();
        $userQuery = User::query();
        $limit = Arr::get($searchParams, 'limit', static::ITEM_PER_PAGE);
        $role = 'nursingstaff'; //Arr::get($searchParams, 'role', '');
        $keyword = Arr::get($searchParams, 'keyword', '');

        $userQuery->whereHas('roles', function ($q) use ($role) {
            $q->where('name', $role);
        });

        if ($keyword != "" && $keyword != null) {
            $userQuery->where(function ($query) use ($keyword) {
                $query->where('name', 'LIKE', '%' . $keyword . '%')
                    ->orWhere('email', 'LIKE', '%' . $keyword . '%');
            });
        }
        $userQuery->orderBy('id', 'DESC');

        return CareResource::collection($userQuery->paginate($limit));
    }

    public function all()
    {
        $list = Care::select('id', 'title', 'slug')->notDeleted()->orderBy('id');

        return CareResource::collection($list->get());
    }

    public function show(User $user)
    {
        $userCheck = User::select('id')
            ->where('id', $user->id)
            ->whereHas('roles', function ($q) {
                $q->where('name', 'nursingstaff');
            })
            ->first();

        if ($userCheck === null || !isset($userCheck->id)) {
            return response()->json(['error' => 'User not found'], 404);
        }

        return new CareResource($user);
    }

    public function store(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'name'            => ['required'],
            'slug'            => ['required'],
            'full_name'       => ['required'],
            'furigana_name'   => ['required'],
            'email'           => ['required'],
            'counseling_id'   => ['required'],
            'password'        => ['required', 'min:6'],
            'confirmPassword' => 'same:password',
        ]);
        if ($validator->fails()) return response()->json(['errors' => $validator->errors()], 403);

        $email = $request->get('email');
        $found = User::where('email', $email)->first();
        if ($found && $found->id !== null) {
            return response()->json(['error' => 'Email has been taken'], 403);
        }

        $params = $request->all();
        $slug = Helper::slug($params['slug']);
        if (empty($slug)) $slug = Helper::slug($params['name']);

        $checkSlug = User::where('slug', $slug)->first();
        if ($checkSlug && $checkSlug->id !== null) {
            return response()->json(['error' => 'Url has been taken'], 403);
        }

        $user = User::create([
            'name'          => $params['name'],
            'slug'          => $slug,
            'full_name'     => $params['full_name'],
            'furigana_name' => $params['furigana_name'],
            'gender'        => $params['gender'],
            'address'       => $params['address'],
            'email'         => $params['email'],
            'password'      => Hash::make($params['password']),
            'phone_number'  => $params['phone_number'],
            'avatar'        => $params['avatar'],
            'counseling_id' => $params['counseling_id'],
            'career'        => $params['career'],
            'qualification' => $params['qualification'],
            'introduction'  => $params['introduction'],
            'created_by'    => auth('api')->user()->id,
            'created_at'    => date('Y-m-d H:i:s'),
            'updated_at'    => date('Y-m-d H:i:s')
        ]);

        $role = Role::findByName('nursingstaff');
        $user->syncRoles($role);

        return new CareResource($user);
    }

    public function update(Request $request, User $user)
    {
        if ($user === null) {
            return response()->json(['error' => 'User not found'], 404);
        }

        if ($user->isAdmin()) {
            return response()->json(['error' => 'Admin can not be modified'], 403);
        }

        $validator = Validator::make($request->all(), [
            'name'          => ['required'],
            'slug'          => ['required'],
            'full_name'     => ['required'],
            'furigana_name' => ['required'],
            'email'         => ['required'],
            'counseling_id' => ['required'],
        ]);
        if ($validator->fails()) return response()->json(['errors' => $validator->errors()], 403);

        $email = $request->get('email');
        $found = User::where('email', $email)->first();
        if ($found && $found->id !== $user->id) {
            return response()->json(['error' => 'Email has been taken'], 403);
        }

        $params = $request->all();
        $slug = Helper::slug($params['slug']);
        if (empty($slug)) $slug = Helper::slug($params['name']);

        $checkSlug = User::where('slug', $slug)->first();
        if ($checkSlug && $checkSlug->id !== $user->id) {
            return response()->json(['error' => 'Url has been taken'], 403);
        }

        $user->update([
            'name'          => $params['name'],
            'slug'          => $slug,
            'full_name'     => $params['full_name'],
            'furigana_name' => $params['furigana_name'],
            'gender'        => $params['gender'],
            'address'       => $params['address'],
            'email'         => $params['email'],
            'phone_number'  => $params['phone_number'],
            'avatar'        => $params['avatar'],
            'counseling_id' => $params['counseling_id'],
            'career'        => $params['career'],
            'qualification' => $params['qualification'],
            'introduction'  => $params['introduction'],
            'updated_at'    => date('Y-m-d H:i:s')
        ]);

        return response()->json(null, 204);
    }

    public function destroy(User $user)
    {
        if ($user->isAdmin()) {
            response()->json(['error' => 'Ehhh! Can not delete admin user'], 403);
        }

        try {
            $user->delete();
            Article::where('user_id', $user->id)->update(['user_id' => 1]);
        } catch (\Exception $ex) {
            response()->json(['error' => $ex->getMessage()], 403);
        }

        return response()->json(null, 204);
    }

    public function destroyMultiple(Request $request)
    {
        $validator = Validator::make($request->all(), ['ids' => 'required']);
        if ($validator->fails()) return response()->json(['errors' => $validator->errors()], 403);
        $listIds = $request->get('ids', []);
        $careList = User::whereIn('id', $listIds)
            ->whereHas('roles', function ($q) {
                $q->where('name', 'nursingstaff');
            })
            ->get();
        if ($careList->count() <= 0) response()->json(['error' => 'Nursing Staff is not valid.'], 403);

        try {
            User::whereIn('id', $listIds)
                ->whereHas('roles', function ($q) {
                    $q->where('name', 'nursingstaff');
                })
                ->delete();
            Article::whereIn('user_id', $listIds)->update(['user_id' => 1]);
        } catch (\Exception $ex) {
            response()->json(['error' => $ex->getMessage()], 403);
        }

        return response()->json(null, 204);
    }

    public function activateMultiple(Request $request)
    {
        $validator = Validator::make($request->all(), ['ids' => 'required']);
        if ($validator->fails()) return response()->json(['errors' => $validator->errors()], 403);
        $listIds = $request->get('ids', []);
        $careList = Care::notDeleted()->whereIn('id', $listIds)->get();

        if ($careList->count() <= 0) response()->json(['error' => 'Nursing Staff is not valid.'], 403);
        try {
            Care::notDeleted()->whereIn('id', $listIds)->update(['is_activated' => true]);
        } catch (\Exception $ex) {
            response()->json(['error' => $ex->getMessage()], 403);
        }

        return response()->json(null, 204);
    }

    public function deactivateMultiple(Request $request)
    {
        $validator = Validator::make($request->all(), ['ids' => 'required']);
        if ($validator->fails()) return response()->json(['errors' => $validator->errors()], 403);
        $listIds = $request->get('ids', []);
        $careList = Care::notDeleted()->whereIn('id', $listIds)->get();

        if ($careList->count() <= 0) response()->json(['error' => 'Nursing Staff is not valid.'], 403);
        try {
            Care::notDeleted()->whereIn('id', $listIds)->update(['is_activated' => false]);
        } catch (\Exception $ex) {
            response()->json(['error' => $ex->getMessage()], 403);
        }

        return response()->json(null, 204);
    }

    public function uploadImage(Request $request)
    {
        if ($request->hasFile('image')) {
            $file = $request->file('image');
            $baseName = $file->getClientOriginalName();
            $fileName = md5($baseName . rand(1111, 9999) . date('YmdHis')) . '.' . $file->getClientOriginalExtension();
            $file->move($this->_pathTemp, $fileName);
            chmod($this->_pathTemp . $fileName, 0777);
            return response()->json(['status' => 'success', 'message' => 'Upload Success.', 'file_name' => $fileName, 'baseName' => $baseName], 200);
        }

        return response()->json(['status' => 'error', 'message' => 'Upload Fail.', 'file_name' => null], 403);
    }

    public function uploadImages(Request $request)
    {
        if ($request->hasFile('file')) {
            $file = $request->file('file');
            $baseName = $file->getClientOriginalName();
            $fileName = md5($baseName . rand(1111, 9999) . date('YmdHis')) . '.' . $file->getClientOriginalExtension();
            $file->move($this->_pathFile, $fileName);
            chmod($this->_pathFile . $fileName, 0777);
            return response()->json(['hasSuccess' => true, 'message' => 'Upload Success.', 'file_name' => $fileName, 'baseName' => $baseName, 'files' => ['file' => $fileName]], 200);
        }

        return response()->json(['hasSuccess' => false, 'message' => 'Upload Fail.', 'file_name' => null, 'files' => null], 403);
    }
}
