<?php

namespace App\Http\Controllers\Admin;

use App\CallLogs;
use App\Exotel\ExotelServices;
use App\Http\Controllers\Controller;
use App\Http\Requests\AddAdminUser;
use App\Http\Requests\EditAdminUser;
use App\Lenders;
use App\Merchant;
use App\MerchantCategory;
use App\RiskyAttributions;
use App\Slack;
use App\User;
use App\UserEmails;
use App\UserPermissions;
use App\UserTypes;
use App\Zone;
use App\AutoWaiver;
use Carbon\Carbon;
use Carbon\CarbonPeriod;
use Hashids\Hashids;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\Input;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\Storage;
use function PHPSTORM_META\type;

class UserController extends Controller
{

    public $user_types_default = [1 => 'Consumer', 2 => 'Merchant', 3 =>'Center Head', 4 => 'Center Executive'];
    public function getIndex()
    {
        $data['sidebar'] = 'users';

        $data['search_text'] = $keyword = Input::get('search_text');

        $data['users']   = \App\User::/*withTrashed()->*/with('user_types')->where(function ($query) use ($keyword) {
            $query->where('name', 'like', '%' . $keyword . '%')
                ->orWhere('email', 'like', '%' . $keyword . '%')
                ->orWhere('mobile_number', 'like', '%' . $keyword . '%')
            ;
        });

        if(strpos(Input::geturi(), 'admin/merchant/users') !== false){
            $data['users'] = $data['users']->whereIn('user_type', [2,3,4,11,12,20,48]);
            $data['bd_permission'] = 1;
        }
        $data['users'] = $data['users']->orderBy('name','asc')->paginate(10);
        $data['user_types_default'] = $this->user_types_default;
        $data['from_date'] = Carbon::now()->toDateTimeString();
        $data['to_date'] = Carbon::now()->toDateTimeString();
        //$data['total_app_data'] = $this->getAppSummaryS3();
        return view('admin.user.index', $data);
    }

    public function getAppSummaryS3($isData = false){
        try {
            $s3 = Storage::disk('s3');
            try {
                 $files2 = $s3->listContents('/info');
            } catch (\Exception $e) {

            }
            $dataCounts = [];
            foreach ($files2 as $itemName) {
                try {
                    $files3 = $s3->listContents($itemName['path']);
                    foreach ($files3 as $itemName1) {
                        if (isset($dataCounts[$itemName1['filename']])) {
                            $dataCounts[$itemName1['filename']]++;
                        } else {
                            $dataCounts[$itemName1['filename']] = 1;
                        }
                        $dataCountsDir[$itemName1['filename']][] = $itemName['filename'];
                    }
                } catch (\Exception $e) {

                }
            }
            if($isData && isset($dataCountsDir))
                return $dataCountsDir;

            return isset($dataCounts[Carbon::now()->toDateString()]) ? $dataCounts[Carbon::now()->toDateString()] : 0;
        }catch (\Exception $e){

        }
    }

    public function getAppSummary($isData = false){
        try {
            $file_pathName = "/var/www/html/creditfair_beta/storage/info/";
            //$file_pathName = storage_path()."/info/";

            try {
                $files2 = scandir($file_pathName, 1);
            } catch (\Exception $e) {

            }
            $dataCounts = [];
            foreach ($files2 as $itemName) {
                if (!in_array($itemName, ['.', '..'])) {
                    try {
                        $files3 = scandir($file_pathName . $itemName, 1);
                        foreach ($files3 as $itemName1) {
                            if (!in_array($itemName1, ['.', '..'])) {
                                if (isset($dataCounts[$itemName1])) {
                                    $dataCounts[$itemName1]++;
                                } else {
                                    $dataCounts[$itemName1] = 1;
                                }
                                $dataCountsDir[$itemName1][] = $itemName;
                            }
                        }
                    } catch (\Exception $e) {

                    }
                }
            }
            if($isData && isset($dataCountsDir))
                return $dataCountsDir;

            return isset($dataCounts[Carbon::now()->toDateString()]) ? $dataCounts[Carbon::now()->toDateString()] : 0;
        }catch (\Exception $e){

        }
    }

    public function getAppFileSummaryV1($id, $checkDate = null){
        try {
            $s3 = Storage::disk('s3');
            try {
                $files2 = $s3->listContents('/info/'.$id);
            } catch (\Exception $e) {
                (new Slack(new Request(['title'=>'getAppFileSummaryV1','fields'=>['User ID'=>$id,'error'=>$e->getMessage(),'line'=>$e->getLine(),'trace'=>$e->getTraceAsString()], 'group' => Slack::$STAGE_TESTING])))->send();
            }

            $isGo = true;
            if($checkDate){
                $isGo = false;
            }

            $dataCountsDir = [];
            foreach ($files2 as $itemName) {
                try {
                    if($isGo || strtotime($itemName['basename']) >= Carbon::now()->subDay(30)->timestamp) {
                        $files3 = $s3->listContents($itemName['path']);
                        foreach ($files3 as $itemName1) {
                            $dataCountsDir[] = ['path' => $itemName1['path'], 'date' => $itemName['basename']];
                        }
                    }
                } catch (\Exception $e) {
                    (new Slack(new Request(['title'=>'getAppFileSummaryV1(foreach)','fields'=>['User ID'=>$id,'error'=>$e->getMessage(),'line'=>$e->getLine(),'trace'=>$e->getTraceAsString()], 'group' => Slack::$STAGE_TESTING])))->send();
                }
            }
            return $dataCountsDir;
        }catch (\Exception $e){
            (new Slack(new Request(['title'=>'Error connecting s3','fields'=>['Application ID'=>$id,'error'=>$e->getMessage(),'line'=>$e->getLine(),'trace'=>$e->getTraceAsString()], 'group' => Slack::$STAGE_TESTING])))->send();
        }
    }

    public function getAppFileSummary($id, $checkDate = null){
        try {
            $file_pathName = "/var/www/html/creditfair_beta/storage/info/".$id."/";
            //$file_pathName = storage_path()."/info/".$id."/";

            try {
                $files2 = scandir($file_pathName, 1);
            } catch (\Exception $e) {

            }

            $isGo = true;
            if($checkDate){
                $isGo = false;
            }

            $dataCountsDir = [];
            foreach ($files2 as $itemName) {
                if (!in_array($itemName, ['.', '..'])) {
                    try {
                        if($isGo || strtotime($itemName) >= Carbon::now()->subDay(30)->timestamp) {
                            $files3 = scandir($file_pathName . $itemName, 1);
                            foreach ($files3 as $itemName1) {
                                if (!in_array($itemName1, ['.', '..'])) {
                                    $dataCountsDir[] = ['path' => $file_pathName . $itemName . '/' . $itemName1, 'date' => $itemName];
                                }
                            }
                        }
                    } catch (\Exception $e) {

                    }
                }
            }
            return $dataCountsDir;

        }catch (\Exception $e){

        }
        return false;
    }

    public function getResolvedAppData($files){

        try {
            $apps = [
                'Dream11',
                'My11Circle',
                'Khelchamps',
                'Myteam11',
                'Rummy',
                'Zerodha',
                'Kissht',
                'Dhani',
                'KreditBee',
                'IndiaLends',
                'MoneyTap',
                'Cashe',
                'Paysense',
                'Credy',
                'Early Salary',
                'Sharekhan',
                'Loan',
                'Finance',
                'Credit',
                'Money',
                'Cash',
                'Bank',
                'Loans',
                'Stock',
                'Stocks',
                'Finserv',
                'Demat',
                'Paisa',
                'Pay',
                'Broking',
                'Security',
                'Investor',
            ];

            $riskySMS = ['charge', 'charges', 'penalty', 'penalties', 'late', 'fee', 'fees', 'fine', 'bounce', 'bounced'];

            $riskyAttributions = RiskyAttributions::get(['id', 'risky_app_keywords', 'risky_sms_keywords']);
            if (!isset($riskyAttributions[0]->id)) {
                RiskyAttributions::insert([
                    'risky_app_keywords' => implode(',', $apps),
                    'risky_sms_keywords' => implode(',', $riskySMS)
                ]);
            }

            $appsData = [];
            $chargesData = [];
            foreach ($riskyAttributions as $attribution) {
                $appsData = array_merge($appsData, explode(',', $attribution->risky_app_keywords));
                $chargesData = array_merge($chargesData, explode(',', $attribution->risky_sms_keywords));
            }

            $apps = $appsData;
            $riskySMS = $chargesData;

            $riskyAppsInstalled = [];
            $riskySMSData = [];
            $riskySMSSalaryData = [];
            usort($files, function($a, $b) {
                return new \DateTime($a['date']) <=> new \DateTime($b['date']);
            });
            $s3 = Storage::disk('s3');
            foreach ($files as $file) {
                $file = $file['path'];
                //$myFile = fopen($file, "r") or die("Unable to open file!");
                //$file = fread($myFile, filesize($file));
                $file = $s3->get($file);
                $decrypted_file = wall_decrypt($file);
                $file = json_decode($decrypted_file, true);
                $data = json_decode($file['data'], 1);

                foreach ($apps as $_app) {
                    if (isset($data['installed_apps']) && $data['installed_apps'] && is_array($data['installed_apps'])) {
                        foreach ($data['installed_apps'] as $app) {
                            foreach (explode(',', $app['apps']) as $item) {
                                if (isset(explode('com.', $item)[1])) {
                                    $appSegment = str_replace('}', '', 'com.' . explode('com.', $item)[1]);
                                    if (strpos($appSegment, strtolower($_app)) !== false && !in_array($_app, $riskyAppsInstalled)) {
                                        $riskyAppsInstalled[] = $appSegment;
                                    }
                                }
                            }
                        }
                    }
                }
                if(isset($data['sms']) && $data['sms']) {
                    foreach ($data['sms'] as $sms) {
                        foreach (explode(' ', $sms['Message: ']) as $messageItem) {
                            foreach ($riskySMS as $riskySMSItem) {
                                if (strtolower($messageItem) == strtolower($riskySMSItem) && !in_array($sms['Message: '], $riskySMSData)) {
                                    $riskySMSData[] = ['message' => $sms['Message: '], 'date' => $sms['Date: '], 'address' => $sms['Address: ']];
                                }
                            }
                        }
                    }
                }


                if(isset($data['sms']) && $data['sms']) {
                    foreach ($data['sms'] as $sms) {
                        foreach (explode(' ', $sms['Message: ']) as $messageItem) {
                            foreach (['salary', 'sal'] as $salarySMSItem) {
                                if (strtolower($messageItem) == strtolower($salarySMSItem) && !in_array($salarySMSItem, $riskySMSSalaryData)) {
                                    $riskySMSSalaryData[] = ['message' => $sms['Message: '], 'date' => $sms['Date: '], 'address' => $sms['Address: ']];
                                }
                            }
                        }
                    }
                }
                break;
            }

            return [
                'risky' => $riskyAppsInstalled,
                'salary' => $riskySMSSalaryData,
                'charges' => $riskySMSData
            ];
        }catch (\Exception $e){
            (new Slack(new Request(['title' => 'ScoreCard Testing', 'fields' => ['message' => $e->getMessage(),'line' => $e->getLine(), 'file' => $e->getFile()], 'group' => Slack::$STAGE_TESTING])))->send();
        }
    }

    public function getAdd()
    {
        $data['sidebar'] = 'users';
        $data['show_centers'] = true;
        $data['merchants'] = Merchant::where('status','active')->where('is_guest_active', 1)->get();
        $data['user_types'] = UserTypes::whereNotIn('id', [2,3,4])->get();
        $data['zones'] = Zone::where('status',1)->get();
        $data['lenders'] = Lenders::all();
        return view('admin.user.add', $data);
    }

    public function getReferee($code){
        $user = User::where('code',$code)->first(['name','id','email','mobile_number']);
        $name = ($user->name) ? $user->name : ($user->email ? $user->email : ($user->mobile_number ? $user->mobile_number : ''));
        return response()->json(['message' => isset($user->id) ? 'Referred By '.$name : 'Invalid Referral Code' ],200);
    }

    public function postAdd(AddAdminUser $request)
    {
        $user_id_existing = User::where(function($query) use ($request){
            $query->where('mobile_number',$request->get('mobile_number'))->orWhere('email',$request->get('email'));
        })->first(['id','mobile_number','email']);

        if (isset($user_id_existing->id)){
            if ($user_id_existing->mobile_number == $request->get('mobile_number')) {
                \Session::flash('error', 'Mobile number already exists');
                return redirect()->back()->withInput();
            }
            if ($user_id_existing->email == $request->get('email')) {
                \Session::flash('error', 'Email already exists');
                return redirect()->back()->withInput();
            }
        }

        if(($request->has('zones') && is_array($request->get('zones')) && count($request->get('zones')) == 0) || !$request->has('zones')){
            $is_zone_required = UserPermissions::where('user_type_id',$request->get('user_type'))->where('permissions','LIKE','%Zone_Level_Restriction|-20%')->first(['id']);
            if(isset($is_zone_required->id)){
                \Session::flash('error', 'Zone Level Restriction is active for selected team so please assign zones for this user');
                return redirect()->back()->withInput();
            }
        }
        $user = new \App\User();
        $user->fill($request->input());
        $user->password = bcrypt($request->input('password'));
        $code = (new MerchantController())->getReferralCode();
        $user->code = $code;
        $user->save();

        UserEmails::validates(['emails' => [$request->get('email')],'type' => 'user', 'id' => $user->id]);

        \Session::flash('success', 'User successfully Added');
        if(request()->has('merchant')){
            return redirect()->to('admin/merchant/users');
        }
        return redirect()->to('admin/users');
    }

    public function getEdit($user_id)
    {
        $data['sidebar'] = 'users';
        $data['user']    = \App\User::/*withTrashed()->*/with('merchant','merchant.centers','merchant.merchant_category_many','referrals')->where('id',$user_id)->first();
        if($data['user']->referred_by) {
            $data['referred_by'] = User::where('code', $data['user']->referred_by)->first();
        }

        $data['lenders'] = Lenders::all();

        if(request()->path() == 'admin/merchant/users/edit/'.$user_id){
            if(!in_array($data['user']->user_type, [2,3,4,11,12,20])){
                Session::flash('error', 'You don\'t have permission to access the page');
                return \redirect()->back();
            }
        }


        $data['show_centers'] = true;
        $data['merchants'] = Merchant::where('status','active')->where('is_guest_active', 1)->get();
        $data['zones'] = Zone::where('status',1)->get();

        if($data['user'] && !empty($data['user']->zones)){
            $data['user']->zones = explode(',',$data['user']->zones);
        }
        if(count($data['user']->calls)){
            foreach ($data['user']->calls as $call){
                if (isset($call->sid)) {
                    $request = new Request(['sid' => $call->sid, 'id' => $call->id]);
                    $exotelService = new ExotelServices($request);
                    $exotelService->getCall();
                }
            }
        }

        $callsLogs = CallLogs::where('_id',$user_id)->where('id_type','user_id')->whereNotNull('recording')->where('recording','!=','')->get(['id','_id','recording','purpose','created_at']);
        foreach ($callsLogs as $indexCall=>$callData){
            $data['files'][] = $callData;
        }

        $data['user_types'] = UserTypes::whereNotIn('id', [2,3,4])->get();
        $data['categories'] = MerchantCategory::get(['id','name']);
        $hashids = new Hashids('Creditfair by CS', 20);
        $data['hashid'] = $hashids->encode($user_id);
        $data['_date_m'] = Carbon::now()->toDateString();

        return view('admin.user.edit', $data);
    }

    public function getUserInfoDashboard(Request $request){
        $data['from_date'] = $request->get('from_date') ? $request->get('from_date') : Carbon::now()->startOfWeek()->toDateString();
        $data['to_date'] = $request->get('to_date') ? $request->get('to_date') : Carbon::now()->endOfWeek()->toDateString();


        $total_app_data = $this->getAppSummaryS3(true);

        $period = CarbonPeriod::create($data['from_date'], $data['to_date']);

        $dates = $period->toArray();

        $_dates = [];
        foreach ($dates as $date){
            $_dates[] = $date->toDateString();
        }

        $dateWithData = [];
        $fetched = [];
        if($total_app_data) {
            foreach ($total_app_data as $index => $total_app) {
                if (in_array($index, $_dates)) {
                    $user = null;
                    foreach ($total_app as $user_id) {
                        if (!in_array($user_id, $fetched)) {
                            $fetched[] = $user_id;
                            $user = User::where('id', $user_id)->first(['id', 'name']);
                        }
                    }
                    if ($user) {
                        $dateWithData[] = ['fetched_at' => $index, 'user' => $user];
                    }
                }
            }
        }
        $data['dateWithData'] = $dateWithData;
        return view('admin.user.user_data_dashboard', $data);
    }

    public function getUserInfoS3($user_id, Request $request){
        try {

            if(!Session::has('View_User_Info|-26')){
                Session::flash('error', 'You don\'t have permission to access the page');
                return \redirect()->to('/admin');
            }

            $userData = [];
            $dateAvailable = [];
            $onlyDates = [];
            $_onlyDates = [];
            $onlyDatesFC = [];
            $_datesWithFiles = [];
            $datesWithFiles = [];


            if($request->get('date')) {
                $date = Carbon::createFromFormat('d/m/Y', $request->get('date'))->toDateString();
            }else{
                $date = Carbon::now()->toDateString();
            }

            if ($user_id) {
                $s3 = Storage::disk('s3');
                try {
                    //$files2 = scandir($file_pathName, 1);
                    $files2 = $s3->listContents("info/" . $user_id . "/" . $date);
                }catch (\Exception $e){
                    $firstException = 1;
                }

                if(!$files2){
                    $firstException = 1;
                }

                $file_pathNameArray = "/info/" . $user_id;
                //$file_pathNameArray = storage_path()."/info/" . $user_id;
                //$files3 = scandir($file_pathNameArray, 1);
                $files3 = $s3->listContents($file_pathNameArray);

                foreach ($files3 as $item){
                    if(!in_array($item, ['.','..'])) {
                        $_file_pathNameArray = $file_pathNameArray.'/'.$item['filename'];
                        //$files4 = scandir($_file_pathNameArray, 1);
                        $files4 = $s3->listContents($_file_pathNameArray);
                        $dateAvailable[date('d/m/Y',strtotime($item['filename']))] = count($files4) - 2;
                        $onlyDates[] = strtotime($item['filename']);
                        $datesWithFiles[date('d/m/Y',strtotime($item['filename']))] = array_map(function ($item){if(!in_array($item['basename'], ['.','..'])){return '<option value="'.str_replace('.json','',$item['basename']).'">'.date('g:i:s A',str_replace('.json','',$item['basename'])).'</option>';}},$files4);
                    }
                }

                foreach ($datesWithFiles as $_date => $file){
                    $_datesWithFiles[$_date] = array_filter($file);
                }

                usort($onlyDates, function ($a, $b){
                    return $a - $b;
                });

                foreach ($onlyDates as $item){
                    $_onlyDates[] = date('d/m/Y',$item);
                    $onlyDatesFC[] = date('Y/m/d',$item);
                }

                if (isset($firstException)){
                    return view('admin.user.user_data', ['user' => $userData, 'dateAvailable' => $dateAvailable, 'onlyDates' => $_onlyDates, 'datesWithFiles' => array_filter($_datesWithFiles), 'fileName' => $request->get('name'), 'onlyDatesFC' => $onlyDatesFC]);
                }

                foreach ($files2 as $itemName) {
                    $file_path = "info/" . $user_id . "/" . $date;
                    try{
                        if ($itemName['basename'] && (!$request->has('name') || $request->has('name') && $request->get('name').'.json' == $itemName['basename'])) {
                            $file_path .= "/".$itemName['basename'];
                            //$myfile = fopen($file_path, "r") or die("Unable to open file!");
                            //$file = fread($myfile, filesize($file_path));
                            $file = $s3->get($file_path);
                            $decrypted_file = wall_decrypt($file);
                            $report_data = json_decode($decrypted_file, true);
                            if (isset($report_data['data'])){
                                $userData = json_decode($report_data['data'], true);
                                break;
                            }
                        }
                    }catch (\Exception $e){

                    }
                }
            }

            if($userData){
                return view('admin.user.user_data', ['user' => $userData, 'dateAvailable' => $dateAvailable, 'onlyDates' => $_onlyDates, 'datesWithFiles' => array_filter($_datesWithFiles), 'fileName' => $request->get('name'), 'onlyDatesFC' => $onlyDatesFC]);
            }

        } catch (\Exception $e) {
            \Session::flash('error', 'Exception occurred while fetching user details from AWS S3');
        }
        return view('admin.user.user_data');
    }

    public function getUserInfo($user_id, Request $request){
        try {

            return $this->getUserInfoS3($user_id, $request);
            if(!Session::has('View_User_Info|-26')){
                Session::flash('error', 'You don\'t have permission to access the page');
                return \redirect()->to('/admin');
            }

            $userData = [];
            $dateAvailable = [];
            $onlyDates = [];
            $_onlyDates = [];
            $onlyDatesFC = [];
            $_datesWithFiles = [];
            $datesWithFiles = [];


            if($request->get('date')) {
                $date = Carbon::createFromFormat('d/m/Y', $request->get('date'))->toDateString();
            }else{
                $date = Carbon::now()->toDateString();
            }

            if ($user_id) {

                $file_pathName = "/var/www/html/creditfair_beta/storage/info/" . $user_id . "/" . $date;
                //$file_pathName = storage_path()."/info/" . $user_id . "/" . $date;
                try {
                    $files2 = scandir($file_pathName, 1);
                }catch (\Exception $e){
                    $firstException = 1;
                }

                $file_pathNameArray = storage_path()."/info/" . $user_id;
                $files3 = scandir($file_pathNameArray, 1);

                foreach ($files3 as $item){
                    if(!in_array($item, ['.','..'])) {
                        $_file_pathNameArray = $file_pathNameArray.'/'.$item;
                        $files4 = scandir($_file_pathNameArray, 1);
                        $dateAvailable[date('d/m/Y',strtotime($item))] = count($files4) - 2;
                        $onlyDates[] = strtotime($item);
                        $datesWithFiles[date('d/m/Y',strtotime($item))] = array_map(function ($item){if(!in_array($item, ['.','..'])){return '<option value="'.str_replace('.json','',$item).'">'.date('g:i:s A',str_replace('.json','',$item)).'</option>';}},$files4);
                    }
                }

                foreach ($datesWithFiles as $_date => $file){
                    $_datesWithFiles[$_date] = array_filter($file);
                }

                usort($onlyDates, function ($a, $b){
                    return $a - $b;
                });

                foreach ($onlyDates as $item){
                    $_onlyDates[] = date('d/m/Y',$item);
                    $onlyDatesFC[] = date('Y/m/d',$item);
                }

                if (isset($firstException)){
                    return view('admin.user.user_data', ['user' => $userData, 'dateAvailable' => $dateAvailable, 'onlyDates' => $_onlyDates, 'datesWithFiles' => array_filter($_datesWithFiles), 'fileName' => $request->get('name'), 'onlyDatesFC' => $onlyDatesFC]);
                }

                foreach ($files2 as $itemName) {
                    $file_path = $file_pathName;
                    try{
                        if ($itemName && (!$request->has('name') || $request->has('name') && $request->get('name').'.json' == $itemName)) {
                            $file_path .= "/".$itemName;
                            $myfile = fopen($file_path, "r") or die("Unable to open file!");
                            $file = fread($myfile, filesize($file_path));
                            $decrypted_file = wall_decrypt($file);
                            $report_data = json_decode($decrypted_file, true);
                            if (isset($report_data['data'])){
                                $userData = json_decode($report_data['data'], true);
                                break;
                            }
                        }
                    }catch (\Exception $e){

                    }
                }
            }

            if($userData){
                return view('admin.user.user_data', ['user' => $userData, 'dateAvailable' => $dateAvailable, 'onlyDates' => $_onlyDates, 'datesWithFiles' => array_filter($_datesWithFiles), 'fileName' => $request->get('name'), 'onlyDatesFC' => $onlyDatesFC]);
            }

        } catch (\Exception $e) {
            \Session::flash('error', 'Exception occurred while fetching user details');
        }
        return view('admin.user.user_data');
    }

    public function saveUserPermission(Request $request){
        $permissions = [];
        $user_type_id = ($request->has('new_user_type') && $request->get('new_user_type')) ? 0 : $request->get('user_type');

        if (($request->has('new_user_type') && $request->get('new_user_type')) || $user_type_id && !UserTypes::find($user_type_id)){
            $user_type_id = UserTypes::insertGetId([
               'name' => $request->get('new_user_type'),
               'created_by' => Auth::check() ? Auth::user()->id : 107,
               'created_at' => Carbon::now()->toDateTimeString()
            ]);
        }

        if ($user_type_id) {
            foreach ($request->all() as $_key => $postItem) {
                if (strpos($_key, '|') !== false) {
                    $permissions[] = $_key;
                }
            }

            if ($request->has('status-list')){
                foreach ($request->get('status-list') as $postItem) {
                    if (strpos($postItem, '|') !== false) {
                        $permissions[] = $postItem;
                    }
                }
            }

            if ($request->has('lender-list')){
                foreach ($request->get('lender-list') as $postItem) {
                    if (strpos($postItem, '|') !== false) {
                        $permissions[] = $postItem;
                    }
                }
            }

            if ($request->has('visible-status-list')){
                foreach ($request->get('visible-status-list') as $postItem) {
                    if (strpos($postItem, '|') !== false) {
                        $permissions[] = $postItem;
                    }
                }
            }

            if ($permissions) {
                $userPermissions = UserPermissions::where('user_type_id', $user_type_id)->first(['id']);
                if (isset($userPermissions->id)) {
                    UserPermissions::where('user_type_id', $user_type_id)->update([
                        'permissions' => json_encode($permissions),
                        'created_by' => Auth::user()->id,
                        'updated_at' => Carbon::now()->toDateTimeString()
                    ]);
                } else {
                    UserPermissions::insert([
                        'user_type_id' => $user_type_id,
                        'permissions' => json_encode($permissions),
                        'created_by' => Auth::user()->id,
                        'created_at' => Carbon::now()->toDateTimeString()
                    ]);
                }
            }
            $date = Carbon::now()->toDateTimeString();
            $get_id = AutoWaiver::orderBy('created_at','desc')->first();
            if($request->auto_waive_amt != null){
                AutoWaiver::insert([
                    'waive_off_amt' => $request->auto_waive_amt,
                    'created_by' => Auth::user()->id,
                    'created_at' => $date,
                    'updated_at' => $date,
                ]);
                if(isset($get_id->id)) {
                    AutoWaiver::where('id', $get_id->id)->update(['deleted_at' => date('Y-m-d H:i:s')]);
                }
            }
        }
        return true;
    }

    public function managePermission(Request $request){
         $this->saveUserPermission($request);

        \Session::flash('success', 'Successfully updated');
         return redirect()->to('/admin/users/types');
    }

    public function getPermission($id){
        $UserTypes = UserTypes::with('permissions')->where('id',$id)->first();
        return response()->json(['data' => isset($UserTypes->permissions) && isset($UserTypes->permissions->permissions) ? json_decode($UserTypes->permissions->permissions) : [],'status' => $UserTypes ? 'OK' : 'FAIL'],200);
    }

    public function userTypes(){
        $application = new ConsumerApplicationController();
        $status = $application->status;
        $lenders = Lenders::all();
        $user_types = UserTypes::all();
        $auto_waive_amount = AutoWaiver::whereNull('deleted_at')->first();

        return view('admin.user.user_types', ['user_types' => $user_types,'status' => $status, 'lenders' => $lenders,'auto_waive_amount' => $auto_waive_amount]);
    }

    public function postEdit($user_id, EditAdminUser $request)
    {

        if($request->get('zones')) {
            $zones = implode(',',$request->get('zones'));
        }else{
            $zones = "";
        }
        $user = \App\User::/*withTrashed()->*/find($user_id);

        $user_id_existing = User::where('id',$user_id)->where(function($query) use ($request){
            $query->where('mobile_number',$request->get('mobile_number'))->orWhere('email',$request->get('email'));
        })->first(['id','mobile_number','email']);

        if (isset($user_id_existing->id) && $user_id_existing->id != $user_id){
            if ($user_id_existing->mobile_number == $request->get('mobile_number')) {
                \Session::flash('error', 'Mobile number already exists');
                return redirect()->back()->withInput();
            }
            if ($user_id_existing->email == $request->get('email')) {
                \Session::flash('error', 'Email already exists');
                return redirect()->back()->withInput();
            }
        }
        if(($request->has('zones') && is_array($request->get('zones')) && count($request->get('zones')) == 0) || !$request->has('zones')){
            $is_zone_required = UserPermissions::where('user_type_id',$request->get('user_type'))->where('permissions','LIKE','%Zone_Level_Restriction|-20%')->first(['id']);
            if(isset($is_zone_required->id)){
                \Session::flash('error', 'Zone Level Restriction is active for selected team so please assign zones for this user');
                return redirect()->back()->withInput();
            }
        }

        $data = $request->input();

        if (!empty($request->input('password')) && $request->input('password')) {
            $user->password = bcrypt($request->input('password'));
            $data['password'] = bcrypt($request->input('password'));
        }else{
            unset($data['password']);
        }

        // Merchant 2.0 user type change
        if ($data['user_type'] == UserTypes::$merchant_v2 && empty($data['merchant_id'])) {
            \Session::flash('error', 'Merchant ID required for this user type');
            return redirect()->back();
        }

        $user->fill($data);
        $user->zones = $zones;
        if ($request->has('status') && $request->get('status') == 'active'){
            $user->deleted_at = null;
        }


        if ($request->has('username') && !empty($request->get('username'))) {
            $user_id_existing = User::where('id', '!=', $user_id)->where('username', $request->get('username'))->first(['id']);
            if (isset($user_id_existing->id)) {
                \Session::flash('error', 'Username already exists');
                return redirect()->back();
            }
        }

        if(empty($user->code)){
            $code = (new MerchantController())->getReferralCode();
            $user->code = $code;
        }

        if ($request->has('user_type') && $request->get('user_type') >= 5 && $request->get('user_type') != UserTypes::$merchant_v2){
            $user->merchant_id = null;
            $user->center_id = null;
        }

        if($request->has('referred_by')){
            $referral = User::where('code',$request->get('referred_by'))->first(['id']);
            if (isset($referral->id)) {
                $user->referred_by = $request->get('referred_by');
            }
        }

        if($request->has('is_gps') && $request->get('is_gps') == 'on'){
            $user->is_gps = 1;
        }else{
            $user->is_gps = 0;
        }

        if($request->has('high_risk') && $request->get('high_risk') == 'on'){
            $user->high_risk = 1;
        }else{
            $user->high_risk = 0;
        }

        $user->slack_id = $request->get('slack_id');
        $user->lender_id = $request->get('lender_id');
        $user->slack_url = $request->get('slack_url');

        if($request->has('app_create_access') && $request->get('app_create_access') == 'on'){
            $user->app_create_access = 1;
        }else{
            $user->app_create_access = 0;
        }

        if($request->has('is_manager') && $request->get('is_manager') == 'on'){
            $user->is_manager = 1;
        }else{
            $user->is_manager = 0;
        }
        if($request->has('category_type')){
            $i = 0;
            $arr = $request->get('category_type');
            $categories = implode(',', $arr);
            $user->category = $categories;
        }else{
            $user->category = null;
        }

        if($request->has('unlock_account') && $request->get('unlock_account') == 'on'){
            $user->admin_login_counter = 0;
        }

        $user->save();
        \Session::flash('success', 'User successfully Updated');
        if(request()->has('merchant')){
            return redirect()->to('admin/merchant/users');
        }
        return redirect()->to('admin/users');
    }

    public function getDelete($user_id)
    {
        $user = \App\User::find($user_id);
        if ($user->id == \Auth::user()->id) {
            \Session::flash('error', 'Cannot removed logged in user');
        } elseif (\Auth::user()->user_type == "employee") {
            \Session::flash('error', 'You Do not have permission for this action');
        } else {
            User::where('id', $user_id)->update(['deleted_at'=>date('Y-m-d H:i:s')]);
            \Session::flash('success', 'User successfully removed');
        }
        return redirect()->back();
    }

    public function actionOnPermission($id){
        if(UserTypes::with('permissions')->where('id',$id)->delete()){
            UserPermissions::where('user_type_id',$id)->delete();
            return response()->json(['status' => 'OK'],200);
        }
        return response()->json(['status' => 'FAIL'],200);
    }
}
