<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use App\Http\Resources\DeliveryAddressResource;
use App\DeliveryAddress;
use Validator;

class AddressController extends Controller
{
	const ITEM_PER_PAGE = 20;
	private $_user;
	
	public function __construct()
	{
		$this->_user = auth('api')->user();
	}
	
	public function index(Request $request)
	{
		$searchParams = $request->all();
		$list = DeliveryAddress::where('user_id', $this->_user->id);
		$limit = Arr::get($searchParams, 'limit', static::ITEM_PER_PAGE);
		$keyword = Arr::get($searchParams, 'keyword', '');
		
		if (!empty($keyword)) {
			$list->where(function ($query) use ($keyword) {
				$query->where('first_name', 'LIKE', '%' . $keyword . '%')
					->orWhere('last_name', 'LIKE', '%' . $keyword . '%')
					->orWhere('furigana_first_name', 'LIKE', '%' . $keyword . '%')
					->orWhere('furigana_last_name', 'LIKE', '%' . $keyword . '%')
					->orWhere('post_code', 'LIKE', '%' . $keyword . '%')
					->orWhere('district', 'LIKE', '%' . $keyword . '%')
					->orWhere('city', 'LIKE', '%' . $keyword . '%')
					->orWhere('address', 'LIKE', '%' . $keyword . '%')
					->orWhere('phone_number', 'LIKE', '%' . $keyword . '%')
					->orWhere('email', 'LIKE', '%' . $keyword . '%');
			});
		}
		
		$list->orderBy('id', 'DESC');
		
		return DeliveryAddressResource::collection($list->paginate($limit));
	}
	
	public function show($id = 0)
	{
		$address = DeliveryAddress::where('user_id', $this->_user->id)->where('id', $id)->first();
		if (!isset($address)) return response()->json(['errors' => 'Address is not valid'], 403);
		
		return new DeliveryAddressResource($address);
	}
	
	public function store(Request $request)
	{
		$validator = Validator::make($request->all(), [
			'first_name'          => ['required'],
			'last_name'           => ['required'],
			'furigana_first_name' => ['required'],
			'furigana_last_name'  => ['required'],
			'post_code'           => ['required'],
			'address'             => ['required'],
			'address2'            => ['required'],
			'address3'            => ['required'],
			'phone_number'        => ['required'],
			'email'               => ['required'],
		]);
		if ($validator->fails()) return response()->json(['errors' => $validator->errors()], 403);
		
		$params = $request->all();
		$address = DeliveryAddress::create([
			'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'],
			'district'            => $params['address'],
			'city'                => $params['address2'],
			'address'             => $params['address3'],
			'phone_number'        => $params['phone_number'],
			'email'               => (isset($params['email']) && $params['email'] != null) ? $params['email'] : $this->_user->email,
			'company'             => $params['company'] ?? null,
			'user_id'             => $this->_user->id,
			'is_default'          => false,
			'is_other_address'    => true,
			'created_at'          => date('Y-m-d H:i:s'),
			'updated_at'          => date('Y-m-d H:i:s')
		]);
		
		return new DeliveryAddressResource($address);
	}
	
	public function update(Request $request, $id = 0)
	{
		$validator = Validator::make($request->all(), [
			'first_name'          => ['required'],
			'last_name'           => ['required'],
			'furigana_first_name' => ['required'],
			'furigana_last_name'  => ['required'],
			'post_code'           => ['required'],
			'address'             => ['required'],
			'address2'            => ['required'],
			'address3'            => ['required'],
			'phone_number'        => ['required'],
			'email'               => ['required']
		]);
		if ($validator->fails()) return response()->json(['errors' => $validator->errors()], 403);
		
		$address = DeliveryAddress::where('user_id', $this->_user->id)->where('id', $id)->first();
		if (!isset($address)) return response()->json(['errors' => 'Address is not valid'], 403);
		
		$params = $request->all();
		$address->update([
			'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'],
			'district'            => $params['address'],
			'city'                => $params['address2'],
			'address'             => $params['address3'],
			'phone_number'        => $params['phone_number'],
			'email'               => $params['email'],
			'company'             => $params['company'] ?? null,
			'updated_at'          => date('Y-m-d H:i:s')
		]);
		
		return response()->json(null, 204);
	}
	
	public function destroy($id = 0)
	{
		$address = DeliveryAddress::where('user_id', $this->_user->id)->where('id', $id)->first();
		if (!isset($address)) response()->json(['error' => 'Can not delete this address'], 403);
		
		try {
			$address->delete();
		} catch (\Exception $ex) {
			response()->json(['error' => $ex->getMessage()], 403);
		}
		
		return response()->json(null, 204);
	}
}
