/home/mip/mip/app/Modules/Client/Repositories/Settings/Users/UserRepository.php
<?php

namespace QxCMS\Modules\Client\Repositories\Settings\Users;

use Carbon\Carbon;
use Illuminate\Http\Request;
use QxCMS\Modules\AbstractRepository;
use Illuminate\Support\Arr;
use QxCMS\Modules\Likod\Models\Clients\User;
use QxCMS\Modules\Client\Models\Settings\UserLogs\UserLogs;
use QxCMS\Modules\Client\Models\Settings\LoginLogs\LoginLogs;
use QxCMS\Modules\Client\Repositories\Settings\Users\UserRepositoryInterface;

class UserRepository extends AbstractRepository implements UserRepositoryInterface
{
    protected $model;
    protected $log;
    protected $loginlogs;

    function __construct(User $model, UserLogs $log, LoginLogs $loginlogs)
    {
        $this->model = $model;
        $this->log = $log;
        $this->loginlogs = $loginlogs;
    }

    public function tokenInputLists()
    {
        return $this->model->select('id', 'name')->where('status', '1');
    }

    public function create(array $request)
    {
        $user = auth()->user();
        $model = $this->model->fill($this->makeUser($request));
        $model->save();
        $this->log->saveLog(['action' => 'Create', 'module_id' => $this->getModuleId(), 'user_id' => $user->id, 'data_id' => $model->id]);
        return $model;
    }

    public function makeUser(array $request)
    {
        $request['client_id'] = auth('client')->user()->client->id;
        $request['password'] = bcrypt($request['password_confirmation']);
        return $request;
    }

    public function update($id, array $request)
    {
        $user = auth()->user();
        $model = $this->findById($id);
        $model->fill($this->changePassword($request));
        if(count($model->getDirty()) > 0) {
            $model->save();
            session()->flash('success', 'Successfully updated.');
            $this->log->saveLog(['action' => 'Update', 'module_id' => $this->getModuleId(), 'user_id' => $user->id, 'data_id' => $model->id]);
        }
        return $model;
    }

    public function changePassword(array $request)
    {
        $confirm_password = $request['password_confirmation'];
        if(!empty($confirm_password)) {
            $request['password'] = bcrypt($confirm_password);
            return $request;
        }
        return  Arr::except($request, ['password_confirmation','password']);
    }

    public function delete($id)
    {
        $user = auth()->user();
        $model = $this->findById($id);
        if($model->type_id == 1) {
            return $this->getAjaxResponse('error', 'Primary user connot be deleted.');
        }
        $model->delete();
        $this->log->saveLog(['action' => 'Delete', 'module_id' => $this->getModuleId(), 'user_id' => $user->id, 'data_id' => $model->id]);
        return $this->getAjaxResponse('success', 'Successfully deleted.');
    }


    public function select2($params = array())
    {
        if(!isset($params['name'])) $params['name'] = '';
        if(!isset($params['user_type'])) $params['user_type'] = '';
        $model = $this->model
                        ->select(['name as text', 'id'])
                        ->searchUserType($params['user_type'])
                        ->searchByName($params['name'])
                        ->get();

        if(isset($params['placeholder'])) {
            $placeholder = array('text' => ' - All -', 'id' => '-1');
            if(isset($params['placeholder']['text'])) $placeholder = array('text' => $params['placeholder']['text'], 'id' => '-1');
             
            return  response(array_prepend($model->toArray(), $placeholder))
                            ->header('Content-Type', 'application/json');
        }
        return  response($model->toArray())
                        ->header('Content-Type', 'application/json');
    }

    public function datatablesIndex($params = array())
    {
        $roleIds = array();
        if(auth()->user()->role_id != $params['developer_id'])
        {
            $roleIds = $params['hiddenRoleIds'];
        }

        return $this->model
        ->select(['id', 'role_id', 'name', 'email', 'status'])
        ->with('role')
        ->where('client_id', auth()->user()->client->id)
        ->filterUsersByRole($roleIds)
        ->isNotSubUser();
    }

    public function userLists()
    {
        return $this->model->orderBy('name','asc')->clientUser()->pluck('name', 'id')->toArray();
    }

    public function searchUserUsername($id)
    {
        return $this->model->find($id);
    }

    public function getUserLogType(Request $request)
    {
        if($request->report_type == 1){
             return 'Add, Edit, Delete of Data';
         }else{
            return 'User Access Logs';
         }
    }

    public function getUserLogDate(Request $request)
    {
        $start = Carbon::createFromFormat('Y-m-d', $request->start_date)->format('M j, Y');
        $end = Carbon::createFromFormat('Y-m-d', $request->end_date)->format('M j, Y');
        return $start.' - '.$end;
    }

    public function getUserLog(Request $request)
    {
        if($request->report_type == 1){
             return $this->log->with('user', 'module')->select('*');
         }else if($request->report_type == 2){
            return $this->loginlogs->select('*');
         }
    }

    public function getUserLogCount(Request $request)
    {
        if($request->report_type == 1){
            if($request->user_id == ''){
                return $this->log->with('user')->whereRaw("date_format(created_at, '%Y-%m-%d') >= '{$request->start_date}'")
                ->whereRaw("date_format(created_at, '%Y-%m-%d') <= '{$request->end_date}'")->count();
            }else{
                return $this->log->with('user')->where('user_id', $request->user_id)->whereRaw("date_format(created_at, '%Y-%m-%d') >= '{$request->start_date}'")
                ->whereRaw("date_format(created_at, '%Y-%m-%d') <= '{$request->end_date}'")->count();
            }
        }else if($request->report_type == 2){
            if($request->user_id == ''){
                return $this->loginlogs->whereRaw("date_format(created_at, '%Y-%m-%d') >= '{$request->start_date}'")
                ->whereRaw("date_format(created_at, '%Y-%m-%d') <= '{$request->end_date}'")->count();
            }else{
                $user = $this->model->find($request->user_id);
                return $this->loginlogs->where('username', $user->email)->whereRaw("date_format(created_at, '%Y-%m-%d') >= '{$request->start_date}'")
                ->whereRaw("date_format(created_at, '%Y-%m-%d') <= '{$request->end_date}'")->count();
            }
        }
    }
}