<?php

namespace App\Http\Controllers\Api\v1;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Mail;
use App\Employee;
use App\Feedback;
use App\Manager;
use App\User;
use App\Device;
use App\EmailTemplate;
use App\EmailQueue;
use App\ManagerPlan;
use App\SubscriptionPlans;
use App\Branch;
use App\Organization;

/**
 * EmployeeController Class Doc Comment
 *
 * @category Class
 * @package  Api
 * @author   Ketan Patel - ketan.patel@brainvire.com
 *
 */
class EmployeeController extends Controller
{

    public function __construct()
    {
        //$this->middleware('oauth', ['except' => ['index']]);
        //$this->middleware('auth:api', ['except' => ['index']]);

        $this->customErrorFormat();
    }

    public function dashboardData(Request $request)
    {
        $this->validate($request, [
            'user_id' => 'required',
            'duration' => 'required',
        ]);

        $employeeId = $request->input('user_id');
        $duration = $request->input('duration');

        $employee_status = $this->restrictUser($employeeId);
       

        switch ($duration) {
            case 'today':
                $start = date('Y-m-d 00:00:00');
                $end = date("Y-m-d H:i:s");
                break;
            case 'week':
                $day = date('w');
                $start = date('Y-m-d 00:00:00', strtotime('-' . $day . ' days'));
                $end = date('Y-m-d 00:00:00', strtotime('+' . (6 - $day) . ' days'));
                break;
            case 'month':
                $start = date('Y-m-01 00:00:00');
                $end = date('Y-m-t 00:00:00');
                break;
            case 'year':
                $start = date('Y-m-d 00:00:00', strtotime(date('Y-01-01')));
                $end = date('Y-m-d 00:00:00', strtotime('last day of december'));
                break;
            default:
                $day = date('w');
                $start = date('Y-m-d 00:00:00', strtotime('-' . $day . ' days'));
                $end = date('Y-m-d 00:00:00', strtotime('+' . (6 - $day) . ' days'));
                break;
        }

//        $feedbacks = DB::table('feedback')
//                ->where('user_id', '=', $employeeId)
//                ->where('created', '>=', $start)
//                ->where('created', '<=', $end)
//                ->get();
//        $feedbackcount = $feedbacks->count();
//
//
//        $pics = DB::table('feedback')
//                ->where('user_id', '=', $employeeId)
//                ->where('profile_pic', '!=', null)
//                ->where('profile_pic', '!=', '')
//                ->where('created', '>=', $start)
//                ->where('created', '<=', $end)
//                ->get();
//        $picscount = $pics->count();

        $feedbacks = DB::table('feedback')
                ->where('user_id', '=', $employeeId)
                ->where('by_link', '=', 1)
//                ->where('feedback', '!=', null)
//                ->where('feedback', '!=', '')
                ->where('created', '>=', $start)
                ->where('created', '<=', $end)
                ->get();
        $feedbackcount = $feedbacks->count();
        
        $pics = DB::table('feedback')
                ->where('user_id', '=', $employeeId)
                ->where('by_link', '=', 0)
                ->where('feedback', '!=', null)
                ->where('feedback', '!=', '')
                ->where('created', '>=', $start)
                ->where('created', '<=', $end)
                ->get();
        $picscount = $pics->count();
        
        $responseArray = array('feedbackcount' => $feedbackcount, 'picscount' => $picscount);

        if($employee_status == 200)
        {
            return response()->json([
                    'code' => 200,
                    'status' => 'success',
                    'data' => $responseArray,
                    'message' => 'Dashboard data fetched successfully.'
            ]);
        }
        else
        {
            return response()->json([
                    'code' => $employee_status,
                    'status' => 'fail',
                    'data' => '',
                    'message' => 'We are sorry for the inconvenience.Please contact your manager'
            ]);

        }
        
    }

    /**
     * Custom error response format
     *
     * @return Illuminate\Http\Response
     */
    private function customErrorFormat()
    {
        static::$errorFormatter = function ($validator) {
            $arr = [];
            foreach ($validator->errors()->toArray() as $key => $value) {
                $arr[$key] = $value[0];
            }
            return [
                'code'    => 400,
                'message' => $arr,
                'status' => 'error',
            ];
        };
    }

    public function forgotPassword(Request $request)
    {
        $this->validate($request, [
            'email' => 'required',
        ]);

        $email = $request->input('email');
        $user = User::where('email', $email)
                ->where('role', 'ROLE_EMPLOYEE')
                ->first();
        if ($user) {
            if ($user->status === 2) {
                return response()->json(['code' => 400, 'status' => 'fail', 'message' => ACC_BLOCKED]);
            }

            $username = $user->name;
            $planPass = str_random(8);
//            $temporaryPassword = Hash::make($planPass);
//            $user->password = $temporaryPassword;
            $user->password_token = $planPass;
            $date = new \DateTime();
            $oneDay = $date->modify('+1 day');
            $expiryDate = $oneDay->format('Y-m-d H:i:s');
            $user->expire_on = $expiryDate;

            if ($user->save()) {
                $body = EmailTemplate::where('slug', 'TEMP_PASSWORD')->first();
                $employee = Employee::where('user_id',$user->id)->first();
                $organization = Organization::find($employee->organization_id);
                $mngrUser = User::find($organization->user_id);
                        if ($organization) {
                            $helperobj = new \App\CommonHelper();
                            $docUrl = $helperobj->publicPath();

                            if($organization->organization_pic != "")
                            {

                                    $image = $docUrl.'/orgLogo/' .$organization->id. '/' . $organization->organization_pic;
                                    if (!file_exists($image)) {
                                        $image = ANGULARURL .'assets/img/PU-logo.png';
                                    } else {
                                        $image = url().'/orgLogo/' .$organization->id. '/' . $organization->organization_pic;
                                    }

                            }
                            else
                            {
                                $image = ANGULARURL .'assets/img/PU-logo.png';
                            }

                            

                        } else {
                           $image = ANGULARURL .'assets/img/PU-logo.png';
                        }

                if (!empty($body)) {
                    $tmp1 = str_replace("##USER_NAME##", $username, $body['description']);
                    $tmp2 = str_replace("##TEMPORARY_PASSWORD##", $planPass, $tmp1);
                    $tmp3 = str_replace("##SUPPORT_MAIL##", SUPPORT_MAIL, $tmp2);
                    $tmp4 = str_replace("##LOGO##", $image, $tmp3);
                    $tmp5 = str_replace("##YEAR##", date('Y'), $tmp4);
                    $data['html'] = str_replace("##PASSWORD_EXPIRY_NOTE##", PASSWORD_EXPIRY_NOTE, $tmp5);
                    $subject      = str_replace("##USER_NAME##", $organization->name, $body['subject']);

                    $emailQueue               = new EmailQueue();
                    $emailQueue->type         = TYPE_EMP_FORGOT;
                    $emailQueue->mail_subject = $subject;
                    $emailQueue->mail_to      = $email;
                    $emailQueue->mail_from    = FROM_IN_MAIL;
                    $emailQueue->mail_body    = $data['html'];
                    $emailQueue->is_send      = 0;
                    $date                     = new \DateTime();
                    $ddf                      = $date->format('Y-m-d H:i:s');
                    $emailQueue->created      = $ddf;
                    $emailQueue->save();
                }
                $data = array('email' => $email);
                return response()->json(['code' => 200, 'status' => 'success', 'message' => EMPLOYEE_FORGOTPASS, 'data' => $data]);
            } else {
                return response()->json(['code' => 400, 'status' => 'fail', 'message' => SOMETHING_WENT_WRONG]);
            }
        } else {
            return response()->json(['code' => 400, 'status' => 'fail', 'message' => EMAIL_NOT_FOUND]);
        }
    }

    public function changePassword(Request $request)
    {
        $this->validate($request, [
            'email'         => 'required',
            'new_password'  => 'required',
            'temp_password' => 'required',
            'type'          => 'required',
        ]);
        
        $email        = $request->input('email');
        $newPassword  = $request->input('new_password');
        $tempPassword = $request->input('temp_password');
        $type         = $request->input('type');

        $user = User::where('email', $email)
                ->where('role', 'ROLE_EMPLOYEE')
                ->first();
        if ($user) {
            if ($user->status === 2) {
                return response()->json(['code' => 400, 'status' => 'fail', 'message' => ACC_BLOCKED]);
            }

            $date = new \DateTime();
            if ($type == 'before') {
                $expiryDate = 0;
                $currentDateTime = strtotime($date->format('Y-m-d H:i:s'));
                if (Hash::check($newPassword, $user->password)) {
                    return response()->json(['code' => 400, 'status' => 'fail', 'message' => NOT_SAME_OLDPASS]);
                } elseif ($user->password_token != $tempPassword) {
                    return response()->json(['code' => 400, 'status' => 'fail', 'message' => WRONG_TEMP_PASS]);
                }

                if ($user->expire_on != '') {
                    $expiryDate = strtotime($user->expire_on);
                }
                if ($expiryDate < $currentDateTime) {
                    return response()->json(['code' => 400, 'status' => 'fail', 'message' => TEMP_PASS_EXPIRED]);
                }
            } else {
                if (Hash::check($newPassword, $user->password)) {
                    return response()->json(['code' => 400, 'status' => 'fail', 'message' => NOT_SAME_OLDPASS]);
                } elseif (!Hash::check($tempPassword, $user->password)) {
                    return response()->json(['code' => 400, 'status' => 'fail', 'message' => WRONG_CURRENT_PASS]);
                }
            }

            $username             = $user->name;
            $user->password       = Hash::make($newPassword);
            $user->password_token = null;
            $user->expire_on      = null;
            $ddf                  = $date->format('Y-m-d H:i:s');
            $user->updated_at     = $ddf;

            if ($user->save()) {
                $body = EmailTemplate::where('slug', 'EMPLOYEE_PASSWORD_CHANGED')->first();
                if (!empty($body)) {
                    $employee = Employee::where('user_id', $user->id)->first();
                    $organization = Organization::find($employee->organization_id);
                    $mngrUser = User::find($organization->user_id);
                        if ($organization) {
                            $helperobj = new \App\CommonHelper();
                            $docUrl = $helperobj->publicPath();

                            if($organization->organization_pic != "")
                            {

                                $image = $docUrl.'/orgLogo/' .$organization->id. '/' . $organization->organization_pic;
                                if (!file_exists($image)) {
                                    $image = ANGULARURL .'assets/img/PU-logo.png';
                                } else {
                                    $image = url().'/orgLogo/' .$organization->id. '/' . $organization->organization_pic;
                                }

                            }
                            else
                            {
                                $image = ANGULARURL .'assets/img/PU-logo.png';
                            }


                        } else {
                            $image = ANGULARURL .'assets/img/PU-logo.png';
                        }
                    $tmp1         = str_replace("##USER_NAME##", $username, $body['description']);
                    $tmp2         = str_replace("##LOGO##", $image, $tmp1);
                    $tmp3         = str_replace("##YEAR##", date('Y'), $tmp2);
                    $data['html'] = str_replace("##SUPPORT_LINK##", SUPPORT_LINK, $tmp3);
                    $subject      = str_replace("##USER_NAME##", $organization->name, $body['subject']);

                    $emailQueue               = new EmailQueue();
                    $emailQueue->type         = TYPE_CHANGE_PASS;
                    $emailQueue->mail_subject = $subject;
                    $emailQueue->mail_to      = $email;
                    $emailQueue->mail_from    = FROM_IN_MAIL;
                    $emailQueue->mail_body    = $data['html'];
                    $emailQueue->is_send      = 0;
                    $date                     = new \DateTime();
                    $ddf                      = $date->format('Y-m-d H:i:s');
                    $emailQueue->created      = $ddf;
                    $emailQueue->save();
                }
                return response()->json(['code' => 200, 'status' => 'success', 'message' => PASS_CHANGED]);
            } else {
                return response()->json(['code' => 400, 'status' => 'fail', 'message' => SOMETHING_WENT_WRONG]);
            }
        } else {
            return response()->json(['code' => 400, 'status' => 'fail', 'message' => EMAIL_NOT_FOUND]);
        }
    }

    public function ownFeedback(Request $request)
    {
        $this->validate($request, [
            'user_id' => 'required',
            'feedback' => 'required',
        ]);

        $employee = Employee::where('user_id', $request->input('user_id'))->first();
        if (!$employee) {
            return response()->json(['code' => 400, 'status' => 'fail', 'message' => RECORD_NOT_FOUND]);
        } else {
            $employee->feedback = $request->input('feedback');
            $date = new \DateTime();
            $ddf = $date->format('Y-m-d');
            $employee->feedback_on = $ddf;
            $employee->updated = $date->format('Y-m-d H:i:s');

            if ($employee->save()) {
                return response()->json(['code' => 200, 'status' => 'success','message' => THANKS_FEEDBACK]);
            } else {
                return response()->json(['code' => 400, 'status' => 'fail','message' => SOMETHING_WENT_WRONG]);
            }
        }
    }

    public function login_old(Request $request)
    {
        $this->validate($request, [
            'email'     => 'required',
            'password'  => 'required',
            'device_id' => 'required',
            'os_type'   => 'required',
        ]);

        $employee = User::where('email', $request->input('email'))
                ->where('role', 'ROLE_EMPLOYEE')
                ->first();
        if ($request->input('passcode')) {
                $manager = User::where('passcode', $request->input('passcode'))
                                ->where('role', 'ROLE_MANAGER')
                                ->first();
                            if (!$manager) {
                                return response()->json(['code' => 400, 'status' => 'fail', 'message' => WRONG_PASSCODE]);
                            } 
        } 
        if ($employee) {
            if ($employee->status === 2 || $employee->status === 0) {
                return response()->json(['status' => 'fail', 'code' => 400, 'message' => ACC_BLOCKED]);
            }
            if ((Hash::check($request->input('password'), $employee->password)) || ($request->input('password') == $employee->password_token))  {
                $date             = new \DateTime();
                
                $currentDate=date('Y-m-d h:i:s');
                
                if(Hash::check($request->input('password'), $employee->password)){

                }else{
                    if($employee->expire_on !=""){

                        if(strtotime($currentDate) > strtotime($employee->expire_on)){
                            return response()->json(['status' => 'fail', 'code' => 400, 'message' => 'Your Password is expired']);
                        }
                    }else{
                        return response()->json(['status' => 'fail', 'code' => 400, 'message' => 'Your Password is incorrect']);
                    }
                }

                $userId = $employee->id;
                $result = Employee::where('user_id', $userId)
                        ->select('id', 'organization_id', 'plan_expired', 'branch_id')->first();

                if (!$result) {
                    return response()->json(['status' => 'fail', 'code' => 400, 'message' => RECORD_NOT_FOUND]);
                }

                if ($result->plan_expired < $date->format('Y-m-d')) {
                    return response()->json(['status' => 'fail', 'message' => MANAGER_PLAN_EXPIRED]);
                }

                $branch = Branch::find($result->branch_id);
                $placeValue = $branch ? $branch->place_value : '';

                $employee->fail_attempt = 0;
                $firstLogin = $employee->first_login;
                $employee->save();
                if ($firstLogin == 2) {
                    $employee->first_login = 1;
                    $employee->save();

                    $deviceId = $request->input('device_id');
                    $deviceRecord = Device::where('device_id', $deviceId)->first();
                    if ($deviceRecord) {
                        $deviceStatus = $deviceRecord->status;
                        if ($deviceStatus == 2 || $deviceStatus == 0) {
                            return response()->json(['status' => 'fail', 'code' => 400, 'message' => NOT_APPROVED]);
                        }
                    } else {
                        if ($request->input('passcode')) {
                            
                        } else {
                            return response()->json(['status' => 'fail', 'code' => 400, 'message' => PASSCODE_REQUIRED]);
                        }
                        $device = new Device();
                        $device->device_id = $request->input('device_id');
                        $device->organization_id = $result->organization_id;
                        $device->employee_id = $employee->id;
                        $device->os_type = $request->input('os_type');

                        // status   1: active, 2: pending
                        $device->status = 1;
                        $date = new \DateTime();
                        $ddf = $date->format('Y-m-d H:i:s');
                        $device->created = $ddf;
                        $device->save();
                        //return response()->json(['status' => 'success','code' => 100, 'message' => DEVICE_APPROVAL]);
                    }
                } else {
                    $deviceId = $request->input('device_id');
                    $deviceRecord = Device::where('device_id', $deviceId)->first();

                    if ($deviceRecord) {
                        $deviceStatus = $deviceRecord->status;
                        if ($deviceStatus == 2 || $deviceStatus == 0) {
                            return response()->json(['status' => 'fail', 'code' => 400, 'message' => NOT_APPROVED]);
                        }
                        if ($employee->first_login!=0) {
                            $employee->first_login = 0;
                            $employee->save();
                        }
                    } else {
                        $device = new Device();
                        $device->device_id = $request->input('device_id');
                        $device->organization_id = $result->organization_id;
                        $device->employee_id = $employee->id;
                        $device->os_type = $request->input('os_type');
                        
                        if ($request->input('passcode')) {
                        } else {
                            return response()->json(['status' => 'fail', 'code' => 400, 'message' => PASSCODE_REQUIRED]);
                        }
                        // status   1: active, 2: pending
                        $device->status = 1;
                        $date = new \DateTime();
                        $ddf = $date->format('Y-m-d H:i:s');
                        $device->created = $ddf;
                        $device->save();
                        //return response()->json(['status' => 'success', 'code' => 100, 'message' => DEVICE_APPROVAL]);
                    }
                }
                $manager = Manager::where('organization_id',$result->organization_id)->first();
                $fb_page_url = '';
                if($manager->review_identifier) {
                    $fb_page_url = 'https://www.facebook.com/'.$manager->review_identifier.'/reviews/';
                }
                /*----- check fb an twitter post allow or not-----*/
                $allowed_fbpost = 0;
                $allowed_twitter_post = 0;
                
                if($manager->client_id != "" && $manager->client_secret != "")
                {
                    $allowed_fbpost = 1;
                }
                if($manager->twitter_consumer_key != "" && $manager->twitter_consumer_secret != "" && $manager->twitter_access_token != "" && $manager->twitter_access_token_secret != "") {
                    $allowed_twitter_post = 1;
                }
                $returnArray = array(
                    'id' => $userId,
                    'org_id' => $result->organization_id,
                    'name' => $employee->name,
                    'email' => $employee->email,
                    'place_value'=>$placeValue ? $placeValue : '',
                    'fb_page' => $fb_page_url,
                    'isHippa' => $manager->isHippa,
                    'manager_id' => $manager->user_id,
                    'allowed_fbpost' => $allowed_fbpost,
                    'allowed_twitter_post' => $allowed_twitter_post
                );
                return response()->json(['code' => 200, 'status' => 'success', 'data' => $returnArray]);
            } else {
                $failAttempt = $employee->fail_attempt;
                if ($failAttempt >= 2) {
                    $employee->status = 2;
                }
                $employee->fail_attempt = $failAttempt + 1;
                $employee->save();
                return response()->json(['status' => 'fail', 'code' => 400, 'message' => INVALID_CREDENTIALS]);
            }
        } else {
            return response()->json(['status' => 'fail', 'code' => 400, 'message' => INVALID_CREDENTIALS]);
        }
    }


    public function login(Request $request)
    {
        $this->validate($request, [
            'email'     => 'required',
            'password'  => 'required',
            'device_id' => 'required',
            'os_type'   => 'required',
        ]);

        $employee = User::where('email', $request->input('email'))
                ->where('role', 'ROLE_EMPLOYEE')
                ->first();
        $user_delete_email = $request->input('email').'_deleted';

        $delete_employee = User::withTrashed()->where(['email' => $user_delete_email])->where('role', 'ROLE_EMPLOYEE')->first();

        if($delete_employee)
        {
            return response()->json(['status' => 'fail', 'code' => 400, 'message' => EMPLOYEE_DELETE]);
        }
        
      
        if ($employee) {
            if ($employee->status === 2 || $employee->status === 0) {
                return response()->json(['status' => 'fail', 'code' => 400, 'message' => ACC_BLOCKED]);
            }

            $man_emp_data = Employee::select('organization_id')->where('user_id',$employee->id)->first();


            
            $manager_data = Organization::select('user_id')->where('id',$man_emp_data->organization_id)->first();
           

            $emp_manger = User::select('id')->where('status',1)->where('id',$manager_data->user_id)->first();
            

                if($emp_manger)
                {
                        if ($request->input('passcode')) {
                                $manager = User::where('passcode', $request->input('passcode'))
                                ->where('role', 'ROLE_MANAGER')
                                ->first();
                                if (!$manager) {
                                    return response()->json(['code' => 400, 'status' => 'fail', 'message' => WRONG_PASSCODE]);
                                } 
                        }

                        if ((Hash::check($request->input('password'), $employee->password)) || ($request->input('password') == $employee->password_token))  {
                            $date             = new \DateTime();
                
                                $currentDate=date('Y-m-d h:i:s');
                
                            if(Hash::check($request->input('password'), $employee->password)){

                            }else{
                                if($employee->expire_on !=""){

                                    if(strtotime($currentDate) > strtotime($employee->expire_on)){
                                        return response()->json(['status' => 'fail', 'code' => 400, 'message' => 'Your Password is expired']);
                                    }
                                }else{
                                    return response()->json(['status' => 'fail', 'code' => 400, 'message' => 'Your Password is incorrect']);
                                }
                            }

                            $userId = $employee->id;
                            $result = Employee::where('user_id', $userId)
                                    ->select('id', 'organization_id', 'plan_expired', 'branch_id')->first();

                            if (!$result) {
                                return response()->json(['status' => 'fail', 'code' => 400, 'message' => RECORD_NOT_FOUND]);
                            }

                            if ($result->plan_expired < $date->format('Y-m-d')) {
                                return response()->json(['status' => 'fail', 'message' => MANAGER_PLAN_EXPIRED]);
                            }

                            $branch = Branch::find($result->branch_id);
                            $placeValue = $branch ? $branch->place_value : '';

                            $employee->fail_attempt = 0;
                            $firstLogin = $employee->first_login;
                            $employee->save();
                            if ($firstLogin == 2) {
                                $employee->first_login = 1;
                                $employee->save();

                                $deviceId = $request->input('device_id');
                                $deviceRecord = Device::where('device_id', $deviceId)->first();
                                if ($deviceRecord) {
                                    $deviceStatus = $deviceRecord->status;
                                    if ($deviceStatus == 2 || $deviceStatus == 0) {
                                        return response()->json(['status' => 'fail', 'code' => 400, 'message' => NOT_APPROVED]);
                                    }
                                } else {
                                    if ($request->input('passcode')) {
                                        
                                    } else {
                                        return response()->json(['status' => 'fail', 'code' => 400, 'message' => PASSCODE_REQUIRED]);
                                    }
                                    $device = new Device();
                                    $device->device_id = $request->input('device_id');
                                    $device->organization_id = $result->organization_id;
                                    $device->employee_id = $employee->id;
                                    $device->os_type = $request->input('os_type');

                                    // status   1: active, 2: pending
                                    $device->status = 1;
                                    $date = new \DateTime();
                                    $ddf = $date->format('Y-m-d H:i:s');
                                    $device->created = $ddf;
                                    $device->save();
                                    //return response()->json(['status' => 'success','code' => 100, 'message' => DEVICE_APPROVAL]);
                                }
                            } else {
                                $deviceId = $request->input('device_id');
                                $deviceRecord = Device::where('device_id', $deviceId)->first();

                                if ($deviceRecord) {
                                    $deviceStatus = $deviceRecord->status;
                                    if ($deviceStatus == 2 || $deviceStatus == 0) {
                                        return response()->json(['status' => 'fail', 'code' => 400, 'message' => NOT_APPROVED]);
                                    }
                                    if ($employee->first_login!=0) {
                                        $employee->first_login = 0;
                                        $employee->save();
                                    }
                                } else {
                                    $device = new Device();
                                    $device->device_id = $request->input('device_id');
                                    $device->organization_id = $result->organization_id;
                                    $device->employee_id = $employee->id;
                                    $device->os_type = $request->input('os_type');
                                    
                                    if ($request->input('passcode')) {
                                    } else {
                                        return response()->json(['status' => 'fail', 'code' => 400, 'message' => PASSCODE_REQUIRED]);
                                    }
                                    // status   1: active, 2: pending
                                    $device->status = 1;
                                    $date = new \DateTime();
                                    $ddf = $date->format('Y-m-d H:i:s');
                                    $device->created = $ddf;
                                    $device->save();
                                    //return response()->json(['status' => 'success', 'code' => 100, 'message' => DEVICE_APPROVAL]);
                                }
                            }
                            $manager = Manager::where('organization_id',$result->organization_id)->first();
                             $fb_page_url = '';
                            if($manager->review_identifier) {
                                $fb_page_url = 'https://www.facebook.com/'.$manager->review_identifier.'/reviews/';
                            }
                            /*----- check fb an twitter post allow or not-----*/
                            $allowed_fbpost = 0;
                            $allowed_twitter_post = 0;
                
                            if($manager->client_id != "" && $manager->client_secret != "")
                            {
                                $allowed_fbpost = 1;
                            }
                            if($manager->twitter_consumer_key != "" && $manager->twitter_consumer_secret != "" && $manager->twitter_access_token != "" && $manager->twitter_access_token_secret != "") {
                                $allowed_twitter_post = 1;
                            }
                            $returnArray = array(
                                'id' => $userId,
                                'org_id' => $result->organization_id,
                                'name' => $employee->name,
                                'email' => $employee->email,
                                'place_value'=>$placeValue ? $placeValue : '',
                                'fb_page' => $fb_page_url,
                                'isHippa' => $manager->isHippa,
                                'manager_id' => $manager->user_id,
                                'allowed_fbpost' => $allowed_fbpost,
                                'allowed_twitter_post' => $allowed_twitter_post
                            );
                        return response()->json(['code' => 200, 'status' => 'success', 'data' => $returnArray]);
                    } else {
                        $failAttempt = $employee->fail_attempt;
                        if ($failAttempt >= 2) {
                            $employee->status = 2;
                        }
                        $employee->fail_attempt = $failAttempt + 1;
                        $employee->save();
                        return response()->json(['status' => 'fail', 'code' => 400, 'message' => INVALID_CREDENTIALS]);
                    } 



                }
                else
                {
                    return response()->json(['status' => 'fail', 'code' => 400, 'message' => EMPLOYEE_DELETE]);
                }

        } else {
            return response()->json(['status' => 'fail', 'code' => 400, 'message' => INVALID_CREDENTIALS]);
        }
    }

    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index(Request $request)
    {
        // $employees = Employee::all();
        if ($request->feedback=='yes') {
            $employees = DB::table('employees as em')
                ->select(
                    'u.id',
                    'em.feedback',
                    'u.name',
                    'u.email',
                    'org.name as organisazion',
                    'u.mobile',
                    'em.total_customers',
                    'br.name as branch_name'
                )
                ->leftJoin('users as u', 'em.user_id', '=', 'u.id')
                ->leftJoin('organizations as org', 'em.organization_id', '=', 'org.id')
                ->leftJoin('branches as br', 'em.branch_id', '=', 'br.id')
                ->where('u.role', '=', 'ROLE_EMPLOYEE')
                ->where('em.feedback', '!=', null)
                ->orderBy('u.id', 'desc')
                ->get();
        } else {
             $employees = DB::table('employees as em')
                ->select(
                    'u.id',
                    'em.feedback',
                    'u.name',
                    'u.email',
                    'org.name as organisazion',
                    'u.mobile',
                    'em.total_customers',
                    'br.name as branch_name'
                )
                ->leftJoin('users as u', 'em.user_id', '=', 'u.id')
                ->leftJoin('organizations as org', 'em.organization_id', '=', 'org.id')
                ->leftJoin('branches as br', 'em.branch_id', '=', 'br.id')
                ->Where('u.deleted_at', '=', NULL)
                ->where('u.role', '=', 'ROLE_EMPLOYEE')
                ->orderBy('u.id', 'desc')
                ->get();
        }
        foreach($employees as $key=>$value){
            $total_link_sent = 0;
            $total_link_clicked = 0;
            $feedback = DB::table('feedback')->where('feedback.user_id', $value->id)->get();
            $total_link_sent += count($feedback);
            foreach ($feedback as $k => $v) {
                $feedback = DB::table('feedback_send_link_log')
                        ->where('feedback_id', $v->id)
                        ->first();
                if (!empty($feedback)) {
                    $total_link_clicked += $feedback->is_clicked_count;
                }
            }
            $employees[$key]->total_send_link = $total_link_sent;
            $employees[$key]->total_link_click_count = $total_link_clicked;
        }
        return response()->json(['employee'=>$employees,'status' => 'success']);
    }

    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function selected(Request $request)
    {

        $this->validate($request, [
            'manager_id' => 'required',
        ]);

        $employees = array();
        $managerId = $request->manager_id;
 
        $manager = Manager::where('user_id', $managerId)->select('organization_id')->first();
        $helperobj = new \App\CommonHelper();
        $dateformat = env("DATE_FORMAT");
        $timeformat = env("TIME_FORMAT");
        if ($manager) {
            $orgId = $manager->organization_id;
            $employees = DB::table('employees as em')
                    ->select(
                        'u.id',
                        'em.feedback',
                        'em.feedback_on',
                        'u.name',
                        'u.email',
                        'org.name as organisazion',
                        'u.mobile',
                        'em.total_customers',
                        'br.name as branch_name'
                    )
                    ->leftJoin('users as u', 'em.user_id', '=', 'u.id')
                    ->leftJoin('organizations as org', 'em.organization_id', '=', 'org.id')
                    ->leftJoin('branches as br', 'em.branch_id', '=', 'br.id')
                    ->where('em.organization_id', '=', $orgId)
                    ->where('u.role', '=', 'ROLE_EMPLOYEE')
                    ->orderBy('em.id', 'desc')
                    ->get();
            if ($request->feedback=='Yes') {
                $employees = DB::table('employees as em')
                    ->select(
                        'u.id',
                        'em.feedback',
                        'em.feedback_on',
                        'u.name',
                        'u.email',
                        'org.name as organisazion',
                        'u.mobile',
                        'em.total_customers',
                        'br.name as branch_name'
                    )
                    ->leftJoin('users as u', 'em.user_id', '=', 'u.id')
                    ->leftJoin('organizations as org', 'em.organization_id', '=', 'org.id')
                    ->leftJoin('branches as br', 'em.branch_id', '=', 'br.id')
                    ->where('em.organization_id', '=', $orgId)
                    ->where('u.role', '=', 'ROLE_EMPLOYEE')
                    ->where('em.feedback', '!=', null)
                    ->orderBy('em.id', 'desc')
                    ->get();
            }
        }
        
        foreach($employees as $key=>$value){
            $total_link_sent = 0;
            $total_link_clicked = 0;
            $feedback = DB::table('feedback')->where('feedback.user_id', $value->id)->get();
            $total_link_sent += count($feedback);
            foreach ($feedback as $k => $v) {
                $feedback = DB::table('feedback_send_link_log')
                        ->where('feedback_id', $v->id)
                        ->first();
                if (!empty($feedback)) {
                    $total_link_clicked += $feedback->is_clicked_count;
                }
            }
            $employees[$key]->feedback_on = $helperobj->convertDateByFormat($value->feedback_on, $dateformat.' '.$timeformat);
            $employees[$key]->total_send_link = $total_link_sent;
            $employees[$key]->total_link_click_count = $total_link_clicked;
        }
        
        return response()->json(['employee'=> $employees,'status' => 'success']);
    }

    /**
     * Get the specified resource from storage.
     *
     * @param  int $rid
     * @return \Illuminate\Http\Response
     */
    public function show($rid)
    {
        $data = array();
        $manager = '';
        $employee = DB::table('employees as em')
                ->select(
                    'u.id',
                    'em.user_id',
                    'em.feedback',
                    'em.feedback_on',
                    'u.name',
                    'u.email',
                    'u.status',
                    'em.updated',
                    'org.name as organisazion',
                    'em.organization_id',
                    'u.mobile',
                    'em.total_customers',
                    'em.total_feedback',
                    'br.name as branch_name',
                    'em.branch_id'
                )
                ->leftJoin('users as u', 'em.user_id', '=', 'u.id')
                ->leftJoin('organizations as org', 'em.organization_id', '=', 'org.id')
                ->leftJoin('branches as br', 'em.branch_id', '=', 'br.id')
                ->where('em.user_id', $rid)
                ->get();
        if (count($employee) > 0) {
            $orgId = $employee[0]->organization_id;
            $manager = DB::table('organizations as org')
                    ->select('u.name')
                    ->leftJoin('users as u', 'org.user_id', '=', 'u.id')
                    ->where('org.id', $orgId)
                    ->get();
            if (!empty($manager)) {
                $manager = $manager[0]->name;
            }


            $data['id'] = $employee[0]->id;
            $data['user_id'] = $employee[0]->user_id;
            $data['name'] = $employee[0]->name;
            $data['email'] = $employee[0]->email;
            $data['status'] = $employee[0]->status;
            $data['mobile'] = $employee[0]->mobile;
            $data['managername'] = $manager;
            $data['organizationname'] = $employee[0]->organisazion;
            $data['organization_id'] = $employee[0]->organization_id;
            $data['feedback'] = $employee[0]->feedback;
            $data['feedback_on'] = $employee[0]->feedback_on;
            $data['branch'] = $employee[0]->branch_name;
            $data['branch_id'] = $employee[0]->branch_id;
            $data['total_customers'] = $employee[0]->total_customers;
            $data['total_feedback'] = $employee[0]->total_feedback;
            $data['updated'] = $employee[0]->updated;
            return response()->json(['status' => 'success', 'data' => $data]);
        } else {
            return response()->json(['status' => 'fail', 'data' => $data]);
        }
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        $this->validate($request, [
            'name'            => 'required',
            // 'email'           => 'required|email|unique:users,email|unique:feedback,email',
            'email'           => 'required|email',
            'mobile'          => 'required',
            'password'        => 'required',
            'organization_id' => 'required',
            'branch_id'       => 'required',
            'status'          => 'required',
        ]);
        $date             = new \DateTime();
        $userId = $request->userId;
        $email  = $request->email;

        //check User Exist
        $chkUser = User::select('id')->where('email',$email)->where('role','ROLE_EMPLOYEE')->first();

        if ($chkUser) {
            return response()->json(['status' => 'fail', 'message' => EMAIL_EXIST]);
        }

        // $customer = Feedback::where('email',$request->email)->count();

        // if($customer > 0)
        // {
        //     return response()->json(['status' => 'fail', 'message' => EMAIL_EXIST]);
        // }

        // we are allowing same email for manager and employee, so here we are checking the 
        // user role also
        $existingEmployee = User::where('email', $email)
                            ->where('id', '<>', $userId)
                            ->first();
        if ($existingEmployee) {
            //return response()->json(['message' => array('email' => 'The email has already been taken.'), 'status' => 'error'], 400);
        }  

        $mangerPlan = ManagerPlan::where('manager_id', $userId)->where('status', 'current')->first();
        
        if ($mangerPlan) {
            if ($mangerPlan->expire_on < $date->format('Y-m-d')) {
                $mangerPlan->status = 'expired';
                $mangerPlan->save();
                return response()->json(['status' => 'fail', 'message' => PLAN_EXPIRED]);
            }


            $subscriptionPlan = SubscriptionPlans::find($mangerPlan->plan_id);
            if ($mangerPlan->no_of_used_users < $subscriptionPlan->no_of_users) {
                $user             = new User();
                $user->name       = $request->name;
                $user->email      = $request->email;
                $user->password   = Hash::make($request->password);
                $user->mobile     = $request->mobile;
                $user->role       = 'ROLE_EMPLOYEE';

                $ddf              = $date->format('Y-m-d');
                $user->created_at = $ddf;

                // status values:   0=Inactive, 1=Active, 2=Pending
                $user->status     = $request->status;
                $mangerPlan->no_of_used_users = $mangerPlan->no_of_used_users + 1;
                $mangerPlan->save();
                if ($user->save()) {
                    $lastInsertId = $user->id;
                    $employee = new Employee();
                    $employee->user_id = $lastInsertId;
                    $employee->organization_id = $request->organization_id;
                    $employee->branch_id = $request->branch_id;
                    $employee->plan_expired = $mangerPlan->expire_on;

                    if ($employee->save()) {
                        /*------ send mail to emplyee ------*/
                        $this->sendMailToEmployee($employee->user_id, $request->userId, $request->password);
                        return response()->json(['status' => 'success', 'message' => EMPLOYEE_CREATED]);
                    } else {
                        return response()->json(['status' => 'fail', 'message' => SOMETHING_WENT_WRONG]);
                    }
                } else {
                    return response()->json(['status' => 'fail', 'message' => SOMETHING_WENT_WRONG]);
                }
            } else {
                return response()->json(['status' => 'fail', 'message' => EXCEED_USED_CONTACT]);
            }
        } else {
            return response()->json(['status' => 'fail', 'message' => PURCHASE_PLAN]);
        }
    }

    /**
     * Update the specified resource in storage.
     *
     * @param \Illuminate\Http\Request $request
     * @param int                      $rid
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $rid)
    {
        $this->validate($request, [
            'name'            => 'required',
            // 'email'           => 'required|email|unique:feedback,email|unique:users,email,' . $rid,
            'email'           => 'required|email',
            'mobile'          => 'required',
            'organization_id' => 'required',
            'branch_id'       => 'required',
            'status'          => 'required',
        ]);
        
        //check User Exist
        $chkUser = User::select('id')->where('email',$request->email)->where('role','ROLE_EMPLOYEE')->where('id','!=',$rid)->first();

        if ($chkUser) {
            return response()->json(['status' => 'fail', 'message' => EMAIL_EXIST]);
        }
        // //customer
        // $customer = Feedback::where('email',$request->email)->count();

        // if($customer > 0)
        // {
        //     return response()->json(['status' => 'fail', 'message' => EMAIL_EXIST]);
        // }

        $user = User::find($rid);
        if (!empty($user)) {
            $user->name  = $request->name;
            $user->email = $request->email;

            // get user's manager id
            $umanager   = Manager::where('organization_id', $request->organization_id)->select('user_id')->first();
            if ($umanager) {
                $umanagerId = $umanager->user_id;
                // we are allowing same email for manager and employee, so here we are checking the 
                // user role also
                $existingEmployee = User::where('email', $request->email)
                            ->whereNotIn('id', [$rid,$umanagerId]) // user's own id or his manager id
                            ->first();
                // if ($existingEmployee) {
                //     return response()->json(['message' => array('email' => 'The email has already been taken.'), 'status' => 'error'], 400);
                // }
            } else {
                return response()->json(['status' => 'fail', 'message' => SOMETHING_WENT_WRONG]);
            }    
            
            if ($request->password != '') {
                $user->password = Hash::make($request->password);
            }

            if ($request->status == 1) {
                $user->fail_attempt = 0 ;
            }

            $user->mobile = $request->mobile;
            $user->status = $request->status;
            $date = new \DateTime();
            $ddf  = $date->format('Y-m-d H:i:s');
            $user->updated_at = $ddf;
            $user->save();

            if ($user->save()) {
                $lastInsertId = $user->id;
                $employee = Employee::where('user_id', $lastInsertId)
                                ->get()->first();
                $employee->organization_id = $request->organization_id;
                $employee->branch_id = $request->branch_id;

                if ($employee->save()) {
                     if($request->status == 0 || $request->status == 2)
                     {
                         $login_data = DB::table('oauth_access_tokens')->where('user_id',$user->id)->first();

                            if($login_data)
                            {
                                DB::table('oauth_access_tokens')
                                        ->where('user_id', $user->id)
                                        ->update([
                                        'revoked' => '1',
                                        'expires_at' => Carbon::now()->subDays(400),
                                        ]);
                            }

                     }
                    return response()->json(['status' => 'success', 'message' => EMPLOYEE_UPDATED]);
                } else {
                    return response()->json(['status' => 'fail', 'message' => SOMETHING_WENT_WRONG]);
                }
            } else {
                return response()->json(['status' => 'fail', 'message' => SOMETHING_WENT_WRONG]);
            }
        } else {
            return response()->json(['status' => 'fail', 'message' => RECORD_NOT_FOUND]);
        }
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int $rid
     * @return \Illuminate\Http\Response
     */
    public function destroy($rid)
    {
        $employeeId = Employee::where('user_id', $rid)->first();
        if ($employeeId) {
            Employee::destroy($employeeId->id);
        }
        if (User::destroy($rid)) {
            return response()->json(['status' => 'success', 'message' => 'User deleted successfully.']);
        }
    }

    /**
     * Update the specified resource in storage.
     *
     * @param \Illuminate\Http\Request $request
     * @return \Illuminate\Http\Response
     */
    public function changeStatus(Request $request)
    {
        $this->validate($request, [
            'id' => 'required',
        ]);

        $rid = $request->id;
        $employee = User::find($rid);
        if (!$employee) {
            return response()->json(['status' => 'fail', 'message' => RECORD_NOT_FOUND]);
        }
        $employee->status = $request->status;
        $date = new \DateTime();
        $ddf = $date->format('Y-m-d H:i:s');
        $employee->updated_at = $ddf;

        if ($employee->save()) {
            return response()->json(['status' => 'success']);
        } else {
            return response()->json(['status' => 'fail']);
        }
    }
    
    /**
     * send mail to employee
     * @param type $empId
     * @param type $managerId
     * @param type $empPwd
     */
    public function sendMailToEmployee($empId, $managerId, $empPwd) {
        
        $manager = User::where('id', $managerId)->first();
        $employee = User::where('id', $empId)->first();
        
        /*------- employee data --------*/
        $empUsername = $employee->name;
        $empEmail = $employee->email;
        $managerUsername = $manager->name;
        $passcode = $manager->passcode;
        $androidAppUrl = ANDROID_APP_URL;
        $iosAppUrl = ISO_APP_URL;
        
        /*---- get logo---*/
        $organization = Organization::where('user_id', $managerId)->first();
        
        if ($organization) {
                $helperobj = new \App\CommonHelper();
                $docUrl = $helperobj->publicPath();

                if($organization->organization_pic != "")
                {
                    $image = $docUrl . '/orgLogo/' . $organization->id . '/' . $organization->organization_pic;
                    if (!file_exists($image)) {
                        $image = ANGULARURL . 'assets/img/PU-logo.png';
                    } else {
                        $image = url() . '/orgLogo/' . $organization->id . '/' . $organization->organization_pic;
                    }
                }
                else
                {
                    $image = ANGULARURL . 'assets/img/PU-logo.png';
                }
                
            } else {
                $image = ANGULARURL . 'assets/img/PU-logo.png';
            }
        
        $body = EmailTemplate::where('slug', 'ADD_EMPLOYEE_BY_MANAGER')->first();
        if (!empty($body)) {
                    $tmp1 = str_replace("##USER_NAME##", $empUsername, $body['description']);
                    $tmp2 = str_replace("##SUPPORT_LINK##", SUPPORT_LINK, $tmp1);
                    $tmp3 = str_replace("##LOGO##", $image, $tmp2);
                    $tmp4 = str_replace("##MANAGER_NAME##", $organization->name, $tmp3);
                    $tmp5 = str_replace("##EMAIL##", $empEmail, $tmp4);
                    $tmp6 = str_replace("##PASSWORD##", $empPwd, $tmp5);
                    $tmp7 = str_replace("##PASSCODE##", $passcode, $tmp6);
                    $tmp8 = str_replace("##ANDROID_APP_URL##", $androidAppUrl, $tmp7);
                    $tmp9 = str_replace("##YEAR##", date('Y'), $tmp8);
                    $data['html'] = str_replace("##ISO_APP_URL##", $iosAppUrl, $tmp9);
                    $subject = $body['subject'];
                    $emailQueue = new EmailQueue();
                    $emailQueue->type = TYPE_ADD_EMP;
                    $emailQueue->mail_subject = $subject;
                    $emailQueue->mail_to = $empEmail;
                    $emailQueue->mail_from = FROM_IN_MAIL;
                    $emailQueue->mail_body = $data['html'];
                    $emailQueue->is_send = 0;
                    $date = new \DateTime();
                    $ddf = $date->format('Y-m-d H:i:s');
                    $emailQueue->created = $ddf;
                    $emailQueue->save();
                }
    }


    /**
    ** Dashboard Restricated 
    ** 09 Jan 2019
    **/

    public function restrictUser($id)
    {
        $employee_id = $id ;

        $user_emp = User::select('status')->where('id',$employee_id)->where('status',1)->first();
        
        $status = "";
        if($user_emp)
        {
           $man_emp_data = Employee::select('organization_id')->where('user_id',$employee_id)->first();

           if($man_emp_data)
           {

                $manager_data = Organization::select('user_id')->where('id',$man_emp_data->organization_id)->first();

                if($manager_data)
                {
                    $emp_manger = User::select('id')->where('status',1)->where('id',$manager_data->user_id)->first();

                    if($emp_manger)
                    {
                        $status = 200;
                    }
                    else
                    {
                        $status = 401;
                    }
                }
                else
                {
                    $status = 401;
                }

           }
           else
           {
                $status = 401;
           }
        }
        else
        {
            $status = 401;
        }

        return $status;
    }
}
