<?php

namespace App\Http\Controllers;

use App\Http\Models\UserClient;
use App\Http\Models\Users;
use App\Http\Models\UserSite;
use DB;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Log;

class UsersController extends Controller
{
    /**
     * Login
     *
     * @api POST /users/login
     *
     * @author tukangbasic
     */
    public function login(Request $request)
    {
        $input = $request->all();
        $validate = Users::isValid($input, [
            'username' => 'required',
            'password' => 'required|min:8',
        ]);

        /**
         * Validate Model
         */
        if (!$validate[0]) {
            $json['STATUS_CODE'] = '400';
            $json['MESSAGE'] = 'Failed to Login';
            $json['ERROR'] = $validate[1];
            return $json;
        }

        $data = Users::where('username', $input['username'])
            ->first(['user_id', 'username', 'password', 'email', 'user_group_id','by_user_id','is_mekanik']);

        if ($data) {
            $checkPassword = Hash::check($input['password'], $data->password);
            if ($checkPassword) {

                if ($data->user_group_id == 3) {
                    $site = UserSite::where('user_id', $data->user_id)->first(['store_id']);
                    if (!$site) {
                        $json['STATUS_CODE'] = '400';
                        $json['MESSAGE'] = 'Failed to Login';
                        $json['ERROR'] = 'Site not found';
                    }
                    $data->store_id = $site->store_id;
                    $data->site_id = $data->user_id;
                } else {
                    $data->store_id = 0;
                    $data->site_id = 0;
                }
                
                if ($data->user_group_id == 4) {
                    $site = UserSite::where('user_id', $data->by_user_id)->first(['store_id']);
                    if (!$site) {
                        $json['STATUS_CODE'] = '400';
                        $json['MESSAGE'] = 'Failed to Login';
                        $json['ERROR'] = 'Site not found';
                    }
                    $data->store_id = $site->store_id;
                    $data->site_id = $data->by_user_id;
                } else {
                    $data->store_id = 0;
                    $data->site_id = 0;
                }

                $json['STATUS_CODE'] = '200';
                $json['MESSAGE'] = 'Success';
                $json['DATA'] = $data;
            } else {
                $json['STATUS_CODE'] = '400';
                $json['MESSAGE'] = 'Failed to Login';
                $json['ERROR'] = 'Password didn`t match';
            }
        } else {
            $json['STATUS_CODE'] = '400';
            $json['MESSAGE'] = 'Failed to Login';
            $json['ERROR'] = 'Username not found';
        }
        return response($json);
    }

    /**
     * Get all User
     *
     * @api GET /users
     *
     * @param Integer limit
     * @param Integer page
     * @param String search
     *
     * @author tukangbasic
     */
    public function index(Request $request)
    {
        $limit = $request->has('limit') ? $request['limit'] : 10;
        $data = Users::with('role');

        if ($request->has('type')) {
            if ($request->type == 'client') {
                $data = $data->where('user_group_id', 2);
                $data = $data->join('user_client', 'user_client.user_id', 'users.user_id');
            }
            if ($request->type == 'site') {
                $data = $data->where('user_group_id', 3);
                $data = $data->join('user_site', 'user_site.user_id', 'users.user_id');
                if ($request->has('is_promo')) {
                } elseif ($request->has('parent_id') && $request->parent_id != 0) {
                    $data = $data->where('client_id', $request->parent_id)->where('user_site.store_id','!=','0');
                } else {
                    $userId = 1;
                    $data = $data->whereRaw("user_site.client_id = (SELECT client_id FROM user_site WHERE user_id = $userId LIMIT 1)");
                }
            }
            
            if ($request->type == 'mekanik') {
                
                $data = $data->where('user_group_id', 4);
                $data = $data->where("by_user_id",$request->input('user_id'));
            }
            if ($request->type == 'allsite') {
                $data = $data->where('user_group_id', 3);
                $data = $data->join('user_site', 'user_site.user_id', 'users.user_id');
            }
        }

        if ($request->has('search')) {
            $data = $data->where(function ($query) use ($request) {
                $query->orWhere('username', 'LIKE', '%' . $request['search'] . '%')
                    ->orWhere('email', 'LIKE', '%' . $request['search'] . '%');

                if ($request->has('type') && $request->type == 'client') {
                    $query->orWhere('name', 'LIKE', '%' . $request['search'] . '%');
                    $query->orWhere('phone', 'LIKE', '%' . $request['search'] . '%');
                }

                if ($request->has('type') && $request->type == 'site') {
                    $query->orWhere('site_name', 'LIKE', '%' . $request['search'] . '%');
                    $query->orWhere('site_city', 'LIKE', '%' . $request['search'] . '%');
                    $query->orWhere('site_manager', 'LIKE', '%' . $request['search'] . '%');
                }

                $query->orWhereRaw("CONCAT('C',RIGHT(CONCAT('000000',users.user_id),6)) LIKE ? AND users.user_id <> 1 AND users.user_group_id = 2",['%'.$request['search'].'%']);
                $query->orWhereRaw("CONCAT('S',RIGHT(CONCAT('000000',users.user_id),6)) LIKE ? AND users.user_id <> 1 AND users.user_group_id = 3",['%'.$request['search'].'%']);
                $query->orWhereRaw("CONCAT('M',RIGHT(CONCAT('000000',users.user_id),6)) LIKE ? AND users.user_id <> 1 AND users.user_group_id = 4",['%'.$request['search'].'%']);
            });
        }

        // if ($request->has('sortBy') && $request->sortBy != '') {
        //     $data = $data->orderBy($request->sortBy, $request->sortDesc);
        // }

        $data = $this->paging($data->paginate($limit));

        $json['STATUS_CODE'] = '200';
        $json['MESSAGE'] = 'Success';
        $json['DATA'] = $data;
        return $json;
    }

    /**
     * Add User
     *
     * @api POST /users
     *
     * @param String username
     * @param String email
     * @param String password
     * @param Integer user_group_id
     * @param String photo
     * @param String token
     * @param Integer created_by
     *
     *
     * @author tukangbasic
     */
    public function add(Request $request)
    {
        $input = $request->except(['name', 'phone', 'remark', 'site_name', 'city_id','province_id', 'site_manager', 'site_address', 'store_id']);
        $validate = Users::isValid($input, [
            // Rifqi Kamaluddin
            // allow hyphen "-"
            // 'username' => 'required|unique:users|alpha_num|min:4|max:20',
            'username' => [
                'required',
                'unique:users',
                'min:4',
                'max:20',
                'regex:/^[a-zA-Z0-9-]+$/',
            ],
            'password' => 'required|min:8',
            'email' => 'required|unique:users|email',
            'user_group_id' => 'required',
            'photo' => 'required',
            'created_by' => 'required',
        ]);
        
        if ($request->user_group_id == 4) {
            
            $input['is_mekanik'] = 1;
            $input['by_user_id'] = $request->created_by;
        }
        
        /**
         * Validate Model
         */
        if (!$validate[0]) {
            $json['STATUS_CODE'] = '400';
            $json['MESSAGE'] = 'Failed to create User';
            $json['ERROR'] = $validate[1];
            return $json;
        }

        $input['password'] = Hash::make($request->input('password'));

        try {
            DB::beginTransaction();

            $saved = Users::create($input);
            if ($request->user_group_id == 2) {

                // $input = $request->only(['name', 'phone', 'remark']);
                // $validate = UserClient::isValid($input, [
                //     'phone' => 'required|unique:user_client',
                //     'name' => 'required',
                //     'remark' => 'required',
                // ]);

                // /**
                //  * Validate Model
                //  */
                // if (!$validate[0]) {
                //     DB::rollBack();

                //     $json['STATUS_CODE'] = '400';
                //     $json['MESSAGE'] = 'Failed to create User';
                //     $json['ERROR'] = $validate[1];
                //     return $json;
                // }

                $input['user_id'] = $saved->user_id;
                $saved = UserClient::create($input);
            }

            if ($request->user_group_id == 3) {
                $input = $request->only(['store_id', 'site_name', 'site_display_name', 'city_id','province_id', 'site_manager', 'remark', 'site_address','site_phone','site_latitude','site_longitude','operational_days','is_tax']);
                $validate = UserSite::isValid($input, [
                    'site_name' => 'required',
                    'city_id' => 'required',
                    'province_id' => 'required',
                    'site_manager' => 'required',
                    'site_address' => 'present',
                    'remark' => 'required',
                    'store_id' => 'required|numeric|unique:user_site,store_id'
                ]);

                /**
                 * Validate Model
                 */
                if (!$validate[0]) {
                    DB::rollBack();

                    $json['STATUS_CODE'] = '400';
                    $json['MESSAGE'] = 'Failed to create User';
                    $json['ERROR'] = $validate[1];
                    return $json;
                }
                if ($request->has('client_id')) {
                    $input['client_id'] = $request->client_id;
                } else {
                    $input['client_id'] = $request->created_by;
                }
                $input['user_id'] = $saved->user_id;
                $input['site_image'] = $saved->photo;
                if ($request->has('operational_days')) {
                    $ods = (array) json_decode($input['operational_days']);
                    $days = ['sun','mon','tue','wed','thu','fri','sat'];
                    $oDays = [];
                    $oHours = [];
                    foreach ($days as $val) {
                        if (isset($ods[$val]) && $ods[$val] == true) {
                            $oDays[] = $val;
                            $oHours[] = $ods[$val.'_time_operational_start'].'-'.$ods[$val.'_time_operational_end'];
                        }
                    }
                    $input['site_open_days'] = trim(implode(',',$oDays), ',');
                    $input['site_open_hours'] = trim(implode(',',$oHours), ',');
                }

                $saved = UserSite::create($input);
            }

            if (!$saved) {
                DB::rollBack();
                $json['STATUS_CODE'] = '400';
                $json['MESSAGE'] = 'Failed to create User';
            } else {
                DB::commit();
                $json['STATUS_CODE'] = '200';
                $json['MESSAGE'] = 'Success';
            }
        } catch (\Throwable $e) {
            DB::rollBack();
            $json['STATUS_CODE'] = '400';
            $json['MESSAGE'] = 'Failed. ' . $e->getMessage();
        }

        return response($json);

    }

    /**
     * Detail User
     *
     * @api GET /users/{id}
     *
     * @author tukangbasic
     */
    public function detail($id)
    {
        $data = Users::where('user_id', $id)->first();

        if(!$data){
            $json['STATUS_CODE'] = '400';
            $json['MESSAGE'] = 'User not found';
            return $json;
        }

        if ($data->user_group_id == 2) {
            $client = UserClient::where('user_id', $id)->first();
            $data['phone'] = $client['phone'];
            $data['name'] = $client['name'];
            $data['remark'] = $client['remark'];
        }

        if ($data->user_group_id == 3) {
            $site = UserSite::where('user_id', $id)->first();
            $data['site_name'] = $site['site_name'];
            $data['site_display_name'] = $site['site_display_name'];
            $data['city_id'] = $site['city_id'];
            $data['province_id'] = $site['province_id'];
            $data['site_manager'] = $site['site_manager'];
            $data['remark'] = $site['remark'];
            $data['site_address'] = $site['site_address'];
            $data['site_latitude'] = $site['site_latitude'];
            $data['site_longitude'] = $site['site_longitude'];
            $data['site_phone'] = $site['site_phone'];
            $data['site_open_days'] = $site['site_open_days'];
            $data['site_open_hours'] = $site['site_open_hours'];
            $data['store_id'] = $site['store_id'];
            $data['is_tax'] = $site['is_tax'];
        }

        if ($data) {
            $json['STATUS_CODE'] = '200';
            $json['MESSAGE'] = 'Success';
            $json['DATA'] = $data;
        }

        return $json;
    }

    /**
     * Update User
     *
     * @api POST /users/{id}
     *
     * @param String username
     * @param String email
     * @param String password
     * @param Integer user_group_id
     * @param String photo
     * @param String token
     * @param Integer updated_by
     *
     * @author tukangbasic
     */
    public function update(Request $request, $id)
    {
        $input = $request->except(['name', 'phone', 'remark', 'site_name', 'site_manager', 'site_address', 'store_id']);
        $validate = Users::isValid($input, [
            // Rifqi Kamaluddin
            // allow hyphen "-"
            // 'username' => 'required|unique:users,username,' . $id . ',user_id|min:4|max:20|alpha_num',
            'username' => [
                'required',
                'unique:users,username,' . $id . ',user_id',
                'min:4',
                'max:20',
                'regex:/^[a-zA-Z0-9-]+$/',
            ],
            'email' => 'required|unique:users,email,' . $id . ',user_id|email',
            'updated_by' => 'required',
            'user_group_id' => 'required',
            'photo' => 'required',
        ]);

        /**
         * Validate Model
         */
        if (!$validate[0]) {
            $json['STATUS_CODE'] = '400';
            $json['MESSAGE'] = 'Failed to save User';
            $json['ERROR'] = $validate[1];
            return $json;
        }

        $user = Users::find($id);

        if ($user == null) {
            $json['STATUS_CODE'] = '400';
            $json['MESSAGE'] = 'User not found';
            return $json;
        }

        if (!empty($request->input('password'))) {
            if (strlen($request->password) < 8) {
                $json['STATUS_CODE'] = '400';
                $json['MESSAGE'] = 'Failed to save User';
                $json['ERROR'] = 'Password must be least 8 characters';
                return $json;
            }
            $input['password'] = Hash::make($request->input('password'));
        }

        try {
            DB::beginTransaction();
            $input['photo']=$request->input('photo');
            $saved = $user->update($input);

            if ($request->user_group_id == 2) {
                //$input = $request->only(['name', 'phone', 'remark']);
                $input = $request->only(['username', 'email']);
                // $validate = UserClient::isValid($input, [
                //     //'email' => 'required|unique:user_client,phone,' . $id . ',user_id',
                //     'name' => 'required',
                //     //'remark' => 'required',
                // ]);

                /**
                 * Validate Model
                 */
                // if (!$validate[0]) {
                //     DB::rollBack();

                //     $json['STATUS_CODE'] = '400';
                //     $json['MESSAGE'] = 'Failed to create User';
                //     $json['ERROR'] = $validate[1];
                //     return $json;
                // }

                $input['user_id'] = $id;
                $client = UserClient::where('user_id', $id)->first();
                $saved = $client->update($input);
            }

            if ($request->user_group_id == 3) {
                if($request->has('city_id') && !empty($request->input('city_id'))){ 
                    $input = $request->only(['store_id','site_name', 'site_display_name', 'city_id','province_id', 'site_manager', 'remark', 'site_address','site_latitude','site_longitude','site_phone','operational_days','is_tax']);
                }else{
                    $input = $request->only(['store_id','site_name', 'site_display_name', 'site_manager', 'remark', 'site_address','site_latitude','site_longitude','site_phone','operational_days','is_tax']);
                }
                
                $validate = UserSite::isValid($input, [
                    'site_name' => 'required',
                    'site_manager' => 'required',
                    'site_address' => 'present',
                    'remark' => 'required',
                ]);
                /**
                 * Validate Model
                 */
                if (!$validate[0]) {
                    DB::rollBack();

                    $json['STATUS_CODE'] = '400';
                    $json['MESSAGE'] = 'Failed to create User';
                    $json['ERROR'] = $validate[1];
                    return $json;
                }

                $input['user_id'] = $id;
                $client = UserSite::where('user_id', $id)->first();
                $userCh = Users::where('user_id', $id)->first();
                $input['site_image'] = $userCh->photo;
                if ($request->has('operational_days')) {
                    $ods = (array) json_decode($input['operational_days']);
                    $days = ['sun','mon','tue','wed','thu','fri','sat'];
                    $oDays = [];
                    $oHours = [];
                    foreach ($days as $val) {
                        if (isset($ods[$val]) && $ods[$val] == true) {
                            $oDays[] = $val;
                            $oHours[] = $ods[$val.'_time_operational_start'].'-'.$ods[$val.'_time_operational_end'];
                        }
                    }
                    $input['site_open_days'] = trim(implode(',',$oDays), ',');
                    $input['site_open_hours'] = trim(implode(',',$oHours), ',');
                }

                $saved = $client->update($input);
            }
            $userCh = Users::where('user_id', $id)->first(); 
        


            if (!$saved) {
                DB::rollBack();
                $json['STATUS_CODE'] = '400';
                $json['MESSAGE'] = 'Failed to create User';
            } else {
                DB::commit();
                $json['STATUS_CODE'] = '200';
                $json['DATA'] = $userCh;
                $json['MESSAGE'] = 'Success';
            }
        } catch (\Throwable $e) {
            DB::rollBack();
            $json['STATUS_CODE'] = '400';
            $json['MESSAGE'] = 'Failed. ' . $e->getMessage();
        }
        return response($json);
    }
    
    /**
     * Delete User
     *
     * @api GET /users/{id}/delete
     *
     * @author tukangbasic
     */
    public function delete($id)
    {

        $user = Users::find($id);

        if (!$user) {
            $json['STATUS_CODE'] = '400';
            $json['MESSAGE'] = 'User not found';
            return $json;
        }
        $delete = $user->delete();

        if (!$delete) {
            $json['STATUS_CODE'] = '400';
            $json['MESSAGE'] = 'Failed to delete User';
        }else{

            // DELETE SITE
            UserSite::where('user_id', $id)->delete();

            $json['STATUS_CODE'] = '200';
            $json['MESSAGE'] = 'Success delete User';
        }
        return response($json);
    }

    /**
     * Get all Client
     *
     * @api GET /clients
     *
     * @param Integer limit
     * @param Integer page
     * @param String search
     *
     * @author tukangbasic
     */

    public function client(Request $request)
    {
        $limit = $request->has('limit') ? $request['limit'] : 10;
        $data = Users::with('role');

        $data = $data->where('user_group_id', 2);
        $data = $data->join('user_client', 'user_client.user_id', 'users.user_id');

        if ($request->has('search')) {
            $data = $data->where(function ($query) use ($request) {
                $query->orWhere('username', 'LIKE', '%' . $request['search'] . '%')
                    ->orWhere('email', 'LIKE', '%' . $request['search'] . '%');

                $query->orWhere('name', 'LIKE', '%' . $request['search'] . '%');
                $query->orWhere('phone', 'LIKE', '%' . $request['search'] . '%');

                if ($request->has('type') && $request->type == 'site') {
                    $query->orWhere('site_name', 'LIKE', '%' . $request['search'] . '%');
                    $query->orWhere('site_city', 'LIKE', '%' . $request['search'] . '%');
                    $query->orWhere('site_manager', 'LIKE', '%' . $request['search'] . '%');
                }
            });
        }
        $data = $this->paging($data->paginate($limit));

        $json['STATUS_CODE'] = '200';
        $json['MESSAGE'] = 'Success';
        $json['DATA'] = $data;
        return $json;
    }

    /**
     * Get all Site
     *
     * @api GET /clients/{client_id}/sites
     *
     * @param Integer limit
     * @param Integer page
     * @param String search
     *
     * @author tukangbasic
     */
    public function site(Request $request, $client_id)
    {
        $limit = $request->has('limit') ? $request['limit'] : 10;
        $data = Users::with('role');

        $data = $data->where('user_group_id', 3);
        $data = $data->join('user_site', 'user_site.user_id', 'users.user_id');
        $data = $data->where('client_id', $client_id);

        if ($request->has('search')) {
            $data = $data->where(function ($query) use ($request) {
                $query->orWhere('username', 'LIKE', '%' . $request['search'] . '%')
                    ->orWhere('email', 'LIKE', '%' . $request['search'] . '%');

                $query->orWhere('site_name', 'LIKE', '%' . $request['search'] . '%');
                $query->orWhere('site_city', 'LIKE', '%' . $request['search'] . '%');
                $query->orWhere('site_manager', 'LIKE', '%' . $request['search'] . '%');
            });
        }
        $data = $this->paging($data->paginate($limit));

        $json['STATUS_CODE'] = '200';
        $json['MESSAGE'] = 'Success';
        $json['DATA'] = $data;
        return $json;
    }

    
    /**
     * Find Site
     *
     * @api POST /find-site
     *
     * @param String client_code
     * @param String site_code
     *
     * @author tukangbasic
     */
    public function findSite(Request $request)
    {

        $input = $request->all();

        $validate = Users::isValid($input, [
            'client_code' => 'required',
            'site_code' => 'required',
        ]);

        /**
         * Validate Model
         */
        if (!$validate[0]) {
            $json['STATUS_CODE'] = '400';
            $json['MESSAGE'] = 'Failed to Find Client / Site';
            $json['ERROR'] = $validate[1];
            return $json;
        }

        // find client 

        $data = Users::where('user_group_id', 3);
        $data = $data->join('user_site', 'user_site.user_id', 'users.user_id');
        $data = $data->whereRaw("CONCAT('C',RIGHT(CONCAT('000000',client_id),6)) = ?",[$request['client_code']]);
        $data = $data->whereRaw("CONCAT('S',RIGHT(CONCAT('000000',users.user_id),6)) = ?",[$request['site_code']])->first();
        if ($data == null) {
            $json['STATUS_CODE'] = '400';
            $json['MESSAGE'] = 'Site not found';
            return $json;
        }
        
        $json['STATUS_CODE'] = '200';
        $json['MESSAGE'] = 'Site found';
        $json['DATA'] =  [
            'site_id' => $data['user_id'],
            'site_code' => $request->site_code,
            'client_code' => $request->client_code,
        ];
        return response($json);
    }

    public function siteDetail(Request $request, $id)
    {
        $site = UserSite::where('user_id', $id)->first();
        if (!$site) {
            $json['STATUS_CODE'] = '400';
            $json['MESSAGE'] = 'Site not found';
            return $json;
        }

        $json['STATUS_CODE'] = '200';
        $json['MESSAGE'] = $id;
        $json['DATA'] = $site;
        return response($json);
    }

}
