<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use App\Customer;
use App\Http\Resources\Admin\CustomerResource;
use Validator;

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

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

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

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

    public function all(Request $request)
    {
        $searchParams = $request->all();
        $limit = Arr::get($searchParams, 'limit', static::ITEM_PER_PAGE);
        $list = Customer::select('id', 'name', 'slug')->notDeleted()->orderBy('id');

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

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

        return new CustomerResource($customer);
    }

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

        $params = $request->all();
        $customer = Customer::create([
            'name'                => $params['first_name'] . ' ' . $params['last_name'],
            'project_id'          => $params['project_id'],
            'first_name'          => $params['first_name'],
            'last_name'           => $params['last_name'],
            'furigana_first_name' => $params['furigana_first_name'],
            'furigana_last_name'  => $params['furigana_last_name'],
            'post_code'           => $params['post_code'],
            'city'                => $params['city'],
            'district'            => $params['district'],
            'address'             => $params['address'],
            'address2'            => $params['address2'],
            'email'               => $params['email'],
            'phone_number'        => $params['phone_number'],
            'mobile_tel'          => $params['mobile_tel'],
            'introduction'        => $params['introduction'],
            '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 CustomerResource($customer);
    }

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

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

        $params = $request->all();
        $customer->update([
            'name'                => $params['first_name'] . ' ' . $params['last_name'],
            'project_id'          => $params['project_id'],
            'first_name'          => $params['first_name'],
            'last_name'           => $params['last_name'],
            'furigana_first_name' => $params['furigana_first_name'],
            'furigana_last_name'  => $params['furigana_last_name'],
            'post_code'           => $params['post_code'],
            'city'                => $params['city'],
            'district'            => $params['district'],
            'address'             => $params['address'],
            'address2'            => $params['address2'],
            'email'               => $params['email'],
            'phone_number'        => $params['phone_number'],
            'mobile_tel'          => $params['mobile_tel'],
            'introduction'        => $params['introduction'],
            '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)
    {
        $customer = Customer::notDeleted()->where('id', $id)->first();
        if (!isset($customer)) response()->json([ 'error' => 'Ehhh! Can not delete this customer' ], 403);

        try {
            $customer->update([ 'is_deleted' => true, 'updated_at' => date('Y-m-d H:i:s') ]);
        } 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', []);
        $customers = Customer::notDeleted()->whereIn('id', $listIds)->get();
        if ($customers->count() <= 0) response()->json([ 'error' => 'Customer is not valid.' ], 403);
        try {
            Customer::notDeleted()->whereIn('id', $listIds)->update([ 'is_deleted' => true, 'updated_at' => date('Y-m-d H:i:s') ]);
        } 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', []);
        $customers = Customer::notDeleted()->whereIn('id', $listIds)->get();
        if ($customers->count() <= 0) response()->json([ 'error' => 'Customer is not valid.' ], 403);
        try {
            Customer::notDeleted()->whereIn('id', $listIds)->update([ 'is_activated' => true, 'updated_at' => date('Y-m-d H:i:s') ]);
        } 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', []);
        $customers = Customer::notDeleted()->whereIn('id', $listIds)->get();
        if ($customers->count() <= 0) response()->json([ 'error' => 'Customer is not valid.' ], 403);
        try {
            Customer::notDeleted()->whereIn('id', $listIds)->update([ 'is_activated' => false, 'updated_at' => date('Y-m-d H:i:s') ]);
        } catch (\Exception $ex) {
            response()->json([ 'error' => $ex->getMessage() ], 403);
        }

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