<?php

namespace App\Http\Controllers\Api\v2;

use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Mail\Api\SignupVerification;
use App\Mail\Api\ForgotPassword;
use App\Models\Languages;
use App\Models\Videos;
use App\Models\UserVideos;
use App\Models\VideoDetails;
use App\Models\Difficulties;
use App\Models\CategoryDetails;
use App\Models\Master_cms;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use App\Models\User;
use Illuminate\Support\Facades\Mail;
use URL;
use Image;
use File;


class AuthApiController extends Controller
{
    
    public function __construct()
    {
        $this->middleware('auth:api', ['except' => ['forgotpassword','language','registration','login', 'languageJson','gettermsandCondition']]);
    }

    
    public function language()
    {
    	$response = array();
        $output = array();
        
        $language['language'] = Languages::select('id','name','code','status')->where('status', 1)->get();
        if(count($language['language'])>0)
        {
            
            $status = 200;
            $statusCode = 200;
            $message = "All Languages";
            $output = $language;
        }
        else
        {
            $status = 201;
            $statusCode = 201;
            $message = "No Languages Available";
        }

        $response = array('status'=>$status, 'message'=>$message, 'result'=>$output);
        
        return response()->json($response);
    }


    public function languageJson(Request $request)
    {
        $response = array();
        $output = array();
        $inputs['lang'] = $request->get('language');
        if($inputs['lang'])
        {
            $folder = public_path('language/'.$inputs['lang'].'.js');
            $json = file_get_contents($folder);
            $obj = json_decode($json, TRUE);

            $status = 200;
            $statusCode = 200;
            $message = 'language json list';
            $output = $obj;
        }
        else
        {
            $status = 201;
            $statusCode = 201;
            $message = "No Languages Json Available";
        }

        $response = array('status'=>$status, 'message'=>$message, 'result'=>$output);
        
        return response()->json($response);
    }

    public function registration(Request $request)
    {
    	$validator = Validator::make($request->all(), [
            'email' => 'required|string|email|max:255|unique:users',
            'password' => 'required|string',
			'confirm_password' => 'required|string|required_with:password|same:password',
			'language_id' => 'required',
			'device_type' => 'required',
			'device_token' => 'required'
        ]);
        

        if($validator->fails()){
            $response = array('status'=>201, 'message'=>$validator->errors()->first(), 'result'=>(object)[]);
            return response()->json($response);
        }

        $inputs['header'][] = '';
        $inputs['body']['email'] = $request->get('email');
        $inputs['body']['password'] = $request->get('password');
        $inputs['body']['confirm_password'] = $request->get('confirm_password');
        $inputs['body']['language_id'] = $request->get('language_id');
        $inputs['body']['device_type'] = $request->get('device_type');
        $inputs['body']['device_token'] = $request->get('device_token');
        

        $lang = Languages::find($request->get('language_id'));
        if($lang)
        {
            $folder = public_path('language/'.$lang->code.'.js');
            $json = file_get_contents($folder);
            $obj = json_decode($json, TRUE);

            
            $user = User::create([
            'email' => $request->get('email'),
            'password' => Hash::make($request->get('password')),
            'language_id' => $request->get('language_id'),
            'device_type' => $request->get('device_type'),
            'device_token' => $request->get('device_token'),
            'remember_token' => md5(uniqid(mt_rand(), true)),
            'user_type' => 2,
            'is_verified' => 0,
            'status' => 0,

            ]);

            $admin = User::find(1);

            /*************email********************/
            $userList = [];
            $userList['email'] = $user->email;
            $userList['admin_email'] = $admin->email;
            $userList['id'] = base64_encode($user->id);
            
            Mail::to($user->email, $user->username)->send(new SignupVerification($userList));
            /*************email********************/

            $response = array('status'=>200, 'message'=>$obj['reg-success'], 'result'=>compact('user', 'inputs'));
            return response()->json($response);
        }    
    }


    public function login(Request $request)
    {
        $inputs['body']['email'] = $request->get('email');
        $inputs['body']['password'] = $request->get('password');
       
        $folder = public_path('language/en.js');
        $json = file_get_contents($folder);
        $obj = json_decode($json, TRUE);
        
        
        $path = url('images/avaters');
        $image_path = $path.'/';

        $validator = Validator::make(request(['email', 'password']), [
            'email' => 'required|string|email|max:255',
            'password' => 'required|string',
        ],
        [
            'email.required' => $obj['email-required'],
            'email.email' => $obj['email-only'],
            'password.required' => $obj['password-required']
        ]);
        
        if($validator->fails()){
            $response = array('status'=>201, 'message'=>$validator->errors()->first(), 'result'=>(object)[]);
            return response()->json($response);
        }

        
        $credentials = $request->only('email', 'password');
        // dd($credentials);
            
        $user = User::where('email', $credentials['email'])->where('status', 1)->where('is_verified', 1)->count();
        if($user > 0)
        {
            if (!$token = auth('api')->attempt($credentials)) 
            {
                $response = array('status'=>201, 'message'=>$obj['login-unauthorized'], 'result'=>[]);
                return response()->json($response);
            }
            $user_details = User::where('email', $credentials['email'])->where('status', 1)->where('is_verified', 1)->first();
            $user_token = $this->respondWithToken($token);
            

            $output['id'] = $user_details->id??'';
            $output['username'] = $user_details->username??'';
            $output['email'] = $user_details->email??'';
            $output['profile_pic'] = $image_path.$user_details->profile_pic??$image_path;
            $output['email_verified_at'] = $user_details->email_verified_at?date('d-m-Y', strtotime($userDetails->email_verified_at)):'';
            $output['language_code'] = $user_details->language->code??'';
            $output['package_id'] = $user_details->package_id??'';
            $output['is_verified'] = $user_details->is_verified??'';
            $output['status'] = $user_details->status??'';
            $output['device_type'] = $user_details->device_type??'';
            $output['device_token'] = $user_details->device_token??'';
            $output['user_type'] = $user_details->user_type??'';
            $output['membership_type'] = $user_details->membership_type??'';
            $output['user_acces_token'] = $user_token['access_token'];
            $output['user_token_type'] = $user_token['token_type'];
            $output['user_expires_in'] = $user_token['expires_in'];
            $output['inputs'] = $inputs??(object)[];
            

            $response = array('status'=>200, 'message'=>$obj['login-success'], 'result'=>$output);
            return response()->json($response);
       
        }
        else
        {
            $response = array('status'=>201, 'message'=>$obj['email-not-active'], 'result'=>(object)[]);
            return response()->json($response);
        }
    }

    public function forgotpassword(Request $request)
    {
        $inputs['body']['email'] = $request->get('email');
        $folder = public_path('language/en.js');
        $json = file_get_contents($folder);
        $obj = json_decode($json, TRUE);
        $forgotpassword = mt_rand(10000000,99999999);
        $path = url('images/avaters');
        $image_path = $path.'/';

        $validator = Validator::make(request(['email']), [
            'email' => 'required|string|email|max:255',            
        ],
        [
            'email.required' => $obj['email-required'],
            'email.email' => $obj['email-only'],
        ]);
        
        if($validator->fails()){
            $response = array('status'=>201, 'message'=>$validator->errors()->first(), 'result'=>[]);
            return response()->json($response);
        }

        
        $credentials = request(['email']);
            
        $user= User::where('email', $credentials['email'])->where('status', 1)->where('is_verified', 1)->count();

        if($user > 0)
        {
            $update = User::where('email', $credentials['email'])->update(['password' => Hash::make($forgotpassword)]);

            if($update)
            {
                $admin = User::find(1);
                $cred = User::where('email', $credentials['email'])->where('status', 1)->where('is_verified', 1)->first();
                // dd($cred);
                if(count($cred) > 0)
                {
                    /*************email********************/
                    $userList = [];
                    $userList['email'] = $cred->email;
                    $userList['password'] = $forgotpassword;
                    $userList['admin_email'] = $admin->email;
                    Mail::to($cred->email, $cred->username)->send(new ForgotPassword($userList));
                    /*************email********************/
                    // if(Mail::to($cred->email, $cred->username)->send(new ForgotPassword($userList)))
                    // {
                        $output['id'] = $cred->id??'';
                        $output['username'] = $cred->username??'';
                        $output['email'] = $cred->email??'';
                        $output['profile_pic'] = $image_path.$cred->profile_pic??$image_path;
                        $output['email_verified_at'] = $cred->email_verified_at?date('d-m-Y', strtotime($cred->email_verified_at)):'';
                        $output['language_code'] = $cred->language->code??'';
                        $output['package_id'] = $cred->package_id??'';
                        $output['is_verified'] = $cred->is_verified??'';
                        $output['status'] = $cred->status??'';
                        $output['device_type'] = $cred->device_type??'';
                        $output['device_token'] = $cred->device_token??'';
                        $output['user_type'] = $cred->user_type??'';
                        $output['inputs'] = $inputs??(object)[];
                        
                        $response = array('status'=>200, 'message'=>$obj['forgot-password-success'], 'result'=>$output);
                        return response()->json($response);
                    // }
                    // else
                    // {
                    //     $response = array('status'=>201, 'message'=>$obj['forgot-password-failed'], 'result'=>[]);
                    //     return response()->json($response);
                    // }
                }
                else
                {
                    $response = array('status'=>201, 'message'=>$obj['activate-email-first'], 'result'=>(object)[]);
                    return response()->json($response);
                }
                
            }
            else
            {
                $response = array('status'=>201, 'message'=>$obj['password-update-failed'], 'result'=>(object)[]);
                return response()->json($response);
            }
            
            
            
        }
        else
        {
            $response = array('status'=>201, 'message'=>$obj['email-not-active'], 'result'=>(object)[]);
            return response()->json($response);
        }
    }

    
    public function getuser(Request $request)
    {
        
        $inputs['header']['authorization'] = $request->header('Authorization');
        $inputs['header']['lang'] = $request->header('Accept-Language');
        $inputs['header']['accept'] = $request->header('Accept');
        $inputs['body'][] = '';
        $folder = public_path('language/'.$inputs['header']['lang'].'.js');
        $json = file_get_contents($folder);
        $obj = json_decode($json, TRUE);
        $path = url('images/avaters');
        $image_path = $path.'/';
        

        if($inputs['header']['authorization'] && $inputs['header']['accept'])
        {
            $user_details = auth('api')->user();

            $output['id'] = $user_details->id??'';
            $output['username'] = $user_details->username??'';
            $output['email'] = $user_details->email??'';
            $output['profile_pic'] = $image_path.$user_details->profile_pic??$image_path;
            $output['email_verified_at'] = $user_details->email_verified_at?date('d-m-Y', strtotime($userDetails->email_verified_at)):'';
            $output['language_code'] = $user_details->language->code??'';
            $output['package_id'] = $user_details->package_id??'';
            $output['is_verified'] = $user_details->is_verified??'';
            $output['status'] = $user_details->status??'';
            $output['device_type'] = $user_details->device_type??'';
            $output['device_token'] = $user_details->device_token??'';
            $output['user_type'] = $user_details->user_type??'';
            $output['inputs'] = $inputs??(object)[];
            $response = array('status'=>200, 'message'=>$obj['user-details-success'], 'result'=>$output);
            return response()->json($response);
        }
        else
        {
            $response = array('status'=>201, 'message'=>$obj['auth-token-required'], 'result'=>(object)[]);
            return response()->json($response);
        }   
    }


    public function profile(Request $request)
    {
        $inputs['header']['authorization'] = $request->header('Authorization');
        $inputs['header']['lang']          = $request->header('Accept-Language');
        $inputs['header']['accept']        = $request->header('Accept');
        $inputs['body']['video_type']      = $request->get('video_type');
        $folder                            = public_path('language/'.$inputs['header']['lang'].'.js');
        $json                              = file_get_contents($folder);
        $obj                               = json_decode($json, TRUE);
        $path                              = url('images/avaters');
        $image_path                        = $path.'/';
        $video_path                        = url('storage/videos');
        $video_path_url                    = $video_path.'/';
        $video_iamge_path                  = url('storage/videos/thumb');
        $video_image_path_url              = $video_iamge_path.'/';
        $array                             = [];
        $lang                              = Languages::where('code', $inputs['header']['lang'])->first();

        if($inputs['header']['authorization'] && $inputs['header']['accept'])
        {
            $user_details = auth('api')->user();

            if(($user_details && $inputs['body']['video_type'] == '') || ($user_details && $inputs['body']['video_type'] == 1))
            {
                $output['user']['id']           = $user_details['id']??'';
                $output['user']['username']     = $user_details['username']??'';
                $output['user']['email']        = $user_details['email']??'';
                $output['user']['profile_pic']  = $image_path.$user_details['profile_pic']??$image_path;

                $watchedVideo =  UserVideos::where('user_id', $user_details['id'])->where('type', 1)->get();
                // dd($watchedVideo);
                if(count($watchedVideo) > 0)
                {
                    foreach ($watchedVideo as $key => $value) 
                    {
                       $video      = Videos::find($value->video_id);
                       $videoName  = VideoDetails::where('language_id', $lang['id'])->where('video_id', $video['id'])->first();
                       $diff       = Difficulties::find($video['difficulty_id']);
                       $cat        = CategoryDetails::where('category_id',$video['category_id'])->where('language_id', $lang['id'])->first();

                        $eachVideo['video_id']         = $video['id'];
                        $eachVideo['name']       = $videoName['title'];
                        $eachVideo['image']      = $video_image_path_url.$video['image'];
                        //$eachVideo['video_file'] = $video_path_url.$video['image'];
                        $eachVideo['video_file'] = $video['video_file'];
                        $eachVideo['about']      = $video['about'];
                        $eachVideo['age_grp_id'] = $video['age_recom'];
                        $eachVideo['video_type'] = $video['video_type'];
                        $eachVideo['difficulty_level'] = $diff['level'];
                        $eachVideo['category']    = $cat['name'];
                        $eachVideo['fil']        = $video_path_url.$video['video_file'];

                        $array[]                  = $eachVideo;
                    }

                    $output['watchedVideoList']   = $array??[]; 
                    $response                     = array('status'=>200, 'message'=>$obj['watched-video-found'], 'result'=>$output);
                    return response()->json($response);   
                }
                else
                {
                    $response = array('status'=>201, 'message'=>$obj['watched-video-not-found'], 'result'=>(object)[]);
                    return response()->json($response);
                }
                
            }
            else
            {
                $output['user']['id']          = $user_details['id']??'';
                $output['user']['username']    = $user_details['username']??'';
                $output['user']['email']       = $user_details['email']??'';
                $output['user']['profile_pic'] = $image_path.$user_details['profile_pic']??$image_path;

                $savedVideo =  UserVideos::where('user_id', $user_details['id'])->where('type', 2)->get();

                if(count($savedVideo) > 0)
                {
                    foreach ($savedVideo as $key => $value) 
                    {
                        $video     = Videos::find($value->video_id);
                        $videoName = VideoDetails::where('language_id', $lang['id'])->where('video_id', $video['id'])->first();
                        $diff      = Difficulties::find($video['difficulty_id']);
                        $cat       = CategoryDetails::where('category_id',$video['category_id'])->where('language_id', $lang['id'])->first();

                        $eachVideo['video_id']         = $video['id'];
                        $eachVideo['name']             = $videoName['title'];
                        $eachVideo['image']            = $video_image_path_url.$video['image'];
                        $eachVideo['video_file']       = $video['video_file'];
                        $eachVideo['about']            = $video['about'];
                        $eachVideo['age_grp_id']       = $video['age_recom'];
                        $eachVideo['video_type']       = $video['video_type'];
                        $eachVideo['difficulty_level'] = $diff['level'];
                        $eachVideo['category']         = $cat['name'];
                        $eachVideo['fil']              = $video_path_url.$video['video_file'];

                        $array[] = $eachVideo;
                    }

                    $output['savedVideoList'] = $array??[];
                    $response = array('status'=>200, 'message'=>$obj['saved-video-found'], 'result'=>$output);
                    return response()->json($response);
                }
                else
                {
                    $response = array('status'=>201, 'message'=>$obj['saved-video-not-found'], 'result'=>(object)[]);
                    return response()->json($response);
                }
                
            }
            
        }
        else
        {
            $response = array('status'=>201, 'message'=>$obj['auth-token-required'], 'result'=>(object)[]);
            return response()->json($response);
        }   
    }

    public function editprofile(Request $request)
    {
        
        $inputs['header']['authorization'] = $request->header('Authorization');
        $inputs['header']['lang'] = $request->header('Accept-Language');
        $inputs['header']['accept'] = $request->header('Accept');
        $inputs['body']['name'] = $request->get('name');
        $inputs['body']['email'] = $request->get('email');
        $inputs['body']['password'] = $request->get('password');
        $inputs['body']['language_id'] = $request->get('language_id');
        $inputs['body']['profile_pic'] = $request->get('picture');
        $folder = public_path('language/'.$inputs['header']['lang'].'.js');
        $json = file_get_contents($folder);
        $obj = json_decode($json, TRUE);
        $upload_image_path = public_path('images/avaters/');
        $path = url('images/avaters');
        $image_path = $path.'/';

        

        if($inputs['header']['authorization'] && $inputs['header']['accept'])
        {
            $user_details = auth('api')->user();

            if($user_details)
            {
                if($inputs['body']['name']) 
                {
                    $where['username'] = $inputs['body']['name'];
                }

               
                if($inputs['body']['password']) 
                {
                    $where['password'] = Hash::make($inputs['body']['password']);
                }

                if($inputs['body']['language_id']) 
                {
                    $where['language_id'] = $inputs['body']['language_id'];
                }
                 if($inputs['body']['profile_pic'])
                {
                    
                    // $image = Image::make(base64_decode(preg_replace('#^data:image/\w+;base64,#i', '',$inputs['body']['profile_pic'])));
                    // dd($image);
                    // $image->orientate();
                    $image_parts = explode(";base64,", $inputs['body']['profile_pic']);
                    $image_type_aux = explode("image/", $image_parts[0]);
                    $image_type = $image_type_aux[1];
                    $image_base64 = base64_decode($image_parts[1]);
                    $image = Image::make($image_base64);
                    // dd($image);
                    $image->orientate();
                    $imageName = time() . '.'.$image_type;
                    
                    if($user_details['profile_pic'] != null)
                    {
                        if(File::exists(public_path('images/avaters/'.$user_details['profile_pic'])))
                        {
                            unlink(public_path('images/avaters/'.$user_details['profile_pic']));
                        }
                    }
                    

                    $image->save($upload_image_path . $imageName);
                    
                    $where['profile_pic'] = $imageName;
                }

                if($where){
                    $update_status = User::where('id', $user_details['id'])->update($where);
                }

                if($update_status)
                {
                    
                    $user = User::find($user_details['id']);
                        
                    $output['id'] = $user['id']??'';
                    $output['username'] = $user['username']??'';
                    $output['email'] = $user['email']??'';
                    $output['email_verified_at'] = $user['email_verified_at']?date('d-m-Y', strtotime($user['email_verified_at'])):'';
                    $output['profile_pic'] = $image_path.$user['profile_pic']??'';
                    $output['language_code'] = $user['language']['code']??'';
                    $output['package_id'] = $user['package_id']??'';
                    $output['is_verified'] = $user['is_verified']??'';
                    $output['status'] = $user['status']??'';
                    $output['device_type'] = $user['device_type']??'';
                    $output['device_token'] = $user['device_token']??'';
                    $output['user_type'] = $user['user_type']??'';
                    $output['membership_type'] = $user['membership_type']??'';
                    $output['inputs'] = $inputs??(object)[];


                    $response = array('status'=>200, 'message'=>$obj['profile-update-success'], 'result'=>$output);
                    return response()->json($response);           
                   
                    
                }
                else
                {
                    $response = array('status'=>201, 'message'=>$obj['profile-update-failed'], 'result'=>(object)[]);
                    return response()->json($response); 
                }
            }

            
        }
        else
        {
            $response = array('status'=>201, 'message'=>$obj['auth-token-required'], 'result'=>(object)[]);
            return response()->json($response);
        }   
    }

    
    public function logout(Request $request)
    {
        $inputs['header']['authorization'] = $request->header('Authorization');
        $inputs['header']['accept'] = $request->header('Accept');
        $inputs['header']['lang'] = $request->header('Accept-Language');
        $inputs['body'][] = '';
        $folder = public_path('language/'.$inputs['header']['lang'].'.js');
        $json = file_get_contents($folder);
        $obj = json_decode($json, TRUE);

        auth('api')->logout();

        return response()->json(['status'=>200,'message' => $obj['logout-success'], 'result'=>compact('inputs')]);
    }

    
    public function refresh()
    {
        return $this->respondWithToken(auth('api')->refresh());
    }

    
    protected function respondWithToken($token)
    {
        return array(
            'access_token' => $token,
            'token_type' => 'bearer',
            'expires_in' => auth('api')->factory()->getTTL() * 60
        );
    }

    public function gettermsandCondition()
    {
        $output = array();

        $get_terms_condition  = Master_cms::select(
                                'title as title',
                                'description as description')  ->where('id', '=', 4)->first();
        if(count( $get_terms_condition) > 0)
        {
            $output['terms_condition'] = $get_terms_condition;

            $response = array('status'=>200, 'message'=>'success', 'result'=> $output);
            return response()->json($response);
        }
        else
        {
            $response = array('status'=>201, 'message'=>'failed', 'result'=> (object)[]);
            return response()->json($response);
        }
    }
}
