<?php

namespace App\Http\Controllers\Agency\Supplier;

use App\Http\Controllers\Controller;
use App\Models\Supplier\Supplier;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class SupplierFactSheetController extends Controller
{
    /**
     * Otel bilgi formunu (fact sheet) oluşturur veya günceller.
     */
    public function update(Request $request, Supplier $supplier)
    {
        if ($supplier->agency_id !== Auth::user()->currentAgencyId()) {
            abort(403, 'Yetkisiz işlem.');
        }

        if ($supplier->supplier_type !== 'hotel') {
            return response()->json([
                'success' => false,
                'message' => 'Bilgi formu yalnızca otel tipi tedarikçiler için tanımlanabilir.',
            ], 422);
        }

        $validated = $request->validate([
            'star_rating' => 'nullable|integer|min:1|max:5',
            'total_rooms' => 'nullable|integer|min:0',
            'total_area' => 'nullable|string|max:100',
            'concept' => 'nullable|string|max:150',
            'check_in_time' => 'nullable|string|max:10',
            'check_out_time' => 'nullable|string|max:10',
            'distance_to_airport' => 'nullable|string|max:100',
            'distance_to_center' => 'nullable|string|max:100',
            'distance_to_beach' => 'nullable|string|max:100',
            'description' => 'nullable|string',

            'general_features' => 'nullable|array',
            'general_features.*' => 'nullable|string|max:150',

            'room_types' => 'nullable|array',
            'room_types.*.name' => 'nullable|string|max:150',
            'room_types.*.size' => 'nullable|string|max:50',
            'room_types.*.capacity' => 'nullable|string|max:50',
            'room_types.*.count' => 'nullable|string|max:50',
            'room_types.*.features' => 'nullable|string|max:500',

            'pools' => 'nullable|array',
            'pools.*.name' => 'nullable|string|max:150',
            'pools.*.type' => 'nullable|string|max:100',
            'pools.*.length' => 'nullable|string|max:50',
            'pools.*.width' => 'nullable|string|max:50',
            'pools.*.depth' => 'nullable|string|max:50',
            'pools.*.heated' => 'nullable|string|max:20',

            'meeting_rooms' => 'nullable|array',
            'meeting_rooms.*.name' => 'nullable|string|max:150',
            'meeting_rooms.*.area' => 'nullable|string|max:50',
            'meeting_rooms.*.height' => 'nullable|string|max:50',
            'meeting_rooms.*.theatre' => 'nullable|string|max:50',
            'meeting_rooms.*.classroom' => 'nullable|string|max:50',
            'meeting_rooms.*.ushape' => 'nullable|string|max:50',
            'meeting_rooms.*.banquet' => 'nullable|string|max:50',

            'food_beverages' => 'nullable|array',
            'food_beverages.*.name' => 'nullable|string|max:150',
            'food_beverages.*.type' => 'nullable|string|max:100',
            'food_beverages.*.cuisine' => 'nullable|string|max:150',
        ]);

        // Tamamen boş satırları temizle
        $clean = function (?array $rows) {
            if (!is_array($rows)) return [];
            return array_values(array_filter($rows, function ($row) {
                return is_array($row) && count(array_filter($row, fn ($v) => $v !== null && $v !== '')) > 0;
            }));
        };

        $payload = [];

        // Skaler alanlar yalnızca istekte varsa yazılır. Quick-view'da bunlar
        // ledger satırından tek tek kaydedildiği için tablo formu onları
        // taşımaz; koşulsuz yazsaydık her tablo kaydı skalerleri siliyordu.
        foreach (self::SCALAR_FIELDS as $key) {
            if (! $request->has($key)) {
                continue;
            }
            $payload[$key] = $key === 'description'
                ? self::normalizeDescription($validated['description'] ?? null)
                : ($validated[$key] ?? null);
        }

        // Liste bölümleri: son satır silindiğinde tarayıcı o anahtarı hiç
        // göndermez. Formun bildirdiği bölümler boş da olsa yazılır ki
        // silme işlemi kaydedilsin.
        $sections = (array) $request->input('sections', []);
        foreach (['general_features', 'room_types', 'pools', 'meeting_rooms', 'food_beverages'] as $key) {
            if (! in_array($key, $sections, true) && ! $request->has($key)) {
                continue;
            }
            $payload[$key] = $key === 'general_features'
                ? array_values(array_filter($validated['general_features'] ?? [], fn ($v) => $v !== null && $v !== ''))
                : $clean($validated[$key] ?? []);
        }

        if ($payload) {
            $supplier->factSheet()->updateOrCreate(['supplier_id' => $supplier->id], $payload);
        }

        if ($request->ajax() || $request->wantsJson()) {
            return response()->json([
                'success' => true,
                'message' => 'Otel bilgi formu kaydedildi.',
            ]);
        }

        return back()->with('success', 'Otel bilgi formu kaydedildi.');
    }

    /**
     * Tek alan güncelleme — quick-view ledger satırları buraya yazar.
     * Yalnızca skaler alanları kabul eder; liste bölümleri update() ile gider.
     */
    public function updateField(Request $request, Supplier $supplier)
    {
        if ($supplier->agency_id !== Auth::user()->currentAgencyId()) {
            abort(403, 'Yetkisiz işlem.');
        }

        if ($supplier->supplier_type !== 'hotel') {
            return response()->json([
                'success' => false,
                'message' => 'Bilgi formu yalnızca otel tipi tedarikçiler için tanımlanabilir.',
            ], 422);
        }

        $request->validate([
            'field' => 'required|string',
            'value' => 'nullable',
        ]);

        $field = $request->input('field');

        if (! in_array($field, self::SCALAR_FIELDS, true)) {
            return response()->json(['success' => false, 'message' => 'Bu alan güncellenemez.'], 422);
        }

        $rules = [
            'star_rating' => 'nullable|integer|min:1|max:5',
            'total_rooms' => 'nullable|integer|min:0',
            'total_area' => 'nullable|string|max:100',
            'concept' => 'nullable|string|max:150',
            'check_in_time' => 'nullable|string|max:10',
            'check_out_time' => 'nullable|string|max:10',
            'distance_to_airport' => 'nullable|string|max:100',
            'distance_to_center' => 'nullable|string|max:100',
            'distance_to_beach' => 'nullable|string|max:100',
            'description' => 'nullable|string',
        ];

        // Boş metin null'a düşsün: "0 yıldız" gibi anlamsız değerler oluşmasın
        $value = $request->input('value');
        if (is_string($value) && trim($value) === '') {
            $value = null;
        }
        $request->merge(['value' => $value]);
        $request->validate(['value' => $rules[$field]]);

        if ($field === 'description') {
            $value = self::normalizeDescription($value);
        }

        $supplier->factSheet()->updateOrCreate(['supplier_id' => $supplier->id], [$field => $value]);

        return response()->json([
            'success' => true,
            'message' => 'Güncellendi.',
            'value' => $value,
            'display_value' => $field === 'star_rating' && $value ? $value . ' Yıldız' : $value,
        ]);
    }

    /** Boş HTML gövdesini ("<p><br></p>") null'a indirger. */
    private static function normalizeDescription(?string $description): ?string
    {
        if ($description !== null && trim(strip_tags($description)) === '') {
            return null;
        }

        return $description;
    }

    /** update() ve updateField() arasında paylaşılan skaler alan listesi. */
    private const SCALAR_FIELDS = [
        'star_rating', 'total_rooms', 'total_area', 'concept',
        'check_in_time', 'check_out_time',
        'distance_to_airport', 'distance_to_center', 'distance_to_beach',
        'description',
    ];
}
