<?php

namespace App\Http\Controllers\Api\V3;

use Illuminate\Http\Request;
use App\Exceptions\GeneralException;
use App\Http\Controllers\Controller;
use App\Repositories\Auth\UserRepository;
use App\Repositories\CircleUserRepository;
use App\Repositories\CircleUserTempRepository;
use Image;
use Hash;

/**
 * Class UserApiControllerV3.
 */
class UserApiControllerV3 extends Controller
{
    /**
     * @var UserRepository
     * @var CircleUserRepository
     * @var CircleUserTempRepository
     */
    protected $userRepository;
    protected $circleUserTempRepository;
    protected $circleUserRepository;

    /**
     * UserApiController constructor.
     *
     * @param UserRepository $userRepository
     */
    public function __construct(UserRepository $userRepository, CircleUserRepository $circleUserTempRepository, CircleUserTempRepository $circleUserRepository)
    {
        $this->userRepository = $userRepository;
        $this->circleUserTempRepository = $circleUserTempRepository;
        $this->circleUserRepository = $circleUserRepository;
    }

    
    /**
     * Update user profile.
     *
     * @param Json ApiRequest $request
     *
     * @return \Illuminate\Http\JsonResponse
     * @throws GeneralException
     */
    public function profile_update(Request $request)
    {
        $response = array();
        $output = array();
        $message = 1010;
        $json = file_get_contents('php://input');
        $obj = json_decode($json, TRUE);
        //print_r($jsonRequest);die();
        $first_name = isset($obj['first_name']) ? $obj['first_name'] : "";
        $last_name = isset($obj['last_name']) ? $obj['last_name'] : "";
        $password = (isset($obj['password']) ? $obj['password'] : '');
        //$dob = isset($obj['dob']) ? date('Y-m-d',strtotime($obj['dob'])) : "";
        $dob = isset($obj['dob']) ? date('Y-m-d',strtotime(str_replace('/', '-', $obj['dob']))) : "";
        $iban = isset($obj['iban']) ? $obj['iban'] : "";
        $credit_card_no = isset($obj['credit_card_no']) ? $obj['credit_card_no'] : "";
        $paypal_account = isset($obj['paypal_account']) ? $obj['paypal_account'] : "";
        $id_scan = isset($obj['id_scan']) ? $obj['id_scan'] : "";
        $avatar_location = isset($obj['avatar_location']) ? $obj['avatar_location'] : "";
        $authorization = explode('Bearer ', $request->header('Authorization'));
        $authorization = end($authorization);

        if($authorization) {
            $user = $this->userRepository->findByCondition(array('remember_token'=>$authorization));
            //echo '<pre>';print_r($user);die;
            if(count($user) > 0) {
                /*if($id_scan) {
                    $id_scan_name = explode('/', $id_scan);
                    $id_scan_name = end($id_scan_name);
                    @rename (public_path('storage/id_scan_temp/'.$id_scan_name), public_path('storage/id_scan/'.$id_scan_name));
                }*/
                if($avatar_location) {
                    $avatar_location_name = explode('/', $avatar_location);
                    $avatar_location_name = end($avatar_location_name);
                    @rename (public_path('storage/avatars_temp/'.$avatar_location_name), public_path('storage/avatars/'.$avatar_location_name));
                }
                $update_arr = [
                    'first_name'   => $first_name,
                    'last_name'   => $last_name,
                    'dob'   => $dob,
                    'iban'   => $iban,
                    'credit_card_no'   => $credit_card_no,
                    'paypal_account'   => $paypal_account,
                ];

                if($password != ''){
                    $update_arr['password'] =  Hash::make($password);
                }
                if($id_scan){
                    $update_arr['id_scan'] = str_replace('id_scan_temp', 'id_scan', $id_scan);
                }
                if($avatar_location){
                    $update_arr['avatar_location'] = str_replace('avatars_temp', 'avatars', $avatar_location);
                }
                $userUpdate = $this->userRepository->updateByCondition(array('remember_token'=>$authorization), $update_arr);

                if($userUpdate) {
                    $currentuser = $this->userRepository->findByCondition(array('remember_token'=>$authorization));
                    $circleTempUserListMeExist = $this->circleUserTempRepository->findByCondition(array('mobile_number'=>$currentuser[0]->mobile_number));
                    if($circleTempUserListMeExist->count()>0){
                        foreach ($circleTempUserListMeExist as $key => $circleTempUserListMe) {
                            if($circleTempUserListMe->username==''){
                                $this->circleUserTempRepository->updateByCondition(array('mobile_number'=>$currentuser[0]->mobile_number), array('username'=>$first_name));
                            }
                            if($circleTempUserListMe->username=='(Admin)'){
                                $this->circleUserTempRepository->updateByCondition(array('mobile_number'=>$currentuser[0]->mobile_number), array('username'=>$first_name.'(Admin)'));
                            }
                        }
                    }
                    $circleUserListMeExist = $this->circleUserRepository->findByCondition(array('mobile_number'=>$currentuser[0]->mobile_number));
                    if($circleUserListMeExist->count()>0){
                        foreach ($circleUserListMeExist as $key => $circleUserListMe) {
                            if($circleUserListMe->username==''){
                                $this->circleUserRepository->updateByCondition(array('mobile_number'=>$currentuser[0]->mobile_number), array('username'=>$first_name));
                            }
                            if($circleUserListMe->username=='(Admin)'){
                                $this->circleUserRepository->updateByCondition(array('mobile_number'=>$currentuser[0]->mobile_number), array('username'=>$first_name.'(Admin)'));
                            }
                        }
                    }
                    $status = 100;
                    $statusCode = 200;
                    $message = 1010;
                    $output = $currentuser[0];
                    $output['dob'] = date('d/m/Y', strtotime($currentuser[0]->dob));
                } else {
                    $status = 300;
                    $statusCode = 402;
                    $message = 1008;
                }
            } else {
                $status = 300;
                $statusCode = 401;
                $message = 1001;
            }
        } else {
            $status = 300;
            $statusCode = 404;
            $message = 1006;
        }
        $response = array('status'=>$status, 'message'=>$message, 'result'=>$output);
        return response()->json($response);
    }



    /**
     * Upload file.
     *
     * @param Json ApiRequest $request
     *
     * @return \Illuminate\Http\JsonResponse
     * @throws GeneralException
     */
    public function upload_file(Request $request)
    {
        $response = array();
        $output = array();
        $flag = $request->input('flag'); // 1->avatar, 2->id scan, 3->selfie, 4->utility
        $file = $request->file('file_name');
        $authorization = explode('Bearer ', $request->header('Authorization'));
        $authorization = end($authorization);
            
        if($file) {
            $upload_location = null;
            if ($file) {
                $name = time().str_random(5).'.'.$file->getClientOriginalExtension();
                if($flag==1) { //avatar image
                    if($request->file('file_name')->isValid()){
                        $path = 'avatars';
                        $destination = public_path('storage/avatars');
                        $upload_location = $path.'/'.$name;
                        $img = Image::make($file->getRealPath());
                        $img->resize(260, 260, function ($constraint) {
                            $constraint->aspectRatio();
                        })->save($destination.'/'.$name);
                        $userUpdate = $this->userRepository->updateByCondition(array('remember_token'=>$authorization), ['avatar_location'=>$upload_location]);
                    }
                    
                } elseif($flag==2) {
                    $id_scan = time().str_random(5).'.'.$file->getClientOriginalExtension();
                    $upload_location = $file->storeAs('/id_scan', $id_scan, 'public');
                    $userUpdate = $this->userRepository->updateByCondition(array('remember_token'=>$authorization), ['id_scan'=>$id_scan]);
                } elseif($flag==3) {
                    $selfie_doc = time().str_random(5).'.'.$file->getClientOriginalExtension();
                    $upload_location = $file->storeAs('/selfie_doc', $selfie_doc, 'public');
                    $userUpdate = $this->userRepository->updateByCondition(array('remember_token'=>$authorization), ['selfie_doc'=>$selfie_doc]);
                } elseif($flag==4) {
                    $utility_doc = time().str_random(5).'.'.$file->getClientOriginalExtension();
                    $upload_location = $file->storeAs('/utility_doc', $utility_doc, 'public');
                    $userUpdate = $this->userRepository->updateByCondition(array('remember_token'=>$authorization), ['utility_doc'=>$utility_doc]);
                }
            }
            if($upload_location) {
                $status = 100;
                $statusCode = 200;
                $message = $upload_location;
            } else {
                $status = 300;
                $statusCode = 404;
                $message = 1018;
            }
        } else {
            $status = 300;
            $statusCode = 404;
            $message = 1019;
        }
        $response = array('status'=>$status, 'message'=>$message, 'result'=>$output);
        
        return response()->json($response);
    }

    /**
     * The user profile data.
     *
     * @param Json ApiRequest $request
     *
     * @return \Illuminate\Http\JsonResponse
     * @throws GeneralException
     */
    public function profileDetails(Request $request)
    {
        $response = array();
        $output = array();
        $message = '';
        $authorization = explode('Bearer ', $request->header('Authorization'));
        $authorization = end($authorization);
        if($authorization) {
            $user = $this->userRepository->findByCondition(array('remember_token'=>$authorization));
            //echo '<pre>';print_r($user);die;
            if(count($user) > 0) {
                $status = 100;
                $statusCode = 200;
                $message = 1010;
                $output = $user[0];
            } else {
                $status = 300;
                $statusCode = 401;
                $message = 1001;
            }
        } else {
            $status = 300;
            $statusCode = 404;
            $message = 1006;
        }
        $response = array('status'=>$status, 'message'=>$message, 'result'=>$output);
        return response()->json($response);
    }

    /**
     * Update user profile.
     *
     * @param Json ApiRequest $request
     *
     * @return \Illuminate\Http\JsonResponse
     * @throws GeneralException
     */
    public function mobileUpdate(Request $request)
    {
        $response = array();
        $output = array();
        $message = 1010;
        $json = file_get_contents('php://input');
        $obj = json_decode($json, TRUE);
        //print_r($jsonRequest);die();
        $mobile_number = isset($obj['mobile_number']) ? $obj['mobile_number'] : "";
        $authorization = explode('Bearer ', $request->header('Authorization'));
        $authorization = end($authorization);

        if($authorization) {
            $user = $this->userRepository->findByCondition(array('remember_token'=>$authorization));
            //echo '<pre>';print_r($user);die;
            if(count($user) > 0) {
                $mobile_exist = $this->userRepository->findByCondition(array('mobile_number'=>$mobile_number));
                $mobile_old_exist = $this->userRepository->findByCondition(array('old_number_first'=>$mobile_number));
                $mobile_second_exist = $this->userRepository->findByCondition(array('old_number_second'=>$mobile_number));
                //echo $mobile_number.'='.$user[0]->mobile_number;die;
                if($user[0]->mobile_number == $mobile_number){
                    $status = 100;
                    $statusCode = 200;
                    $message = 1010;
                } elseif(count($mobile_exist) == 0 && count($mobile_old_exist) == 0 && count($mobile_second_exist) == 0) {
                    $instArr = array(
                                    'new_number'=>$mobile_number
                                    );
                    $userupdate = $this->userRepository->updateByCondition(array('remember_token'=>$authorization), $instArr);
                    $status = 100;
                    $statusCode = 200;
                    $message = 1010;
                } else {
                    $status = 300;
                    $statusCode = 402;
                    $message = 1008;
                }
            } else {
                $status = 300;
                $statusCode = 401;
                $message = 1001;
            }
        } else {
            $status = 300;
            $statusCode = 404;
            $message = 1006;
        }
        $response = array('status'=>$status, 'message'=>$message, 'result'=>$output);
        return response()->json($response);
    }

    /**
     * Update user profile.
     *
     * @param Json ApiRequest $request
     *
     * @return \Illuminate\Http\JsonResponse
     * @throws GeneralException
     */
    public function changePassword(Request $request)
    {
        $response = array();
        $output = array();
        $message = 1010;
        $json = file_get_contents('php://input');
        $obj = json_decode($json, TRUE);
        //print_r($jsonRequest);die();
        $password = (isset($obj['password']) ? $obj['password'] : '');
        $authorization = explode('Bearer ', $request->header('Authorization'));
        $authorization = end($authorization);

        if($authorization) {
            $user = $this->userRepository->findByCondition(array('remember_token'=>$authorization));
            //echo '<pre>';print_r($user);die;
            if(count($user) > 0) {
            $update_arr['password'] =  Hash::make($password);
            $userUpdate = $this->userRepository->updateByCondition(array('remember_token'=>$authorization), $update_arr);
                $status = 100;
                $statusCode = 200;
                $message = 1010;
            } else {
                $status = 300;
                $statusCode = 402;
                $message = 1008;
            }
        } else {
            $status = 300;
            $statusCode = 404;
            $message = 1006;
        }
        $response = array('status'=>$status, 'message'=>$message, 'result'=>$output);
        return response()->json($response);
    }

    /**
     * Update user profile.
     *
     * @param Json ApiRequest $request
     *
     * @return \Illuminate\Http\JsonResponse
     * @throws GeneralException
     */
    public function changeIban(Request $request)
    {
        $response = array();
        $output = array();
        $message = 1010;
        $json = file_get_contents('php://input');
        $obj = json_decode($json, TRUE);
        //print_r($jsonRequest);die();
        $iban = (isset($obj['iban']) ? $obj['iban'] : '');
        $authorization = explode('Bearer ', $request->header('Authorization'));
        $authorization = end($authorization);

        if($authorization) {
            $user = $this->userRepository->findByCondition(array('remember_token'=>$authorization));
            //echo '<pre>';print_r($user);die;
            if(count($user) > 0) {
            $update_arr['iban'] =  $iban;
            $userUpdate = $this->userRepository->updateByCondition(array('remember_token'=>$authorization), $update_arr);
                $status = 100;
                $statusCode = 200;
                $message = 1010;
            } else {
                $status = 300;
                $statusCode = 402;
                $message = 1008;
            }
        } else {
            $status = 300;
            $statusCode = 404;
            $message = 1006;
        }
        $response = array('status'=>$status, 'message'=>$message, 'result'=>$output);
        return response()->json($response);
    }

}
