<?php

namespace App\Http\Requests;

use App\Storage;
use Illuminate\Foundation\Http\FormRequest;

class StoreStorageRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        $result = [];

        switch ($this->method())
        {
            case 'POST':
                $result = [
                    'name' => 'required|unique:storages|max:255',
                    'source' => 'required|max:255',
                ];

                switch ($this->get('source'))
                {
                    case 'AmazonS3Source':
                        $result['auth_url'] = 'sometimes|url';
                        $result['access_key'] = 'sometimes|required';
                        $result['secret_key'] = 'sometimes|required';
                        $result['service_region'] = 'sometimes|required';
                        $result['container_name'] = 'sometimes|required';
                        break;

                    case 'LocalFilesystemSource':
                        $result['location'] = 'sometimes|required|is_dir|dir_empty|is_writeable';
                        break;

                    case 'OpenStackSource':
                        $result['auth_url'] = 'sometimes|required';
                        $result['tenant_name'] = 'sometimes|required';
                        $result['username'] = 'sometimes|required';
                        $result['password'] = 'sometimes|required';
                        $result['service_name'] = 'sometimes|required';
                        $result['service_region'] = 'sometimes|required';
                        $result['container_name'] = 'sometimes|required';
                        $result['cdn_url'] = 'sometimes|url';
                        break;

                    case 'RackspaceSource':
                        $result['username'] = 'sometimes|required';
                        $result['password'] = 'sometimes|required';
                        $result['service_region'] = 'sometimes|required';
                        $result['container_name'] = 'sometimes|required';
                        break;
                }
                break;

            case 'PATCH':
            case 'PUT':
                $storageId = intval($this->segment(3));
                $storage = Storage::find($storageId);
                $result = [
                    'name' => 'required|max:255|unique:storages,name,' . $storageId
                ];

                switch ($storage->source)
                {
                    case 'AmazonS3Source':
                        $result['auth_url'] = 'sometimes|url';
                        $result['access_key'] = 'sometimes|required';
                        $result['secret_key'] = 'sometimes|required';
                        $result['service_region'] = 'sometimes|required';
                        $result['container_name'] = 'sometimes|required';
                        break;

                    case 'OpenStackSource':
                        $result['auth_url'] = 'sometimes|required';
                        $result['tenant_name'] = 'sometimes|required';
                        $result['username'] = 'sometimes|required';
                        $result['password'] = 'sometimes|required';
                        $result['service_name'] = 'sometimes|required';
                        $result['service_region'] = 'sometimes|required';
                        $result['container_name'] = 'sometimes|required';
                        $result['cdn_url'] = 'sometimes|url';
                        break;

                    case 'RackspaceSource':
                        $result['username'] = 'sometimes|required';
                        $result['password'] = 'sometimes|required';
                        $result['service_region'] = 'sometimes|required';
                        $result['container_name'] = 'sometimes|required';
                        break;
                }
                break;
        }

        return $result;
    }
}