<?php

namespace App\Http\Controllers\Agency\Operation;

use App\Http\Controllers\Controller;
use App\Models\Operation\OperationActivity;
use App\Services\Operation\OperationService;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

/**
 * Operasyon kartındaki etkinlik akışının yazma ucu.
 *
 * Uçlar kalkışın kendisiyle adreslenir ({type}/{id}) — kartın diğer bütün
 * uçları gibi. Operasyon kaydı (tour_operations) kalkış için henüz açılmamış
 * olabilir: ilk etkinlik yazıldığında operasyon notunda olduğu gibi burada
 * oluşturulur, kullanıcı ayrıca bir şey yapmak zorunda kalmaz.
 */
class OperationActivityController extends Controller
{
    public function __construct(private OperationService $ops)
    {
    }

    private function agencyId(): int
    {
        return Auth::user()->currentAgencyId();
    }

    /** Kalkış acentenin mi? Tur üzerinden doğrulanır (kartın diğer uçlarıyla aynı kural). */
    private function resolveOrFail(string $type, int $id): Model
    {
        $date = $this->ops->resolveByKey($type, $id);
        abort_if(! $date, 404);

        $tour = $this->ops->tourOf($date);
        abort_if(! $tour || (int) $tour->agency_id !== $this->agencyId(), 403, 'Bu işlem için yetkiniz yok.');

        return $date;
    }

    public function store(Request $request, string $type, int $id): JsonResponse
    {
        $date = $this->resolveOrFail($type, $id);

        $data = $request->validate([
            'activity_type' => 'required|in:note,call,whatsapp,email,meeting,sms',
            'subject' => 'nullable|string|max:190',
            'description' => 'required|string|max:20000',
            'priority' => 'nullable|in:low,normal,high,urgent',
            'direction' => 'nullable|in:inbound,outbound',
            'duration_minutes' => 'nullable|integer|min:0|max:10080',
        ]);

        // İlk etkinlik operasyon kaydını da açar
        $operation = $this->ops->forDate($date, true);
        abort_if(! $operation, 422, 'Bu kalkış için operasyon kaydı açılamadı.');

        $activity = OperationActivity::create([
            'agency_id' => (int) $operation->agency_id ?: $this->agencyId(),
            'operation_id' => $operation->id,
            'activity_type' => $data['activity_type'],
            'subject' => $data['subject'] ?? null,
            'description' => $data['description'],
            'direction' => $data['direction'] ?? null,
            'duration_minutes' => $data['duration_minutes'] ?? null,
            'priority' => $data['priority'] ?? 'normal',
            // Akışa elle yazılan satır yaşanmış bir olaydır; takip gerekiyorsa
            // görev modülü kullanılır, bu satır beklemede bırakılmaz.
            'status' => 'completed',
        ]);

        return response()->json([
            'success' => true,
            'message' => 'Etkinlik akışa eklendi.',
            'id' => $activity->id,
        ]);
    }

    public function destroy(string $type, int $id, int $activity): JsonResponse
    {
        $date = $this->resolveOrFail($type, $id);
        $operation = $this->ops->forDate($date);

        $row = $operation
            ? OperationActivity::byAgency($this->agencyId())
                ->byOperation($operation->id)
                ->find($activity)
            : null;

        abort_if(! $row, 404, 'Etkinlik bulunamadı.');

        $row->delete();

        return response()->json([
            'success' => true,
            'message' => 'Etkinlik silindi.',
        ]);
    }
}
