<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;

class CreatorDataRequest extends FormRequest
{
    /**
     * Xác định user có được phép thực hiện request này không
     */
    public function authorize(): bool
    {
        $organization = $this->attributes->get('current_organization');
        return $this->user()->can('viewAny', [\App\Models\Creator::class, $organization]);
    }

    /**
     * Các rules validation cho dữ liệu filter/sort/pagination
     */
    public function rules(): array
    {
        return [
            'keyword' => ['nullable', 'string', 'max:255'],
            'contacts' => ['nullable', 'array'],
            'contacts.*' => ['in:phone,email,zalo'],
            'advantages' => ['nullable', 'array'],
            'advantages.*' => ['string', 'max:50'],
            'followers_min' => ['nullable', 'integer', 'min:0', 'max:4294967295'],  // unsignedInteger trong DB
            'followers_max' => ['nullable', 'integer', 'min:0', 'max:4294967295'],  // unsignedInteger trong DB
            'gmv_min' => ['nullable', 'integer', 'min:0', 'max:18446744073709551615'],  // unsignedBigInteger
            'gmv_max' => ['nullable', 'integer', 'min:0', 'max:18446744073709551615'],  // unsignedBigInteger
            'items_min' => ['nullable', 'integer', 'min:0', 'max:18446744073709551615'],  // unsignedBigInteger
            'items_max' => ['nullable', 'integer', 'min:0', 'max:18446744073709551615'],  // unsignedBigInteger
            'classification' => ['nullable', 'string', Rule::in(['nano', 'micro', 'macro'])],
            'content' => ['nullable', 'string', 'max:100'],
            'sort_field' => [
                'nullable',
                Rule::in(['creator_name', 'followers', 'gmv', 'items', 'average_views', 'campaigns_count', 'bookings_count', 'created_at'])
            ],
            'sort_direction' => [
                'nullable',
                Rule::in(['asc', 'desc'])
            ],
            'per_page' => ['nullable', 'integer', 'min:1', 'max:100'],
            'page' => ['nullable', 'integer', 'min:1'],
        ];
    }

    /**
     * Tùy chỉnh tên trường cho thông báo lỗi
     */
    public function attributes(): array
    {
        return [
            'keyword' => 'Từ khóa tìm kiếm',
            'contacts' => 'Kênh liên hệ',
            'advantages' => 'Loại nội dung',
            'followers_min' => 'Số followers tối thiểu',
            'followers_max' => 'Số followers tối đa',
            'gmv_min' => 'Doanh thu tối thiểu',
            'gmv_max' => 'Doanh thu tối đa',
            'items_min' => 'Số món tối thiểu',
            'items_max' => 'Số món tối đa',
            'classification' => 'Phân loại',
            'content' => 'Content',
            'sort_field' => 'Trường sắp xếp',
            'sort_direction' => 'Hướng sắp xếp',
            'per_page' => 'Số bản ghi mỗi trang',
            'page' => 'Trang',
        ];
    }

    /**
     * Lấy dữ liệu đã được validate và format
     */
    public function getValidatedFilters(): array
    {
        $validated = $this->validated();

        return [
            'keyword' => $validated['keyword'] ?? '',
            'contacts' => $validated['contacts'] ?? [],
            'advantages' => $validated['advantages'] ?? [],
            'followers_min' => $validated['followers_min'] ?? null,
            'followers_max' => $validated['followers_max'] ?? null,
            'gmv_min' => $validated['gmv_min'] ?? null,
            'gmv_max' => $validated['gmv_max'] ?? null,
            'items_min' => $validated['items_min'] ?? null,
            'items_max' => $validated['items_max'] ?? null,
            'classification' => $validated['classification'] ?? '',
            'content' => $validated['content'] ?? '',
            'sort_field' => $validated['sort_field'] ?? null,
            'sort_direction' => $validated['sort_direction'] ?? 'asc',
        ];
    }

    /**
     * Lấy số bản ghi mỗi trang đã được validate
     */
    public function getPerPage(): int
    {
        return (int) ($this->validated()['per_page'] ?? 10);
    }

    /**
     * Lấy số trang đã được validate
     */
    public function getPage(): int
    {
        return (int) ($this->validated()['page'] ?? 1);
    }
}
