<?php

namespace App\Http\Controllers\Api;

use Illuminate\Http\Request;
use App\Exceptions\GeneralException;
use App\Http\Controllers\Controller;
use App\Repositories\Api\ApiRepository;

/**
 * Class ApiController.
 */
class ApiController extends Controller
{
    /**
     * @var ApiRepository
     */
    protected $apiRepository;

    /**
     * ApiController constructor.
     *
     * @param ApiRepository $apiRepository
     */
    public function __construct(ApiRepository $apiRepository)
    {
        $this->apiRepository = $apiRepository;
    }

    /**
     * The user has been authenticated.
     *
     * @param Json ApiRequest $request
     *
     * @return \Illuminate\Http\JsonResponse
     * @throws GeneralException
     */
    public function user_authentication(Request $request)
    {
        $response = array();
        $output = array();
        $jsonRequest = json_decode($request->input('jsonRequest'), true);
        //print_r($jsonRequest);die();
        $email = $jsonRequest['email'];
        $password = $jsonRequest['password'];
        $user_type = $jsonRequest['user_type'];

        if($email && $password && $user_type) {
            if(auth()->attempt(['email' => $email, 'password' => $password, 'user_type'=>$user_type])) {
                $status = 1;
                $statusCode = 200;
                $message = "Successful";
                $output = auth()->user();
            } else {
                $status = 0;
                $statusCode = 401;
                $message = "Unauthenticated user";
            }
        } else {
            $status = 0;
            $statusCode = 404;
            $message = "Required parameters are missing";
        }
        $response = array('status'=>$status, 'message'=>$message, 'result'=>$output);
        
        return response()->json($response, $statusCode);
    }

    /**
     * Show user details.
     *
     * @param HeaderRequest $request
     *
     * @return \Illuminate\Http\JsonResponse
     * @throws GeneralException
     */
    public function user_profile(Request $request)
    {
        $response = array();
        $output = array();
        
        if($request->header('Authorization')) {
            $user = $this->apiRepository->findByAuthToken($request->header('Authorization'));
            //Get city list
            $cities = $this->apiRepository->findAllCity(); 
            //Get service list
            $services = $this->apiRepository->findAllServices(); 
            if($user) {
                $userCitiesIds = [];
                //User cities
                $userCities = $this->apiRepository->serviceProviderCity($user->id);
                if($userCities) {
                    foreach ($userCities as $key => $value) {
                        array_push($userCitiesIds, $value->city_id);
                    }
                }
                $userServicesIds = [];
                //User cities
                $userServices = $this->apiRepository->serviceProviderService($user->id);
                if($userServices) {
                    foreach ($userServices as $key => $value) {
                        array_push($userServicesIds, $value->service_id);
                    }
                }
                //Select user checked cities
                if($cities) {
                    foreach ($cities as $key => $value) {
                        $value->checked = 0;
                        if(in_array($value->id, $userCitiesIds))
                        {
                            $value->checked = 1;
                        }
                    }
                }
                //Select user checked services
                if($services) {
                    foreach ($services as $key => $value) {
                        $value->checked = 0;
                        if(in_array($value->id, $userServicesIds))
                        {
                            $value->checked = 1;
                        }
                    }
                }
                $user->cities = $cities;
                $user->services = $services;
                $user->avatar_location = url('storage/'.$user->avatar_location);
                $user->document_location = ($user->document_location) ? url('storage/'.$user->document_location) : '';

                $status = 1;
                $statusCode = 200;
                $message = "Successful";
                $output = $user;
            } else {
                $status = 0;
                $statusCode = 401;
                $message = "Unauthenticated user";
            }
        } else {
            $status = 0;
            $statusCode = 404;
            $message = "Required parameters are missing";
        }
        $response = array('status'=>$status, 'message'=>$message, 'result'=>$output);
        
        return response()->json($response, $statusCode);
    }


    /**
     * Update user details.
     *
     * @param HeaderRequest $request
     * @param Json ApiRequest $request
     *
     * @return \Illuminate\Http\JsonResponse
     * @throws GeneralException
     */
    public function update_user(Request $request)
    {
        $response = array();
        $output = array();
        $jsonRequest = json_decode($request->post('jsonRequest'), true);
        //$cities = isset($jsonRequest['cities'])? $jsonRequest['cities'] : '';
        $cities = $jsonRequest['cities'];
        $services = $jsonRequest['services'];
        if($request->header('Authorization') && $request->input('jsonRequest')) {
            $user = $this->apiRepository->findByAuthToken($request->header('Authorization'));
            if($user) {
                //Update array
                $update_data = array(
                                    'first_name'            =>$jsonRequest['first_name'],
                                    'last_name'             =>$jsonRequest['last_name'],
                                    'email'                 =>$jsonRequest['email'],
                                    'company_service_desc'  =>$jsonRequest['company_service_desc'] ? $jsonRequest['company_service_desc']: '',
                                    'password'              =>$jsonRequest['password']
                                );
                $avatar_location = isset($jsonRequest['avatar_location']) ? $jsonRequest['avatar_location'] : false ;
                $document_location = isset($jsonRequest['document_location']) ? $jsonRequest['document_location'] : false ;
                
                //update repository code 
                $updatedUserData = $this->apiRepository->update($request->header('Authorization'), $update_data, $avatar_location, $document_location);
                //print_r($updatedUserData);die();
                if($updatedUserData) {
                    $user_id = $updatedUserData->id;
                    if($cities) {
                        $this->apiRepository->existsCityDelete($user_id);
                        foreach ($cities as $key => $value) {
                            $serviceprovidercity = $this->apiRepository->createCity(
                                array(
                                    'user_id'=>$user_id,
                                    'city_id'=>$value
                                )
                            );
                        }
                    }

                    if($services) {
                        $this->apiRepository->existsCityDelete($user_id);
                        foreach ($services as $key => $value) {
                            $serviceproviderservice = $this->apiRepository->createService(
                                array(
                                    'user_id'=>$user_id,
                                    'service_id'=>$value
                                )
                            );
                        }
                    }

                    $status = 1;
                    $statusCode = 200;
                    $message = "Successful";
                    $output = $updatedUserData;
                } else {
                    $status = 0;
                    $statusCode = 401;
                    $message = "Email is already exist, please try another";
                }
            } else {
                $status = 0;
                $statusCode = 401;
                $message = "Unauthenticated user";
            }
        } else {
            $status = 0;
            $statusCode = 404;
            $message = "Required parameters are missing";
        }
        $response = array('status'=>$status, 'message'=>$message, 'result'=>$output);
        
        return response()->json($response, $statusCode);
    }

    /**
     * Show local service providers as per user city.
     *
     * @param HeaderRequest $request
     *
     * @return \Illuminate\Http\JsonResponse
     * @throws GeneralException
     */
    public function search_by_location(Request $request)
    {
        $response = array();
        $output = array();
        $jsonRequest = json_decode($request->input('jsonRequest'), true);
        if($request->header('Authorization') && $request->input('jsonRequest')) {
            $city_name = $jsonRequest['city_name'];
            $where = [ ['city_name', $city_name] ];
            $cityDetails = $this->apiRepository->findUserByCondition($where);
            if($cityDetails) {
                $serviceProviderData = $cityDetails[0]['service_provider_city'];
                if($serviceProviderData) {
                    foreach ($serviceProviderData as $key => $value) {
                        $serviceProviders = $value['user'];
                        if($serviceProviders) {
                            $serviceProviders['avatar_location'] = url('storage/'.$serviceProviders['avatar_location']);
                            $serviceProviders['document_location'] = ($serviceProviders['document_location']) ? url('storage/'.$serviceProviders['document_location']) : '';
                        }
                        array_push($output, $serviceProviders);
                    }
                    if($output) {
                        $status = 1;
                        $statusCode = 200;
                        $message = "Successful";
                    } else {
                        $status = 0;
                        $statusCode = 401;
                        $message = "No service provider found !!";
                    } 
                } else {
                    $status = 0;
                    $statusCode = 401;
                    $message = "No service provider found !!";
                }
            } else {
                $status = 0;
                $statusCode = 401;
                $message = "City not found !!";
            }
        } else {
            $status = 0;
            $statusCode = 404;
            $message = "Required parameters are missing";
        }
        $response = array('status'=>$status, 'message'=>$message, 'result'=>$output);
        
        return response()->json($response, $statusCode);
    }

}
