<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Http\Requests\BackendUserDelete;
use App\Models\BackendAuth\BackendUser;
use Illuminate\Http\Request;
use Fractal;
use RequestContext;
use App\Facades\Services\BackendUserService;
use App\Facades\Services\ConfigurationService;
use App\Libs\Transformers\ConfigurationTransformer;
use App\Models\Configuration;
use App\Http\Requests\ConfigurationStore;
use Illuminate\Support\Facades\Validator;

class ConfigurationController extends Controller
{

    use UserManageTrait;

    public function getIndex()
    {
        $loggedUser = BackendUserService::getLoggedUser();

        return view('admin.pages.configurations.admin_configurations', [
            'canInsert'     => false,
            'loggedUser'    => $loggedUser
        ]);
    }

    public function postList(Request $request)
    {
        $page = $request->input("current");
        $rowCount = $request->input("rowCount");
        $sort = $request->input("sort");
        $search = $request->input("searchPhrase");

        if (!empty($page)) {
            $result = ConfigurationService::getConfigurationsList($page, $rowCount, $sort, $search);
            $result["rows"] = Fractal::collection($result["rows"])
                ->transformWith(new ConfigurationTransformer())->toArray();
            return response()->json($result);
        } else {
            $users = BackendUser::all();
            return response()->json(Fractal::collection($users)
                ->transformWith(new ConfigurationTransformer())->toArray());
        }
    }

    public function getEdit($configId)
    {
        $loggedUser = BackendUserService::getLoggedUser();

        if (!$loggedUser->hasPermission("cms.manage")) {
            abort(403);
        }

        RequestContext::set('selected_menu', 'admin');
        RequestContext::set('selected_menu_option', 'configurations');

        $configuration = Configuration::find($configId);


        if (empty($configuration)) {
            abort(404);
        }


        return view('admin.pages.configurations.configuration_form', [
            'configuration' => $configuration,
            'canEdit'       => $loggedUser->hasPermission("cms.manage"),
            'canView'       => $loggedUser->hasPermission("cms.manage"),
        ]);
    }

    public function postEdit(ConfigurationStore $request, $configId)
    {

        $configuration = Configuration::find($configId);

        if ($configuration->validation_rules) {
            $validator = Validator::make($request->all(), [
                'value' => $configuration->validation_rules,
            ]);

            if ($validator->fails()) {
                return redirect('/admin/configurations/edit/' . $configuration->id)
                    ->withErrors($validator)
                    ->withInput();
            }
        }




        $data         = $request->validated();
        $configuration = ConfigurationService::editConfiguration($configId, $data);

        $message        = trans(
            'backend.updated_successfully',
            array('entity' => 'Configuration')
        );

        return redirect('/admin/configurations/edit/' . $configuration->id)
            ->with("message", $message);
    }

    public function postDelete(BackendUserDelete $request)
    {
        $data = $request->validated();
        $user = BackendUser::find($data['id']);

        if (!empty($user)) {
            $user->delete();
        }

        return response()->json(["success" => true]);
    }
}
