<?php

namespace App\Http\Controllers\Admin;

use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use App\Helpers\Helper;
use App\Http\Controllers\Controller;
use App\Http\Resources\Admin\CounselingResource;
use App\Counseling;
use Validator;

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

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

    public function index(Request $request)
    {
        $searchParams = $request->all();
        $list = Counseling::notDeleted();
        $limit = Arr::get($searchParams, 'limit', static::ITEM_PER_PAGE);
        $keyword = Arr::get($searchParams, 'keyword', '');
        $status = Arr::get($searchParams, 'status', '');

        if (!empty($keyword)) {
            $list->where('title', 'LIKE', '%' . $keyword . '%');
        }
        if ($status != '') {
            $list->where('is_activated', $status);
        }
        $list->orderBy('id', 'ASC');

        return CounselingResource::collection($list->paginate($limit));
    }

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

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

    public function show($id = 0)
    {
        $counseling = Counseling::notDeleted()->where('id', $id)->first();
        if (!isset($counseling)) return response()->json(['errors' => 'Counseling is not valid'], 403);

        return new CounselingResource($counseling);
    }

    public function store(Request $request)
    {
        $validator = Validator::make($request->all(), ['title' => ['required'], 'description' => ['required'], 'is_activated' => ['required']]);
        if ($validator->fails()) return response()->json(['errors' => $validator->errors()], 403);

        $params = $request->all();
        $counseling = Counseling::create([
            'title'        => $params['title'],
            'slug'         => Helper::slug($params['title']),
            'description'  => $params['description'],
            'content'      => $params['content'],
            'thumbnail'    => $params['thumbnail'],
            'note'         => $params['note'],
            'is_activated' => ($params['is_activated'] === true) ? 1 : 0,
            'created_at'   => date('Y-m-d H:i:s'),
            'updated_at'   => date('Y-m-d H:i:s')
        ]);

        return new CounselingResource($counseling);
    }

    public function update($id = 0, Request $request)
    {
        $validator = Validator::make($request->all(), ['title' => ['required'], 'description' => ['required'], 'is_activated' => ['required']]);
        if ($validator->fails()) return response()->json(['errors' => $validator->errors()], 403);

        $counseling = Counseling::notDeleted()->where('id', $id)->first();
        if (!isset($counseling)) return response()->json(['errors' => 'Counseling is not valid'], 403);

        $params = $request->all();
        $counseling->update([
            'title'        => $params['title'],
            'slug'         => Helper::slug($params['title']),
            'description'  => $params['description'],
            'content'      => $params['content'],
            'thumbnail'    => $params['thumbnail'],
            'note'         => $params['note'],
            'is_activated' => ($params['is_activated'] === true) ? 1 : 0,
            'updated_at'   => date('Y-m-d H:i:s')
        ]);

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

    public function destroy($id = 0)
    {
        $counseling = Counseling::notDeleted()->where('id', $id)->first();
        if (!isset($counseling)) response()->json(['error' => 'Ehhh! Can not delete this counseling'], 403);

        try {
            $counseling->update(['is_deleted' => true]);
        } 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', []);
        $counselingList = Counseling::notDeleted()->whereIn('id', $listIds)->get();

        if ($counselingList->count() <= 0) response()->json(['error' => 'Counseling is not valid.'], 403);
        try {
            Counseling::notDeleted()->whereIn('id', $listIds)->update(['is_deleted' => true]);
        } 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', []);
        $counselingList = Counseling::notDeleted()->whereIn('id', $listIds)->get();

        if ($counselingList->count() <= 0) response()->json(['error' => 'Counseling is not valid.'], 403);
        try {
            Counseling::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', []);
        $counselingList = Counseling::notDeleted()->whereIn('id', $listIds)->get();

        if ($counselingList->count() <= 0) response()->json(['error' => 'Counseling is not valid.'], 403);
        try {
            Counseling::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);
    }
}
