<?php

namespace App\Http\Controllers\Api\v1;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\DB;
use App\User;
use App\GroupMaster;
use App\UserGroup;
use App\Feedback;

/**
 * SubAdminController Class Doc Comment
 *
 * @category Class
 * @package  Api
 * @author   Ketan Patel - ketan.patel@brainvire.com
 *
 */
class SubAdminController extends Controller
{

    public function __construct()
    {
        //$this->middleware('oauth', ['except' => ['index']]);
        //$this->middleware('auth:api', ['except' => ['index']]);
    }

    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $subadmins = DB::table('users as u')
                ->select('u.id', 'u.name', 'u.email', 'u.status', 'gm.name as role')
                ->where('role', 'ROLE_ADMIN')
                ->leftJoin('user_group as ug', 'ug.user_id', '=', 'u.id')
                ->leftJoin('group_master as gm', 'ug.group_id', '=', 'gm.id')
                ->orderBy('u.id', 'desc')
                ->get();

        return response()->json($subadmins);
    }

    /**
     * Update the specified resource in storage.
     *
     * @param \Illuminate\Http\Request $request
     * @return \Illuminate\Http\Response
     */
    public function changeStatus(Request $request)
    {
        $this->validate($request, [
            'id' => 'required',
            'status' => 'required',
        ]);

        $rid = $request->id;
        $device = User::find($rid);
        if (!$device) {
            return response()->json(['status' => 'fail', 'message' => RECORD_NOT_FOUND]);
        }
        $device->status = $request->status;
        $date = new \DateTime();
        $ddf = $date->format('Y-m-d H:i:s');
        $device->updated_at = $ddf;

        if ($device->save()) {
            return response()->json(['status' => 'success', 'message' => STATUS_CHANGED]);
        } else {
            return response()->json(['status' => 'fail', 'message' => SOMETHING_WENT_WRONG]);
        }
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        $this->validate($request, [
            'name' => 'required',
            'email' => 'required|email|unique:users,email|unique:feedback,email',
            'role' => 'required',
            'status' => 'required',
            'password' => 'required',
        ]);

        $customer = Feedback::where('email',$request->email)->count();

        if($customer > 0)
        {
            return response()->json(['status' => 'fail', 'message' => EMAIL_EXIST]);
        }

        $groupMaster = GroupMaster::find($request->role);
        $subadmin = new User();
        $subadmin->name = $request->name;
        $subadmin->email = $request->email;
        $subadmin->role = $groupMaster->roles;
        $subadmin->password = Hash::make($request->password);

        // status values:   0=Inactive, 1=Active, 2=Pending
        $subadmin->status = $request->status;
        $date = new \DateTime();
        $ddf = $date->format('Y-m-d H:i:s');
        $subadmin->created_at = $ddf;
        if ($subadmin->save()) {
            $userGroup = new UserGroup();
            $userGroup->user_id = $subadmin->id;
            $userGroup->group_id = $request->role;
            $userGroup->save();
            
            /*---- Subadmin activity log ---*/
            $subAdminName           = $request->subAdminName;
            $subAdminId             = $request->subAdminId;
            $logdata                = [];
            $logdata['adminName']   = $subAdminName;
            $logdata['adminUserId'] = $subAdminId;
            $logdata['type']        = 'sub_admin';
            $logdata['description'] = "Sub Admin $subAdminName has created new sub admin $request->name";
            $this->logActivity($logdata);
            
            
            return response()->json(['status' => 'success', 'message' => SUB_CREATED]);
        } else {
            return response()->json(['status' => 'fail', 'message' => SOMETHING_WENT_WRONG]);
        }
    }

    /**
     * Update the specified resource in storage.
     *
     * @param \Illuminate\Http\Request $request
     * @param int                      $rid
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $rid)
    {
        $this->validate($request, [
            'name' => 'required',
            'email' => 'required|email|unique:feedback,email|unique:users,email,' . $rid,
            'role' => 'required',
            'status' => 'required',
        ]);

        $customer = Feedback::where('email',$request->email)->count();

        if($customer > 0)
        {
            return response()->json(['status' => 'fail', 'message' => EMAIL_EXIST]);
        }

        $subadmin = User::find($rid);
        if (!$subadmin) {
            return response()->json(['status' => 'fail', 'message' => RECORD_NOT_FOUND]);
        }
        $groupMaster = GroupMaster::find($request->role);
        $subadmin->name = $request->name;
        $subadmin->email = $request->email;
        $subadmin->role = $groupMaster->roles;
        $subadmin->status = $request->status;

        if ($request->password != '') {
            $subadmin->password = Hash::make($request->password);
        }
        $date = new \DateTime();
        $ddf = $date->format('Y-m-d H:i:s');
        $subadmin->updated_at = $ddf;

        if ($subadmin->save()) {
            $userGroup = UserGroup::where('user_id', $subadmin->id)->get()->first();
            if (!$userGroup) {
                $userGroup = new UserGroup();
            }
            $userGroup->user_id = $subadmin->id;
            $userGroup->group_id = $request->role;
            $userGroup->save();
            
            /*---- Subadmin activity log ---*/
            $subAdminName           = $request->subAdminName;
            $subAdminId             = $request->subAdminId;
            $logdata                = [];
            $logdata['adminName']   = $subAdminName;
            $logdata['adminUserId'] = $subAdminId;
            $logdata['type']        = 'sub_admin';
            $logdata['description'] = "Sub Admin $subAdminName has updated sub admin $request->name";
            $this->logActivity($logdata);
            
            return response()->json(['status' => 'success', 'message' => SUB_UPDATED]);
        } else {
            return response()->json(['status' => 'fail', 'message' => SOMETHING_WENT_WRONG]);
        }
    }

    public function show($rid)
    {
        $subadmin = User::where('id', $rid)->select('id', 'name', 'email', 'status', 'role')->get()->first();
        $userGroup = UserGroup::where('user_id', $rid)->get()->first();
        if (!empty($subadmin)) {
            $subadmin['role'] = $userGroup ? $userGroup->group_id : '';
            return response()->json($subadmin);
        } else {
            return response()->json(['status' => 'fail', 'message' => RECORD_NOT_FOUND]);
        }
    }

    public function destroy($rid)
    {
        $user = User::find($rid);
        if (!$user) {
            return response()->json(['status' => 'fail', 'message' => RECORD_NOT_FOUND]);
        }
        $user->delete();
        return response()->json(['status' => 'success', 'message' => SUB_DELETED]);
    }
}
