<?php

namespace App\Http\Controllers\Core;

use App\Http\Controllers\Controller;
use App\Models\Core\Users;
use App\Traits\NotDeletableTrait;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Input;
use Redirect;

class UsersController extends Controller
{
    use NotDeletableTrait;

    protected $layout = "layouts.main";
    protected $data = array();

    public $module = 'users';
    static $per_page = '10';

    public function __construct()
    {
        parent::__construct();
        $this->model = new Users();
        $this->info = $this->model->makeInfo($this->module);
        $this->data = array(
            'pageTitle' => $this->info['title'],
            'pageNote' => $this->info['note'],
            'pageModule' => 'core/users',
            'return' => self::returnUrl()
        );
    }

    public function index(Request $request)
    {
        // Make Sure users Logged
        if (!Auth::check())
            return redirect('user/login')->with('status', 'error')->with('message', 'You are not login');

        $filter = [
            'params' => " AND tb_groups.level >= '" . Users::level(session('gid')) . "'"
        ];
        $this->grab($request, $filter);
        if ($this->access['is_view'] == 0)
            return redirect('dashboard')->with('message', __('core.note_restric'))->with('status', 'error');
        // Render into template
        return view('core.' . $this->module . '.index', $this->data);
    }

    function create(Request $request)
    {
        $this->hook($request);

        if ($this->access['is_add'] == 0)
            return redirect('dashboard')->with('message', __('core.note_restric'))->with('status', 'error');

        $this->data['row'] = $this->model->getColumnTable($this->info['table']);
        $this->data['id'] = '';
        return view('core.users.form', $this->data);
    }

    function edit(Request $request, $id)
    {
        $this->hook($request, $id);
        if (!isset($this->data['row']))
            return redirect($this->module)->with('message', 'Record Not Found !')->with('status', 'error');

        if ($this->access['is_edit'] == 0)
            return redirect('dashboard')->with('message', __('core.note_restric'))->with('status', 'error');

        $this->data['row'] = (array) $this->data['row'];
        $this->data['id'] = $id;
        return view('core.users.form', $this->data);
    }

    function show(Request $request, $id)
    {
        /* Handle import , export and view */
        $task = $id;
        switch ($task) {
            case 'search':
                return $this->getSearch();
                break;
            case 'comboselect':
                return $this->getComboselect($request);
                break;
            case 'import':
                return $this->getImport($request);
                break;
            case 'export':
                return $this->getExport($request);
                break;
            default:
                $this->hook($request, $id);
                if (!isset($this->data['row']))
                    return redirect($this->module)->with('message', 'Record Not Found !')->with('status', 'error');

                if ($this->access['is_detail'] == 0)
                    return redirect('dashboard')->with('message', __('core.note_restric'))->with('status', 'error');

                return view('core.users.view', $this->data);
                break;
        }
    }

    function store(Request $request)
    {
        $task = $request->input('action_task');
        switch ($task) {
            default:
                return $this->postSave($request);
                break;
            case 'delete':
                $result = $this->destroy($request);
                return redirect('core/' . $this->module . '?' . $this->returnUrl())->with($result);
                break;

            case 'import':
                return $this->PostImport($request);
                break;

            case 'copy':
                $result = $this->copy($request);
                return redirect('core/' . $this->module . '?' . $this->returnUrl())->with($result);
                break;
        }
    }

    function postSave($request, $id = 0)
    {
        $rules = $this->validateForm();
        if ($request->input('id') == '') {
            $rules['password'] = 'required|between:6,25|confirmed';
            $rules['password_confirmation'] = 'required|between:6,25';
            $rules['email'] = 'required|email|unique:tb_users';
            $rules['username'] = 'required|alpha_num|min:2|unique:tb_users';
        } else {
            if ($request->input('password') != '') {
                $rules['password'] = 'required|between:6,25|confirmed';
                $rules['password_confirmation'] = 'required|between:6,25';
            }
        }

        if (!is_null($request->file('avatar')))
            $rules['avatar'] = 'mimes:jpg,jpeg,png,gif,bmp,webp';

        $validator = Validator::make($request->all(), $rules);
        if ($validator->passes()) {
            $data = $this->validatePost($request);
            if ($request->input('id') == '') {
                $data['password'] = Hash::make($request->input('password'));
            } else {
                if ($request->input('password') != '') {
                    $data['password'] = Hash::make($request->get('password'));
                } else {
                    unset($data['password']);
                }
            }

            $id = $this->model->insertRow($data, $request->input('id'));
            if (!is_null($request->file('avatar'))) {
                $updates = array('id' => $request->input('id'));
                $file = $request->file('avatar');
                $destinationPath = './uploads/users/';
                $filename = $file->getClientOriginalName();
                $extension = $file->getClientOriginalExtension(); //if you need extension of the file
                $newfilename = $id . '.' . $extension;
                $uploadSuccess = $request->file('avatar')->move($destinationPath, $newfilename);
                if ($uploadSuccess) {
                    $updates['avatar'] = $newfilename;
                }
                $this->model->insertRow($updates, $request->input('id'));
            }

            if (!is_null($request->input('apply'))) {
                $return = 'core/users/' . $id . '/edit?return=' . self::returnUrl();
            } else {
                $return = 'core/users?return=' . self::returnUrl();
            }

            return redirect($return)->with('message', __('core.note_success'))->with('status', 'success');
        } else {
            return redirect()->back()->with('message', __('core.note_error'))->with('status', 'error')
                ->withErrors($validator)->withInput();
        }
    }

    public function destroy($request)
    {
        // Make Sure users Logged
        if (!Auth::check())
            return redirect('user/login')->with('status', 'error')->with('message', 'You are not login');

        $this->access = $this->model->validAccess($this->info['id'], session('gid'));
        if ($this->access['is_remove'] == 0)
            return redirect('dashboard')
                ->with('message', __('core.note_restric'))->with('status', 'error');
        // delete multipe rows
        if (is_string($request) && is_int(intval($request))) {
            $this->model->destroy(intval($request));
            return ['message' => __('core.note_success_delete'), 'status' => 'success'];
        } elseif ($request->has('ids') && count($request->input('ids')) >= 1) {
            $this->model->destroy($request->input('ids'));

            // Delete child entries if parent is deleted
            // if($this->modelview)
            // $this->modelview->whereIn('id',$request->input('ids'))->delete();

            \SiteHelpers::auditTrail($request, "ID : " . implode(",", $request->input('ids')) . "  , Has Been Removed Successfull");
            // redirect
            return ['message' => __('core.note_success_delete'), 'status' => 'success'];
        } else {
            return ['message' => __('No Item Deleted'), 'status' => 'error'];
        }
    }

    public function getSearch($mode = 'native')
    {
        $this->data['tableForm'] = $this->info['config']['forms'];
        $this->data['tableGrid'] = $this->info['config']['grid'];
        $this->data['searchMode'] = 'native';
        $this->data['pageUrl'] = url('core/users');
        return view('central.module.utility.search', $this->data);
    }
}
