<?php

namespace App\Http\Controllers\User;

use App\Http\Controllers\BaseController;
use App\Models\Organisation;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;

class AdminController extends BaseController
{
    public function get_user(Request $_r, $_user_id) {
        if($user = User::find($_user_id)) {
            return response()->json($user, 200);            
        }

        return response()->json(['detail' => 'Error processing the request'], 500);
    }

    public function get_users(Request $_r) {
        // Build our query function
        $query_builder = function() {
            return User::select('users.id', 'email', 'phone', DB::raw('users.name as user_name'), DB::raw('organisations.name as organisation_name'))
                ->leftJoin('organisations', 'organisation_id', '=', 'organisations.id');
        };

        // Build our search function
        $query_search = function($prefix_query, $global, $filters) {

            if($global) {
                $prefix_query = $prefix_query->where(function($query) use ($global){
                    $query->orWhere('users.name', 'like', "%$global%")
                        ->orWhere('email', 'like', "%$global%")
                        ->orWhere('organisations.name', 'like', "%$global%")
                        ->orWhere('phone', 'like', "%$global%");
                });
            }

            if($filters) {
                foreach($filters as $filter) {
                    $col = '';
                    switch($filter['id']) {
                        case 'user_name': $col = 'users.name'; break;
                        case 'email': $col = 'email'; break;
                        case 'organisation_name': $col = 'organisations.name'; break;
                        case 'phone': $col = 'phone'; break;
                    }

                    if($col != '') {
                        $prefix_query = $prefix_query->where($col, 'LIKE', '%' . $filter['value'] . '%');
                    }
                }
            }

            return $prefix_query;
        };

        // Build our sorting function
        $query_sort = function($prefix_query, $column, $direction) {
            switch($column) {
                case 'user_name':
                    $prefix_query = $prefix_query->orderBy('users.name', $direction);
                    break;
                case 'email':
                    $prefix_query = $prefix_query->orderBy('email', $direction);
                    break;
                case 'organisation_name':
                    $prefix_query = $prefix_query->orderBy('organisations.name', $direction);
                    break;
                case 'phone':
                    $prefix_query = $prefix_query->orderBy('phone', $direction);
                    break;
                default:
                    $prefix_query = $prefix_query->orderBy('users.name', $direction ?? 'asc');
            }

            return $prefix_query;
        };

        // Create valid sorting keys
        $sorting_keys = ['updated_at', 'email', 'organisation_name', 'phone', 'user_name'];

        // Build our transformation function
        $query_transform = function($data) {
            $data->transform(function($row) {
                return $row;
            });

            return $data;
        };

        return BaseController::pagination_table_request($_r, $query_builder, $query_search, $query_sort, $query_transform, $sorting_keys);
    }

    public function put_user(Request $_r, $_user_id = 0) {
        try {
            $params_to_validate = [
                'name'              => $_r->input('name'),
                'email'             => $_r->input('email'),
                'group_id'          => $_r->input('group_id'),
                'organisation_id'   => $_r->input('organisation_id')
            ];

            $validation_rules = [
                'name'                  => ['required', 'max:255'],
                'email'                 => $_user_id == 0 ? ['required', 'unique:users,email', 'max:255']
                    : ['required', Rule::unique('users', 'email')->ignore($_user_id), 'max:255'],
                'group_id'              => ['exists:groups,id'],
                'organisation_id'       => ['exists:organisations,id'],
            ];

            if($_user_id !== 0) {
                $params_to_validate['id'] = $_user_id;
                $validation_rules['id'] = ['exists:users,id'];
            }

            if($_r->input('phone')) {
                $params_to_validate['phone'] = $_user_id;
                $validation_rules['phone'] = ['max:40'];
            }

            $valid_request = !Validator::make($params_to_validate, $validation_rules)->fails();

            Log::debug(Validator::make($params_to_validate, $validation_rules)->errors());

            if($valid_request) {
                $user = $_user_id ? User::find($_user_id) : new User;

                $user->fill([
                    'name'              => $_r->input('name'),
                    'password'          => '',
                    'email'             => $_r->input('email'),
                    'phone'             => $_r->input('phone'),
                    'group_id'          => $_r->input('group_id'),
                    'organisation_id'   => $_r->input('organisation_id')
                ]);
    
                if($user->save()) {
                    $user->sendSetupEmail();
                    return response()->json(['detail' => 'User edited or created'], 200);
                }
            }
        }
        catch(Exception $ex) {}

        return response()->json(['detail' => 'Error making or editing user'], 500);
    }

    public function delete_user(Request $_r, $_user_id) {
        try {
            $valid_request = !Validator::make([ 'id' => $_user_id ], [
                'id' => ['required', 'exists:users,id'],
            ])->fails();

            if($valid_request && User::find($_r->input('id'))->delete()) {
                return response()->json(['detail' => 'User deleted'], 200);
            }
        }
        catch(Exception $ex) {}

        return response()->json(['detail' => 'Error deleting user'], 500);
    }
    
}
