<?php

namespace App\Http\Requests\Admin;

use Illuminate\Foundation\Http\FormRequest;

class OrderUpdateRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     */
    public function authorize(): bool
    {
        return $this->user()->can('update', $this->route('order'));
    }

    /**
     * Get the validation rules that apply to the request.
     */
    public function rules(): array
    {
        return [
            'client_id' => 'required|exists:clients,id',
            'currency_id' => 'required|exists:currencies,id',
            'status' => 'required|in:pending,accepted,paid,cancelled,refunded',
            'items' => 'required|array|min:1',
            'items.*.type' => 'required|in:product,domain',
            'items.*.relation_id' => 'required|integer',
            'items.*.description' => 'required|string|max:255',
            'items.*.amount' => 'required|numeric|min:0',
            'items.*.setup_amount' => 'nullable|numeric|min:0',
            'items.*.quantity' => 'required|integer|min:1',
            'items.*.period' => 'required|integer|min:1',
            'items.*.period_type' => 'required|in:month,year',
            'items.*.total_amount' => 'required|numeric|min:0',
            'items.*.options' => 'nullable|array',
            'subtotal' => 'required|numeric|min:0',
            'tax_amount' => 'required|numeric|min:0',
            'discount_amount' => 'required|numeric|min:0',
            'setup_amount' => 'required|numeric|min:0',
            'total_amount' => 'required|numeric|min:0',
            'notes' => 'nullable|string',
            'send_email' => 'boolean',
            'create_invoice' => 'boolean',
            'payment_method' => 'nullable|in:credit_card,bank_transfer,paypal,manual',
            'due_date' => 'nullable|date',
        ];
    }

    /**
     * Get custom messages for validator errors.
     */
    public function messages(): array
    {
        return [
            'client_id.required' => 'Müşteri seçimi zorunludur.',
            'client_id.exists' => 'Seçilen müşteri bulunamadı.',
            'currency_id.required' => 'Para birimi seçimi zorunludur.',
            'currency_id.exists' => 'Seçilen para birimi bulunamadı.',
            'status.required' => 'Sipariş durumu zorunludur.',
            'status.in' => 'Geçersiz sipariş durumu.',
            'items.required' => 'En az bir ürün veya domain seçilmelidir.',
            'items.min' => 'En az bir ürün veya domain seçilmelidir.',
            'items.*.type.required' => 'Kalem türü belirtilmelidir.',
            'items.*.type.in' => 'Geçersiz kalem türü.',
            'items.*.relation_id.required' => 'Ürün/domain seçimi zorunludur.',
            'items.*.description.required' => 'Açıklama zorunludur.',
            'items.*.amount.required' => 'Fiyat zorunludur.',
            'items.*.amount.numeric' => 'Fiyat sayısal olmalıdır.',
            'items.*.amount.min' => 'Fiyat 0\'dan büyük olmalıdır.',
            'items.*.quantity.required' => 'Miktar zorunludur.',
            'items.*.quantity.integer' => 'Miktar tam sayı olmalıdır.',
            'items.*.quantity.min' => 'Miktar en az 1 olmalıdır.',
            'items.*.period.required' => 'Süre zorunludur.',
            'items.*.period.integer' => 'Süre tam sayı olmalıdır.',
            'items.*.period.min' => 'Süre en az 1 olmalıdır.',
            'items.*.period_type.required' => 'Süre tipi zorunludur.',
            'items.*.period_type.in' => 'Geçersiz süre tipi.',
            'items.*.total_amount.required' => 'Toplam tutar zorunludur.',
            'items.*.total_amount.numeric' => 'Toplam tutar sayısal olmalıdır.',
            'items.*.total_amount.min' => 'Toplam tutar 0\'dan büyük olmalıdır.',
            'subtotal.required' => 'Ara toplam zorunludur.',
            'tax_amount.required' => 'Vergi tutarı zorunludur.',
            'discount_amount.required' => 'İndirim tutarı zorunludur.',
            'setup_amount.required' => 'Kurulum ücreti zorunludur.',
            'total_amount.required' => 'Toplam tutar zorunludur.',
        ];
    }
}
