Current File : /home/itiffy/public_html/vendor/laraveldaily/quickadmin/src/Builders/RequestBuilder.php
<?php
namespace Laraveldaily\Quickadmin\Builders;

use Illuminate\Support\Str;
use Laraveldaily\Quickadmin\Cache\QuickCache;

class RequestBuilder
{
    // Request namespace
    private $namespace = 'App\Http\Requests';
    // Template
    private $template;
    // Names
    private $name;
    private $className;
    private $fileName;
    private $request;
    // Fields
    private $fields;

    /**
     * Build our request file
     */
    public function build()
    {
        $cache          = new QuickCache();
        $cached         = $cache->get('fieldsinfo');
        $this->template = __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'Templates' . DIRECTORY_SEPARATOR . 'request';
        $this->name     = $cached['name'];
        $this->fields   = $cached['fields'];
        $this->soft     = $cached['soft_delete'];
        $this->names();
        $template = [
            $this->loadTemplate(),
            $this->loadTemplate()
        ];
        $template = $this->buildParts($template);
        $this->publish($template);
    }

    /**
     *  Load request template
     */
    private function loadTemplate()
    {
        return file_get_contents($this->template);
    }

    /**
     * Build request template parts
     *
     * @param $template
     *
     * @return mixed
     */
    private function buildParts($template)
    {
        $template[0] = str_replace([
            '$NAMESPACE$',
            '$CLASS$',
            '$RULES$'
        ], [
            $this->namespace,
            'Create' . $this->className,
            $this->buildRules(0),
        ], $template[0]);

        $template[1] = str_replace([
            '$NAMESPACE$',
            '$CLASS$',
            '$RULES$'
        ], [
            $this->namespace,
            'Update' . $this->className,
            $this->buildRules(1),
        ], $template[1]);

        return $template;
    }

    /**
     * Build request rules
     * @return string
     */
    private function buildRules($type)
    {
        $used  = [];
        $rules = '';
        foreach ($this->fields as $field) {
            // Check if there is no duplication for radio and checkbox
            if (! in_array($field->title, $used)) {
                if ($field->type != 'file' && $field->type != 'relationship' && $field->type != 'money') {
                    if ($type == 0 || $field->type != 'password') {
                        switch ($field->validation) {
                            case 'required':
                                $rules .= "'$field->title' => '$field->validation', \r\n            ";
                                break;
                            case 'required|unique':
                                $camelName = Str::camel($this->name);
                                // Insert table names
                                $tableName = strtolower($camelName);
                                $rules .= "'$field->title' => '$field->validation:$tableName,$field->title,'." . '$this->' . $this->request . ", \r\n            ";
                                break;
                        }
                    }
                } elseif ($field->type == 'relationship') {
                    switch ($field->validation) {
                        case 'required':
                            $rules .= "'" . $field->relationship_name . "_id' => '$field->validation', \r\n            ";
                            break;
                        case 'required|unique':
                            $camelName = Str::camel($this->name);
                            // Insert table names
                            $tableName = strtolower($camelName);
                            $rules .= "'" . $field->relationship_name . "_id' => '$field->validation:$tableName,$field->relationship_name,'." . '$this->' . $this->request . ", \r\n            ";
                            break;
                    }
                } elseif ($field->type == 'file' || $field->type == 'photo') {
                    if ($type == 0) {
                        switch ($field->validation) {
                            case 'required':
                                $rules .= "'$field->title' => 'max:$field->size|$field->validation', \r\n            ";
                                break;
                            case 'required|unique':
                                $camelName = Str::camel($this->name);
                                // Insert table names
                                $tableName = strtolower($camelName);
                                $rules .= "'$field->title' => 'max:$field->size|$field->validation:$tableName,$field->title,'." . '$this->' . $this->request . ", \r\n            ";
                                break;
                            default:
                                // We got a file field which has a bit different validation
                                $rules .= "'$field->title' => 'max:$field->size', \r\n            ";
                                break;
                        }
                    } else {
                        switch ($field->validation) {
                            case 'required':
                                $rules .= "'$field->title' => 'max:$field->size', \r\n            ";
                                break;
                            case 'required|unique':
                                $camelName = Str::camel($this->name);
                                // Insert table names
                                $tableName = strtolower($camelName);
                                $rules .= "'$field->title' => 'max:$field->size|$field->validation:$tableName,$field->title,'." . '$this->' . $this->request . ", \r\n            ";
                                break;
                            default:
                                // We got a file field which has a bit different validation
                                $rules .= "'$field->title' => 'max:$field->size', \r\n            ";
                                break;
                        }
                    }

                } elseif ($field->type == 'money') {
                    switch ($field->validation) {
                        case 'required':
                            $rules .= "'$field->title' => 'numeric|$field->validation', \r\n            ";
                            break;
                        case 'required|unique':
                            $camelName = Str::camel($this->name);
                            // Insert table names
                            $tableName = strtolower($camelName);
                            $rules .= "'$field->title' => 'numeric|$field->validation:$tableName,$field->title,'." . '$this->' . $this->request . ", \r\n            ";
                            break;
                        default:
                            // We got a file field which has a bit different validation
                            $rules .= "'$field->title' => 'numeric', \r\n            ";
                            break;
                    }
                }
                $used[$field->title] = $field->title;
            }
        }

        return $rules;
    }

    /**
     *  Generate file and class names for the request
     */
    private function names()
    {
        $camel           = ucfirst(Str::camel($this->name));
        $this->className = $camel . 'Request';
        $this->request   = strtolower($camel);

        $fileName       = $this->className . '.php';
        $this->fileName = $fileName;
    }

    /**
     *  Publish file into it's place
     */
    private function publish($template)
    {
        if (! file_exists(app_path('Http' . DIRECTORY_SEPARATOR . 'Requests'))) {
            mkdir(app_path('Http' . DIRECTORY_SEPARATOR . 'Requests'), 0777, true);
        }
        file_put_contents(app_path('Http' . DIRECTORY_SEPARATOR . 'Requests' . DIRECTORY_SEPARATOR . 'Create' . $this->fileName),
            $template[0]);
        file_put_contents(app_path('Http' . DIRECTORY_SEPARATOR . 'Requests' . DIRECTORY_SEPARATOR . 'Update' . $this->fileName),
            $template[1]);
    }

}