<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use App\Contact;
use App\Http\Resources\Admin\ContactResource;
use Validator;

/**
 * Class ContactController
 *
 * @package App\Http\Controllers
 */
class ContactController extends Controller
{
    const ITEM_PER_PAGE = 20;

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

        if (!empty($keyword)) {
            $list->where(function($query) use ($keyword) {
                $query->where('name', 'LIKE', '%' . $keyword . '%')
                      ->orWhere('id', $keyword);
                
                // Check if keyword matches type descriptions or partial matches
                if (strpos('着物の保管サービスを相談する', $keyword) !== false) {
                    $query->orWhere('type', 0);
                }
                if (strpos('着物のお手入れ相談する', $keyword) !== false) {
                    $query->orWhere('type', 1);
                }
                if (strpos('その他', $keyword) !== false) {
                    $query->orWhereIn('type', [2, 3]);
                }
            });
        }
	    
	    if ($type != '' && $type != null && in_array($type, [0, 1, 2])) {
			if ($type == 0 || $type == 1) {
				$list->where('type', $type);
			} else {
				$list->whereIn('type', [2, 3]);
			}
	    }

        if ($status != '' && $status != null && in_array($status, [0, 1, 2])) {
            $list->where('status', $status);
        }

        $list->orderBy('id', 'DESC')->orderBy('is_read');

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

    public function all()
    {
        $list = Contact::select('id', 'name', 'slug')->where('is_deleted', false)->orderBy('id');

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

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

        return new ContactResource($contact);
    }

    public function read($id = 0)
    {
        $contact = Contact::where('is_deleted', false)->where('id', $id)->first();
        if (!isset($contact)) return response()->json(['errors' => 'Contact is not valid'], 403);
        $contact->update(['is_read' => true]);

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

    public function store(Request $request)
    {
        $validator = Validator::make($request->all(), ['name' => ['required'], 'is_read' => ['required']]);
        if ($validator->fails()) return response()->json(['errors' => $validator->errors()], 403);
        $params = $request->all();
        $contact = Contact::create([
            'name'        => $params['name'],
            'slug'        => $params['name'],
            'description' => $params['description'],
            'is_read'     => ($params['is_read'] === true) ? 1 : 0,
            'created_at'  => date('Y-m-d H:i:s'),
            'updated_at'  => date('Y-m-d H:i:s')
        ]);

        return new ContactResource($contact);
    }

    public function update($id = 0, Request $request)
    {
        $validator = Validator::make($request->all(), ['name' => ['required'], 'is_read' => ['required']]);
        if ($validator->fails()) return response()->json(['errors' => $validator->errors()], 403);
        $contact = Contact::notDeleted()->where('id', $id)->first();
        if (!isset($contact)) return response()->json(['errors' => 'Contact is not valid'], 403);
        $params = $request->all();
        $contact->update([
            'name'        => $params['name'],
            'slug'        => $params['name'],
            'description' => $params['description'],
            'is_read'     => ($params['is_read'] === true) ? 1 : 0,
            'updated_at'  => date('Y-m-d H:i:s')
        ]);

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

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

        try {
            $contact->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', []);
        $contactList = Contact::notDeleted()->whereIn('id', $listIds)->get();
        if ($contactList->count() <= 0) response()->json(['error' => 'Contact is not valid.'], 403);
        try {
            Contact::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', []);
        $contactList = Contact::notDeleted()->whereIn('id', $listIds)->get();
        if ($contactList->count() <= 0) response()->json(['error' => 'Contact is not valid.'], 403);
        try {
            Contact::notDeleted()->whereIn('id', $listIds)->update(['is_read' => 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', []);
        $contactList = Contact::notDeleted()->whereIn('id', $listIds)->get();
        if ($contactList->count() <= 0) response()->json(['error' => 'Contact is not valid.'], 403);
        try {
            Contact::notDeleted()->whereIn('id', $listIds)->update(['is_read' => false]);
        } catch (\Exception $ex) {
            response()->json(['error' => $ex->getMessage()], 403);
        }

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

    public function updateStatus($id, Request $request)
    {
        $validator = Validator::make($request->all(), ['status' => 'required|integer|in:0,1,2']);
        if ($validator->fails()) return response()->json(['errors' => $validator->errors()], 403);
        
        $contact = Contact::notDeleted()->where('id', $id)->first();
        if (!isset($contact)) return response()->json(['errors' => 'Contact is not valid'], 403);
        
        $contact->update([
            'status' => $request->get('status'),
            'updated_at' => date('Y-m-d H:i:s')
        ]);

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