_viewname.'.'.$viewname)) { return view($this->_viewname.'.'.$viewname); } else { return view('common.'.$viewname); } } protected function getlambda($type, $service, $module, $url, $data = []) { return LambdaRequest::signedrequest($type, $service, $module.'/'.$url, $data); if($url == 'dropdown' && $this->_request->session()->has($service.'-'.$module.'-'.$url) ) { return $this->_request->session()->get($service.'-'.$module.'-'.$url); } elseif($url == 'dropdown'){ $res = LambdaRequest::signedrequest($type, $service, $module.'/'.$url, $data); $this->_request->session()->put($service.'-'.$module.'-'.$url, $res); return $res; } else { return LambdaRequest::signedrequest($type, $service, $module.'/'.$url, $data); } } public function action($action, Request $request) { $this->_request = $request; switch ($action) { case 'edit': return $this->form('edit', $request->input('id')); break; case 'addnew': return $this->form('new'); break; case 'delete': return $this->delete($request->input('id')); break; default: return $this->{$action}($request); break; } } public function postaction($action, Request $request) { $this->_request = $request; switch ($action) { case 'edit': return $this->save('edit', $request ); break; case 'addnew': return $this->save('new', $request ); break; default: return $this->{'post'.$action}($request); break; } } public function list(Request $request) { $response = LambdaRequest::signedrequest('get', $this->_service, $this->_module.'/get_all'); //echo '
'; print_r($response); exit;
        if($response->statusCode == 401) {
            return redirect('/unauthorised');
        }
    	$fields = $this->get_list_fields();
        //echo '
'; print_r($fields); exit;
        return $this->view($this->_listtype)->with([
        	'title' => $this->_title,
        	'fields' => $fields,
        	'base_url' => $this->_base_url,
        	'items' => $response->data->items,
            'buttons' => $this->get_list_buttons()
        ]);
    }

    public function ajaxlist(Request $request) {
        $params = $request->input();
        $search = [];
        foreach($params['columns'] as $col) {
            if($col['search']['value'] != '') {
                $search[$col['data']] = $col['search']['value'];
            }
        }
        $fields = $this->get_list_fields();
        $response = LambdaRequest::signedrequest('get', $this->_service, $this->_module.'/get_all', ['start' => $params['start'], 'length' => $params['length'], 'search' => json_encode($search), 'keyword' => $params['search']['value']  ]);
        Log::debug(print_r($response, true));

        $users = [];
        foreach($response->data->items as $item) {
            $user = [];
            if(isset($item->id)) {
                $user['id'] = $item->id;
            }
            foreach($fields as $field => $props){
                if($field != 'actions') {
                    switch($props['type']){
                        case('image'):
                            $user[$field] = ' ';
                            break;
                        case('text'):
                        case('select'):
                            $user[$field] = isset($item->{$field}) ? $item->{$field} : '';
                            break;
                        case('date'):
                            $user[$field] = date("d M Y", strtotime($item->{$field}));
                            break;
                    }
                } else {
                    $user['actions'] = [];
                    foreach($props['buttons'] as $key => $button){
                        switch($button) {
                            case 'edit':
                                $user['actions'][] = ['link' => '/edit?id='.$item->id, 'icon' => 'square-edit-outline text-warning'];
                                break;
                            case 'delete':
                                $user['actions'][] = ['link' => '/delete?id='.$item->id, 'icon' => 'delete text-danger'];
                                break;
                            default:
                                $querystring = $button['querystring'];
                                foreach((array)$item as $k => $v) {
                                    if(strpos($querystring,'{'.strtoupper($k).'}') !== false)
                                        $querystring = str_replace('{'.strtoupper($k).'}', $v, $querystring);
                                }
                                $user['actions'][] = ['link' => '/'.$key.'?'.$querystring, 'icon' => $button['icon']];
                                break;
                        }
                    }
                }
            }
            $users[] = $user;
        }

        return response()->json(['data' => $users, 'iTotalRecords' => $response->data->count, 'iTotalDisplayRecords' => $response->data->count]);
    }

    public function unauthorised() {
        return view('common.unauthorised');
    }

    public function import(Request $request) {
        return $this->view('import')->with([
            'title' => $this->_title,
            'base_url' => $this->_base_url,
        ]);
    }

    public function postimport(Request $request) {
        if( $request->file('importfile') ) {
            
            $path = $request->file('importfile')->store('user_import');
            $csv = Reader::createFromPath(storage_path('app') .'/' . $path, 'r');
            $csv->setHeaderOffset(0);

            $header = $csv->getHeader(); //returns the CSV header record
            $records = $csv->getRecords(); //returns all the CSV records as an Iterator object
            $fields = $this->get_import_fields($records);
            if($this->validateImport($header, $records)) {
                $path = $request->file('importfile')->store('user_import', 's3');
                $user = Auth::user();
                $id = DB::table('import_jobs')->insertGetId(['user_id' => $user->id, 'domain' => $user->domain, 'service' => $this->_service, 'module' => $this->_module, 'filepath' => $path, 'status' => 1 ]);
                Importdata::dispatch($id);
                return redirect($this->_base_url.'/importprocess?id='.$id)->withMessage('Successfully Uploaded !!!');
            } else {
                return \Redirect::back()->withMessage('CSV File incorrect. Either not all required fields have values or data type is incorrect. Please check and try again!');
            }
        } else {
            return \Redirect::back()->withMessage('Some Error occured!');
        }
    }

    public function importprocess(Request $request) {
        $id = $request->input('id', 0);
        $import = DB::table('import_jobs')->where('id', $id)->first();
        return $this->view('importprocess')->with(['baseurl' => $this->_base_url, 'id' => $id]);
    }

    public function importstatus(Request $request) {
        $id = $request->input('id', 0);
        $import = DB::table('import_jobs')->where('id', $id)->first();
        return response()->json($import);
    }

    

    public function importmap(Request $request) {
        $path = $request->session()->get('user_import_path');
        $csv = Reader::createFromPath(storage_path('app') .'/' . $path, 'r');
        $csv->setHeaderOffset(0);

        $header = $csv->getHeader(); //returns the CSV header record
        $records = $csv->getRecords(); //returns all the CSV records as an Iterator object
        $fields = $this->get_import_fields($records);
        // echo '
'; 
        // foreach($records as $record){
        //     print_r($record);
        // }
        // exit;
        return $this->view('importmap')->with([
            'title' => $this->_title,
            'base_url' => $this->_base_url,
            'records' => $records,
            'fields' => $fields,
        ]);
    }

    public function postimportmap(Request $request) {
        $post = $request->except('_token');
        $post = $this->flip_row_col_array($post);
        $created = 0;
        $updated = 0;
        $count = 0;
        $total = sizeof($post);

        while($count < $total) {
            $tempdata = array_slice($post, $count, 10);
            Log::debug(print_r($tempdata, true));
            $response = LambdaRequest::signedrequest('post', $this->_service, $this->_module.'/import', $tempdata);
            Log::debug(print_r($response, true));
            $count = $count + 10;
            $created = $created + $response->data->created_count;
            $updated = $updated + (isset($response->data->updated_count) ? $response->data->updated_count : 0);
            Log::debug(print_r(['$count' => $count, '$created' => $created, '$updated' => $updated], true));
        }

        //echo '
'; print_r($response); exit;
        if($response->statusCode == 200 && $response->status == "success") {
            return redirect($this->_base_url.'s')->withMessage('Successfully Imported ' .$created. ' records and Updated ' .$updated. ' records out of ' .$total. ' records!!!');
        } else {
            return \Redirect::back()->withMessage('Some Error occured!');
        }
    }

    private function flip_row_col_array($array) {
        $out = array();
        foreach ($array as  $rowkey => $row) {
            foreach($row as $colkey => $col){
                $out[$colkey][$rowkey]=$col;
            }
        }
        return $out;
    }

    protected function get_list_buttons() {
        return [ ['title' => 'Add New', 'link' => $this->_base_url.'/addnew' ] ];
    }

    public function form($type, $id = null) {
    	$values = [];
    	if($type == 'edit') {
    		$response = LambdaRequest::signedrequest('get', $this->_service, $this->_module.'/get_one', ['id' => $id]);
    		$values = $response->data->item;
            //echo '
'; print_r($values); exit;
    	}
        //echo '
'; print_r($values); exit;
        $data = $this->_beforeform($type, $values);
    	$fields = $this->get_form_fields($type, $values);
        //echo '
'; print_r($fields); exit;
        return $this->view('form')->with([
        	'title' => $this->_title,
        	'mode' => $type,
        	'fields' => $fields,
        	'base_url' => $this->_base_url,
        	'item' => $values,
        ]);
    }

    public function save($type, $request ) {
    	if($type == 'edit') {
    		$url = '/update';
    	} else {
    		$url = '/create';
    	}
        $data = $this->_beforesave($type, $request);
        //echo '
'; print_r($data); exit;
    	$response = LambdaRequest::signedrequest('post', $this->_service, $this->_module.$url, $data);
        //echo '
'; print_r($response); exit;
    	if($response->statusCode == 200 && $response->status == "success") {
            //echo '
'; print_r($response); exit;
    		//return redirect($this->_base_url.'/edit?id='.$response->data->item->id)->withMessage('Successfully Saved !!!');
            return redirect($this->_base_url.'s')->withMessage('Successfully Saved !!!');
    	} else {
            return redirect($this->_base_url.'s')->withError('Some Error occured! '. $response->message);
    		//return \Redirect::back()->withMessage('Some Error occured!');
    	}
    }

    public function delete($id) {
        //echo '
'; print_r($id); exit;
        $response = LambdaRequest::signedrequest('get', $this->_service, $this->_module.'/delete', ['id' => $id]);
        //echo '
'; print_r($response); exit;
        if($response->statusCode == 200 && $response->status == "success") {
            //echo '
'; print_r($response); exit;
            return redirect($this->_base_url.'s')->withMessage('Successfully Marked Deleted !!!');
        } else {
            return redirect($this->_base_url.'s')->withError('Some Error occured! '. $response->message);
            //return \Redirect::back()->withMessage('Some Error occured!');
        }
    }

    protected function _beforesave($type, $request) {
        return $request->except('_token');
    }
    protected function _beforeform($type, $values) {
        return $values;
    }

    protected function _uploadMedia($request, $name = 'image', $folder = 'image') {
        $path = '';
        try {
            if(is_array($request->file($name))) {
                $paths = [];
                foreach($request->file($name) as $file) {
                    $path = $file->store($folder, 's3');
                    $path = env('AWS_URL').'/'.$path;
                    $paths[] = $path;
                }
                $path = implode(',', $paths);
            } else if( $request->file($name) ) {
                $path = $request->file($name)->store($folder, 's3');
                $path = env('AWS_URL').'/'.$path;
            }
        } catch (AwsException $e) {
            Log::debug($e->getMessage());
        } 
        return $path;
    }

    protected function _uploadMediaLocal($request, $name = 'image', $folder = 'image') {
        $path = '';
        try {
            if( $request->file($name) ) {
                $path = $request->file($name)->store($folder);
                $path = '/'.str_replace('public', 'storage', $path);
            }
        } catch (AwsException $e) {
            Log::debug($e->getMessage());
        } 
        return $path;
    }
}