<?php

namespace App\Http\Controllers;

use Session;
use App\User;
use App\UserInvite;
use App\UserCompany;
use App\UserTeamMember;
use App\UserRole;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use App\Commons\mailer;
use Illuminate\Support\Facades\Mail;



class UserController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
    }

    /**
     * Display register form for user.
     *
     * @return \Illuminate\Http\Response
     */
    public function register()
    {
        return view('front.register');
    }


    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request) {
        
        // return $lead;
        $v = Validator::make($request->all(), [
                    'fname' => 'required|alpha',
                    'lname' => 'required|alpha',
                    'email' => 'required|unique:users|email',
                    'phone' => 'required|numeric',
                    'password' => 'required|min:6|confirmed',
                    'password_confirmation' => 'required|min:6',
                    'company' => 'required'
        ],[
    			'fname.alpha' => ' The name may only contain letters.',
    			'lname.alpha' => ' The name may only contain letters.',
    			
    		]);

        if ($v->fails()) {
            Session::flash('popup', 'yes');
            return redirect()->back()->with(['errors' => $v->errors()]);
        } else {
            $name = $request->fname . ' ' . $request->lname;
            $email = $request->email;
            $phone = $request->phone;
            $password = $request->password;
            $company = $request->company;

            if ($request->company_id) {

                $user_type = '3';
            } else {

                $user_type = '2';
            }
            try {
                $trial_begin_at= date('Y-m-d');
                $trial_ends_at =  date('Y-m-d', strtotime($trial_begin_at. ' + 15 days'));
                \DB::beginTransaction();
                $user = new User;
                $user->first_name = $request->fname;
                $user->last_name = $request->lname;
                $user->name = $name;
                $user->email = $email;
                $user->mobile_no = $phone;
                $user->is_active = '1';
                $user->password = bcrypt($password);
                $user->activation_key = md5(rand(1000000, 10000000000));
                $user->remember_token = '';
                $user->user_type = $user_type;
                $user->save();
				
                $userId = $user->id;
                if ($user_type === '2') {
                   
                    User::find($userId)->update(['trial_ends_at'=>$trial_ends_at, 'subs_ends_at'=>$trial_ends_at]);
                    $company = UserCompany::create(['company_name' => $company, 'company_phone' => $phone, 'is_active' => '1', 'user_id' => $userId, 'company_trial_ends_at'=>$trial_ends_at, 'company_subs_ends_at'=>$trial_ends_at]);
                    $utm = new UserTeamMember;
					$utm->user_id = $userId;
					$utm->company_id = $company->id;
					$utm->member_id = $userId;
					$utm->is_active = '1';
					$utm->save();
                    
                $this->createUserRole($userId, $company->id, $user_type);
                } else {
					
                    $company = UserCompany::find($request->company_id);
                    
                    $trial_ends_at = $company->user_role->user->trial_ends_at;
                    User::find($userId)->update(['trial_ends_at'=>$trial_ends_at, 'subs_ends_at'=>$trial_ends_at]);
                    
                    $this->createUserRole($userId, $company->id, $user_type);
                    
                    $Invite = new UserInvite();
                    $Invite->user_id = $company->user_id;
                    $Invite->company_id = $request->company_id;
                    $Invite->name = $name;
                    $Invite->mobile_no = $phone;
                    $Invite->registered_email = $email;
                    $Invite->invited_token = md5(rand(1000000, 10000000000));
                    $Invite->save();


                    $UserTeamMember = new UserTeamMember;
                    $UserTeamMember->user_id = $company->user_id;
                    $UserTeamMember->company_id = $request->company_id;
                    $UserTeamMember->member_id = $userId;
                    $UserTeamMember->is_active = '1';
                    $UserTeamMember->save();
                }
                $data='{"lead":{"first_name":"'.$request->fname.'", "last_name":"'.$request->lname.'","email":"'.$request->email.'","mobile_number":"'.$request->phone.'", "company": {"name":"'.$request->company.'"} }}';

                \DB::commit();
                $lead=createLead($data);
                \Mail::send('email.signup_email',['name'=>$user->name], function ($message) use($request) {
                              $message->subject('Getting Started with CDR!');
                              $message->to($request->email);
                        });
                
                //Session::flash('success', 'Registration completed successfully.');
                if ( \Auth::attempt(['email' => $email, 'password' => $password]) ) {   
                    return redirect()->route('company.dashboard');  
                } else {    
                    return \Redirect::back()->with('error', 'Sorry, Error ocurred. Please try again.'); 
                }
                //return redirect()->back()->with('success', 'Registration completed successfully.');
            } catch (\Exception $ex) {
                \DB::rollback();
                return redirect()->back()->with('error', $ex->getMessage());
            }
        }
    }
    
    //function to make entry in user_role model
    public function createUserRole($user_id, $company_id, $user_type){
        
        $userRole =  new UserRole;
        $userRole->user_id = $user_id;
        $userRole->company_id = $company_id;
        $userRole->user_type = $user_type;
        $userRole->save();

    }

    /**
     * Display login page.
     *
     *
     */
    public function login()
    {
        
//        if(\Auth()->user()){
//            return redirect()->route('projectinfo.index');
//        }
        return view('front.login',['title'=>'Login to your session']);
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function loginPost( Request $request )
    {
        // if($request->user_timezone <> ''){
        //     date_default_timezone_set($request->user_timezone);
        // }
        // date_default_timezone_set('America/Los_Angeles');
        // echo date_default_timezone_get();die;
        
        $v = Validator::make($request->all(), [
        'login_email'=> 'required|email',
        'login_password' => 'required',
        ]);

    	if ($v->fails())
    	{
        return redirect()->back()->withErrors($v->errors());
    	}else{
            $data = $request->all();
            $userDetail = User::whereEmail($data['login_email'])->first();

            if ( empty($userDetail) ) {

                return \Redirect::back()->with('error', 'Sorry, entered email does not exist. Please enter valid email.');
            } else if (!\Hash::check($data['login_password'], $userDetail->password)) {

                return redirect()->back()->with('error', 'Entered password did not match! Please enter correct password');
            }else {
                if ( \Auth::attempt(['email' => $request->login_email, 'password' => $request->login_password]) ) {
                    return redirect()->route('company.dashboard');
                } else {
                    return \Redirect::back()->with('error', 'Sorry, Error ocurred. Please try again.');
                }
            }
    	}
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        //
    }


    /**
     * render view for change password.
     *
     */
//    public function changePassword()
//    {
//        return view('user.changePassword',['title'=>'Change Password']);
//    }
     public function userAccount()
    {
       $user = User::find(\Auth::user()->id);
      
        return view('user.account',['user'=>$user,'title'=>'User Account']);
    }
    
    
    public function changeProfile( Request $request, $id ){
       
        $v = Validator::make($request->all(),[
            'first_name'=>'required',
            'last_name'=>'required',
            'mobilenumber' => 'required|numeric'
            ]);
        if ($v->fails())
        {  
        return redirect()->back()->with(['errors' => $v->errors()]);
        }else{
            if( $request->file('image') ){
                $image = $request->file('image');
                $imageName = time() . '.' . $image->getClientOriginalExtension();
                $image = $request->file('image');
                $t = \Storage::disk('s3')->put($imageName,
                        file_get_contents($image),
                        'public');
                $profileImage = \Storage::disk('s3')->url($imageName);
                $user = User::find($id)->update([
                                                'image'=>$profileImage
                                                ]);
               }
               
                $name = $request->first_name.' '.$request->last_name;
                $user = User::find($id)->update([
                                                'first_name'=>$request->first_name,
                                                'last_name'=>$request->last_name,
                                                'mobile_no'=>$request->mobilenumber,
                                                'name' => $name
                                                ]);

                if( $user ){
                   return redirect()->route('account')->with('success','Profile updated successfully');
                }else{
                   return redirect()->back()->with('error', 'user does not exist.'); 
                }

            }

    }

    /**
     * change user password.
     *
     */
    
    public function changePassword( Request $request, $id )
    {
        $v = Validator::make($request->all(),[
            'currentPassword'=>'required',
            'newPassword' => 'required|min:6',
            'confirmPassword' => 'required|same:newPassword|min:6'
            ]);
        if ( $v->fails() )
        { 
        Session::flash('popup', 'yes');
        return redirect()->back()->with(['errors' => $v->errors()]);
        }else
        {
            $user = User::select('password')->where('id',$id)->first();
           
            if( Hash::check($request->currentPassword, $user->password) )
            {  
                if( User::where('id', $id)->update(['password' => bcrypt($request->newPassword)]) ){
                    return redirect()->back()->with('success','Password updated successfully');
                }else
                {  
                    return redirect()->back()->with('error','Something went wrong please try again.');
                }
            }else
            {    Session::flash('popup', 'yes');
                $v->errors()->add('currentPassword', "Your current password does't match!");
                return redirect()->back()->withErrors($v->errors());
            }
            
        }
    }
    
     public function getForgetPassword()
    {
        return view('user.forgetPassword');
    }


    public function postForgetPassword( Request $request ){
       $v = Validator::make($request->all(),[
            'email' => 'required|exists:users,email' 
            ]);
        if ( $v->fails() )
        { 
        //Session::flash('popup', 'yes');
        return redirect()->back()->with(['errors' => $v->errors()]);
        }else { 
            
            $user=User::whereEmail($request->email)->first();

            if($user)
            {
                try
                {
                    $activation_key=md5(time());
                    $user->activation_key=$activation_key;
                    $user->save();

                    $url=route('user.recovery',['email'=>$request->email,'activation_key'=>$activation_key]);
                     \Mail::send('email.resetpassword',['name'=>$user->name,'activationUrl'=>$url], function ($message) use($request) {
                              $message->subject('CDR: Forgot Password Details');
                              $message->to($request->email);
                        });
                         return redirect()->back()->with('success','A reset password link has been sent to your entered email address.');
                }
                catch(\Exception $e)
                {
                     \Session::flash('info',$e->getMessage());
                     return redirect()->back();  
                }


            }
            return redirect()->back()->with('error','User does not exist');
            }
//        $this->validate($request, [
//            'email' => 'required|exists:users,email'  
//        ]);
      
       

    }
    
    public function recovery(Request $request) {
        
        if ($request->email && $request->activation_key) {

            $user = User::whereEmail($request->email)->first();
            if ($user->activation_key == $request->activation_key) {

                $id = $user->id;
                return view('user.newPassword', compact('id'));
            } else {

                return redirect()->route('user.get-login')->with('error', 'Your password reset link is not valid, or already used.');
            }
        } else {
            if(!$request->email){
                
                return redirect()->route('user.get-login')->with('error', 'Email does not exist.');
                
            }else{
                
                 return redirect()->route('user.get-login')->with('error', 'Your password reset link is not valid, or already used.');
            }
        }
    }
    
    public function resetPassword(Request $request){
        $this->validate($request, [
            'newPassword' => 'required|min:6',
            'confirmPassword' => 'required|same:newPassword|min:6',
            'id' => 'required|exists:users,id'
        ]);
        $newPassword = $request->newPassword;
        $confirmPassword = $request->confirmPassword;
            if($newPassword == $confirmPassword){
                 $user=User::whereId($request->id)->first();
                 $user->password= bcrypt($newPassword);
                 $user->activation_key = '';
                 $user->save();
                 return redirect()->route('user.get-login')->with('message','Password reset successfully.');
            }else{
                return redirect()->back()->with('message', 'entered password doesnot match.');
            }
    }
   
    public function logout(){
		\Session::flush();
        \Auth::logout();
        return redirect()->route('front_home');
    }
    
    public function invitationAccept(Request $request){
         
        if($request->activation_key){
            $user=UserInvite::whereInvitedToken($request->activation_key)->first();
            
            if($user->invited_token == $request->activation_key){
                $user = UserInvite::find($user->id)->update([
                                                'is_pending'=>'0'
                                                ]);
               
              return view('user.inviteAcceptence', compact('success'));
            }else{
                  return view('user.inviteAcceptence', compact('error'));
            }
        }else{
            return redirect()->back();
        }
       
    }
    
    public function userPanel($key) {
        \Auth::logout();
        $userDetail = User::where('auth_token', $key)->first();
        $user = \Auth::loginUsingId($userDetail->id);
        
        if ($user) {
            
            return redirect()->route('projectinfo.index');
       
        } else {
            
            return \Redirect::back()->with('error', 'Sorry, Error ocurred. Please try again.');
        }
    }
    
     public function moveData() {
		
      
        $results = User::from('users as u')->join('user_company as uc', 'uc.user_id', '=', 'u.id')->select('u.id as user_id', 'u.user_type as user_type', 'uc.id as company_id')->get();
        if (count($results) > 0) {
            foreach ($results as $result) {
                $role = new UserRole;
                $role->user_id = $result->user_id;
                $role->company_id = $result->company_id;
                $role->user_type = $result->user_type;
                $role->save();
                 $members = UserTeamMember::where('company_id', $result->company_id)->where('member_id', '!=',$result->user_id)->get();
                 if (count($members) > 0) {
                    foreach ($members as $member) {
                        $mrole = new UserRole;
                        $mrole->user_id = $member->member_id;
                        $mrole->company_id = $result->company_id;
                        $mrole->user_type = '3';
                        $mrole->save();
                        
                    }
                     
                 }
            }
            
            echo 'success';
        }
    }
    
    //function to move data in user role table

    public function moveUserDataToUserTeamMember() {
        $i = 0;
        $utms = UserTeamMember::distinct()->pluck('member_id')->toArray();
        $results = User::from('users as u')
                ->join('user_role as ur', 'ur.user_id', '=', 'u.id')
                ->where('ur.user_type', '2')
                ->select('u.id', 'u.first_name', 'u.last_name', 'u.name', 'u.mobile_no', 'ur.user_type', 'ur.company_id')
                ->whereNotIn('u.id', $utms)->get();
        try {
           
            if (count($results) > 0) {
                 \DB::beginTransaction();
                foreach ($results as $result) {
                    $utm = new UserTeamMember;
                    $utm->user_id = $result->id;
                    $utm->company_id = $result->company_id;
                    $utm->member_id = $result->id;

                    $utm->save();
                }
                \DB::commit();
                echo 'success';
            }
        } catch (\Excepton $ex) {
            \DB::rollback();
            return $ex->getMessage();
        }
    }
    
    
    //function to update trial and subscription ends at.

    public function updateTrialSubscription() {
       
        $results = User::from('users as u')
                ->join('user_company as uc', 'uc.user_id', '=', 'u.id')
                ->where('u.user_type', '2')
                ->select('u.id as user_id','u.trial_ends_at', 'u.subs_ends_at')->orderBy('u.id', 'desc')->get();
        
         //dd($results);       
        try {
           
            if (count($results) > 0) {
                 \DB::beginTransaction();
                foreach ($results as $result) {
                    $uc = UserCompany::where('user_id',$result->user_id)->first();
                    $uc->company_trial_ends_at = $result->trial_ends_at;
                    $uc->company_subs_ends_at = date('Y-m-d', strtotime($result->subs_ends_at));
                    $uc->save();
//                    UserCompany::where('user_id', $result->user_id)
//                            ->update(['company_trial_ends_at'=>$result->trial_ends_at, 'company_subs_ends_at'=>$result->subs_ends_at]);
                    
                }
                \DB::commit();
                echo 'success';
            }
        } catch (\Excepton $ex) {
            \DB::rollback();
            return $ex->getMessage();
        }
    }

   public function moveName(){
        
        $users = User::all();
        
        foreach($users as $user){
            $name= explode(' ', $user->name);
            $firstName = $name[0];
            $lastName = '';
            if(sizeof($name) > 1){
                $lastName = $name[sizeof($name)-1];
            }
            $data = User::find($user->id);
            $data->first_name = $firstName;
            $data->last_name = $lastName;
            $data->save();
        }
        dd('success');
    }

    public function updateSubtype(){
        
        $users = User::from('users as u')->where('u.is_paid', '1')->get();
        
                try {
           
            if (count($users) > 0) {
                 \DB::beginTransaction();
                User::where('is_paid', true)->update(['sub_type' => '1']);
                \DB::commit();
                echo 'success';
}
        } catch (\Excepton $ex) {
            \DB::rollback();
            echo 'failure';
            return $ex->getMessage();
        }
       
    }

}
