<?php

namespace Modules\Order\Requests\Web;

use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Request;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
use Illuminate\Validation\ValidationException;
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Http\Exceptions\HttpResponseException;
use Modules\Order\Services\CartService;
use Modules\Product\Models\Product;
use Modules\Product\Models\ProductAttribute;
use Modules\Product\Services\ProductService;
use Modules\Product\Services\ProductWarehouseService;
use Modules\User\Enums\AccountStatusEnum;
use Modules\User\Services\AccountService;

class UpdateCartRequest extends FormRequest
{
    public function __construct(
        private ProductService $productService,
        private CartService $cartService,
        private AccountService $accountService,
        private ProductWarehouseService $productWarehouseService,
    ){}

    /**
     * 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()
    {
        $account = $this->accountService->getAccount();
        $cart = $this->cartService->getItem($this->cart);
        $rules =
            [
                'count'=>'required|numeric|min:1',
            ];
        if($cart)
        {

            $user = $account['user'];

            $warehouse_id = $user->address->city->warehouses->first()->warehouse_id;

            $stock = $this->productWarehouseService->get([
                'product_id'=>$cart->product_id,
                'warehouse_id'=>$warehouse_id,
                'option_id'=>$cart->option_id,
            ])->first();

            if ($stock)
            {
                if ($stock->count < request('count'))
                {
                    return [
                        'product_over'=>'required'
                    ];
                }
            }
            else
            {
                return [
                    'product_empty'=>'required'
                ];
            }

        }

        return $rules;
    }

    public function messages()
    {
        return [
            'over_count.required' => __('web.over_count')
        ];
    }

    /**
     * Get custom attributes for validator errors.
     *
     * @return array
     */
    public function attributes()
    {

        $attributes= [
            'product_id' => __('web.product_id'),
            'count' => __('web.count'),
            'option_id' => __('web.option'),
        ];
        return $attributes;
    }

    /**
     * Handle a failed validation attempt.
     *
     * Override the parent method action if the request is for AJAX
     *
     * @param Validator $validator
     * @return void
     *
     * @throws ValidationException
     */
    protected function failedValidation(Validator $validator)
    {
        // Change response attitude if the request done via Ajax requests like API requests
        if(Request::wantsJson()){
            $errors = (new ValidationException($validator))->errors();
            throw new HttpResponseException(response()->json(['errors' => $errors], 422));
        } else {
            // Do the original action of the Form request class
            parent::failedValidation($validator);
        }
    }
}
