/home/mip/mip/app/Modules/Client/Controllers/Reports/AuditTrailController.php
<?php

namespace QxCMS\Modules\Client\Controllers\Reports;

use Auth;
use Excel;
use Session;
use Datatables;

use Illuminate\Http\Request;
use QxCMS\Http\Controllers\Controller;

use QxCMS\Modules\Client\Repositories\Settings\Users\UserRepositoryInterface as User;
use QxCMS\Modules\Client\Repositories\Settings\Roles\PermissionRepositoryInterface as Permission;

class AuditTrailController extends Controller
{
    protected $auth;
    protected $user;
	protected $permission;
    protected $module_id = 13;
	protected $prefix_name = '';

	public function __construct(Permission $permission, User $user)
	{
        $this->user = $user;
		$this->permission = $permission;
		$this->auth = Auth::guard('client');
		$this->prefix_name = config('modules.client');
        $this->getDetails($this->module_id);
	}

	public function permissions()
    {
        return $this->permission->getPermission($this->module_id);
    }

    public function index() 
    {
    	$this->authorize('activated', $this->permissions());
    	$data['permissions'] = $this->permissions();
        return view('Client::reports.audittrail.index', $data, $this->getFormOptions());
    }

    public function show(Request $request)
    {
        $this->authorize('activated', $this->permissions());
        $data['permissions'] = $this->permissions();
        $data['type'] = $this->user->getUserLogType($request);
        $data['date'] = $this->user->getUserLogDate($request);
        $count = $this->user->getUserLogCount($request);
        if($request->report_type == 1){
            $data['visibleUser'] = true;
            $data['visibleLogin'] = false;
        }else{
            $data['visibleUser'] = false;
            $data['visibleLogin'] = true;
        }
        if($count == 0){
            return view('Client::no-data');
        }else{
            return view('Client::reports.audittrail.view', $data);
        }
    }

    public function excel(Request $request) {
        $reportType = $request->has('report_type');
        $type = $this->user->getUserLogType($request);
        $date = $this->user->getUserLogDate($request);
        $userLogs = $this->user->getUserLog($request)->where(function($query) use ($request, $reportType){
            if($reportType && $request->report_type == 1){
                if ($request->has('user_id')) {
                    $query->where('user_id', $request->user_id);
                }
            }
            if($reportType && $request->report_type == 2){
                if ($request->has('user_id')) {
                    $user = $this->user->searchUserUsername($request->user_id);
                    $query->where('username', $user->email);
                }
            }
            if ($request->has('start_date') && $request->has('end_date')) {
                $query->whereRaw("date_format(created_at, '%Y-%m-%d') >= '{$request->start_date}'")
                ->whereRaw("date_format(created_at, '%Y-%m-%d') <= '{$request->end_date}'");
            }
        })->orderBy('created_at', 'desc')->get();

        Excel::create('Audit trail report', function($excel) use ($userLogs, $request, $type, $date){
            $excel->setTitle('Audit Trail Report');
            $excel->setCreator('Quantum X, Inc.')->setCompany('Quantum X, Inc.');
            $excel->setDescription('audit trail report');

            $excel->sheet('sheet1', function($sheet) use ($userLogs, $request, $type, $date) {
                if($request->report_type == 1){
                    $sheet->loadView('Client::reports.audittrail.includes.user-logs-table')
                        ->with('userLogs', $userLogs)
                        ->with('type', $type)
                        ->with('date', $date);
                }else{
                    $sheet->loadView('Client::reports.audittrail.includes.login-logs-table')
                        ->with('userLogs', $userLogs)
                        ->with('type', $type)
                        ->with('date', $date);
                }
            });
        })->export('xlsx');
    }
  
    public function getReportsDataByUser(Request $request)
    {
        $userLogs = $this->user->getUserLog($request);
        $reportType = $request->has('report_type');
        return Datatables::of($userLogs)
            ->filter(function ($query) use ($request, $reportType) {
                if($reportType && $request->report_type == 1){
                    if ($request->has('user_id')) {
                        $query->where('user_id', $request->user_id);
                    }
                }
                if($reportType && $request->report_type == 2){
                    if ($request->has('user_id')) {
                        $user = $this->user->searchUserUsername($request->user_id);
                        $query->where('username', $user->email);
                    }
                }
                if ($request->has('start_date') && $request->has('end_date')) {
                    $query->whereRaw("date_format(created_at, '%Y-%m-%d') >= '{$request->start_date}'")
                    ->whereRaw("date_format(created_at, '%Y-%m-%d') <= '{$request->end_date}'");
                }
            })
            ->editColumn('module', function($row) {
                if(!isset($row->module)) return '';
                else return $row->module->title;
            })
            ->editColumn('action', function($row) {
                if(!isset($row->action)) return '';
                else return $row->action;
            })
            ->editColumn('ipaddress', function($row) {
                if(!isset($row->ipaddress)) return '';
                else return $row->ipaddress;
            })
            ->editColumn('username', function($row) {
                if(!isset($row->username)) return '';
                else return $row->username;
            })
            ->editColumn('user', function($row) {
                if($row->user == null) {
                    if(isset($row->name)) return $row->name;
                    else return '';
                }
                else return $row->user->name;
            })
            ->make(true);
    }

    protected function getFormOptions()
    {
        $data['users'] = $this->user->userLists();
        $data['type'] = Array('1' => 'Add, Edit, Delete of Data', '2' => 'User Access Logs');
        return $data;
    }
}