<?php

namespace App\Http\Controllers\Agency\Tour;

use App\Http\Controllers\Controller;
use App\Models\Tour\Tour;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class TourSettingsController extends Controller
{
    use AuthorizesRequests;

    public function index(Tour $tour)
    {
        $this->authorize('update', $tour);

        $marketplaces = auth()->user()->agency->marketplaces()->where('is_active', true)->get();

        return view('agency.products.kultur-turlari.settings', compact('tour', 'marketplaces'));
    }

    public function update(Request $request, Tour $tour)
    {
        $this->authorize('update', $tour);

        $validator = \Validator::make($request->all(), [
            'is_active' => 'boolean',
            'is_public' => 'boolean',
            'is_bookable' => 'boolean',
            'published_at' => 'nullable|date',
            'expires_at' => 'nullable|date|after:published_at',
            'is_featured' => 'boolean',
            'is_bestseller' => 'boolean',
            'is_new' => 'boolean',
            'priority' => 'integer|min:0|max:100',
            'instant_booking' => 'boolean',
            'booking_deadline_hours' => 'integer|min:0',
            'min_participants' => 'integer|min:1',
            'max_participants' => 'nullable|integer|min:1|gte:min_participants',
            'refundable' => 'boolean',
            'cancellation_deadline_hours' => 'integer|min:0',
            'child_friendly' => 'boolean',
            'infant_allowed' => 'boolean',
            'min_age' => 'nullable|integer|min:0|max:100',
            'max_age' => 'nullable|integer|min:0|max:100|gte:min_age',
            'auto_guarantee_on_min' => 'boolean',
            // Kademeli ödeme planı (yalnızca konfigürasyon)
            'payment_plan_enabled' => 'boolean',
            'online_payment_enabled' => 'boolean',
            'online_deposit_percent' => 'nullable|numeric|min:0|max:100',
            'payment_plan' => 'nullable|array',
            'payment_plan.*.label' => 'nullable|string|max:100',
            'payment_plan.*.percent' => 'nullable|numeric|min:0|max:100',
            'payment_plan.*.trigger' => 'nullable|in:at_booking,days_before_departure,on_departure',
            'payment_plan.*.offset_days' => 'nullable|integer|min:0',
        ], [
            'expires_at.after' => 'Son geçerlilik tarihi, yayın tarihinden sonra olmalıdır.',
            'max_participants.gte' => 'Maksimum katılımcı sayısı, minimum katılımcı sayısından az olamaz.',
            'max_age.gte' => 'Maksimum yaş, minimum yaştan küçük olamaz.',
            'priority.max' => 'Öncelik değeri en fazla 100 olabilir.',
            'booking_deadline_hours.min' => 'Rezervasyon son tarihi negatif olamaz.',
            'cancellation_deadline_hours.min' => 'İptal son tarihi negatif olamaz.',
            'min_participants.min' => 'Minimum katılımcı sayısı en az 1 olmalıdır.',
        ]);

        if ($validator->fails()) {
            return response()->json([
                'success' => false,
                'errors' => $validator->errors()
            ], 422);
        }

        try {
            $data = $request->only([
                'is_active',
                'is_public',
                'is_bookable',
                'published_at',
                'expires_at',
                'is_featured',
                'is_bestseller',
                'is_new',
                'priority',
                'instant_booking',
                'booking_deadline_hours',
                'min_participants',
                'max_participants',
                'refundable',
                'cancellation_deadline_hours',
                'child_friendly',
                'infant_allowed',
                'min_age',
                'max_age',
            ]);

            $data['auto_guarantee_on_min'] = $request->boolean('auto_guarantee_on_min');

            // Kademeli ödeme planı konfigürasyonu
            $data['payment_plan_enabled'] = $request->boolean('payment_plan_enabled');
            $data['online_payment_enabled'] = $request->boolean('online_payment_enabled');
            $data['online_deposit_percent'] = $request->input('online_deposit_percent') ?: null;
            $data['payment_plan'] = $this->sanitizePaymentPlan($request->input('payment_plan', []));

            $tour->update($data);

            return response()->json([
                'success' => true,
                'message' => 'Tur ayarları başarıyla güncellendi.'
            ]);

        } catch (\Exception $e) {
            \Log::error('Tour settings update error: ' . $e->getMessage());

            return response()->json([
                'success' => false,
                'message' => 'Ayarlar güncellenirken bir hata oluştu.'
            ], 500);
        }
    }

    /**
     * Ödeme planı aşamalarını temizler: boş satırları atar, alanları normalize eder.
     */
    private function sanitizePaymentPlan($stages): array
    {
        if (!is_array($stages)) {
            return [];
        }

        $clean = [];
        foreach ($stages as $stage) {
            if (!is_array($stage) || ($stage['percent'] ?? '') === '' || $stage['percent'] === null) {
                continue;
            }

            $clean[] = [
                'label' => trim($stage['label'] ?? ''),
                'percent' => (float) $stage['percent'],
                'trigger' => in_array($stage['trigger'] ?? '', ['at_booking', 'days_before_departure', 'on_departure'])
                    ? $stage['trigger'] : 'at_booking',
                'offset_days' => isset($stage['offset_days']) && $stage['offset_days'] !== ''
                    ? (int) $stage['offset_days'] : 0,
            ];
        }

        return $clean;
    }

    public function archive(Tour $tour)
    {
        $this->authorize('delete', $tour);

        try {
            $tour->update([
                'is_active' => false,
                'is_public' => false,
                'is_bookable' => false,
            ]);

            return response()->json([
                'success' => true,
                'message' => 'Tur başarıyla arşivlendi.'
            ]);

        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'message' => 'Arşivleme işlemi başarısız.'
            ], 500);
        }
    }

    public function destroy(Tour $tour)
    {
        $this->authorize('delete', $tour);

        DB::beginTransaction();
        try {
            // Tur ilişkili tüm verilerle birlikte silinir (cascade delete)
            $tour->delete();

            DB::commit();

            return response()->json([
                'success' => true,
                'message' => 'Tur başarıyla silindi.'
            ]);

        } catch (\Exception $e) {
            DB::rollback();
            \Log::error('Tour delete error: ' . $e->getMessage());

            return response()->json([
                'success' => false,
                'message' => 'Silme işlemi başarısız: ' . $e->getMessage()
            ], 500);
        }
    }
}
