<?php

namespace App\Http\Controllers\Api\PublicApi;

use App\Http\Controllers\Controller;
use App\Models\Company;
use App\Models\ListingCategory;
use App\Models\PropertyRequest;
use App\Notifications\PropertyRequestReceivedNotification;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;

/**
 * "Sizin için bulalım": ziyaretçi/kullanıcı aradığı mülkü tarif eder; talep
 * firmalara (seçilen firmaya ya da tüm firmalara) Agency Panel'de görünür.
 */
class PropertyRequestController extends Controller
{
    public function store(Request $request)
    {
        $data = $request->validate([
            'category_id' => ['nullable', 'integer', 'exists:listing_categories,id'],
            'company_id' => [
                'nullable',
                'integer',
                Rule::exists('companies', 'id')->where('application_status', Company::STATUS_APPROVED),
            ],
            'location' => ['nullable', 'string', 'max:160'],
            'price_min' => ['nullable', 'numeric', 'min:0'],
            'price_max' => ['nullable', 'numeric', 'min:0', 'gte:price_min'],
            'currency' => ['nullable', 'string', 'in:TRY,USD,EUR'],
            'description' => ['required', 'string', 'min:10', 'max:2000'],
            'name' => ['required', 'string', 'max:160'],
            'email' => ['required', 'email', 'max:255'],
            'phone' => ['required', 'string', 'min:7', 'max:32', 'regex:/^[0-9+\s().\-]+$/'],
            'source' => ['nullable', 'string', 'in:home_cta,company_page,listing_page'],
        ]);

        // Kategori adı anlık kopyalanır (kategori sonradan silinse de talep okunur kalsın).
        $category = ! empty($data['category_id'])
            ? ListingCategory::find($data['category_id'])
            : null;

        $payload = array_merge($data, [
            // Public uçta oturum yalnızca guard açıkça verilince çözülür.
            'user_id' => $request->user('sanctum')?->id,
            'category_name' => $category?->getTranslation('name', 'tr') ?: $category?->name,
            'locale' => app()->getLocale(),
            'source' => $data['source'] ?? 'home_cta',
            'status' => PropertyRequest::STATUS_NEW,
        ]);

        $propertyRequest = PropertyRequest::create($payload);

        // Firma seçildiyse sahibine e-posta; genel talepler panelde görünür (mail yok).
        if ($propertyRequest->company_id) {
            $propertyRequest->company?->user?->notify(new PropertyRequestReceivedNotification($propertyRequest));
        }

        return response()->json([
            'message' => 'Talebiniz alındı.',
            'data' => ['id' => $propertyRequest->id, 'status' => $propertyRequest->status],
        ], 201);
    }
}
