<?php

namespace App\Http\Controllers\Api\V1;

use App\Actions\CreateRouteAction;
use App\Http\Requests\StoreRouteRequest;
use App\Http\Resources\RouteResource;
use App\Models\Feed;
use App\Models\PlatformChannel;
use App\Models\Route;
use Exception;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Validation\ValidationException;

class RoutingController extends BaseController
{
    /**
     * Display a listing of routing configurations
     */
    public function index(): JsonResponse
    {
        $routes = Route::with(['feed', 'platformChannel', 'keywords'])
            ->orderBy('is_active', 'desc')
            ->orderBy('priority', 'asc')
            ->get();

        return $this->sendResponse(
            RouteResource::collection($routes),
            'Routing configurations retrieved successfully.'
        );
    }

    /**
     * Store a newly created routing configuration
     */
    public function store(StoreRouteRequest $request, CreateRouteAction $createRouteAction): JsonResponse
    {
        try {
            $validated = $request->validated();

            $route = $createRouteAction->execute(
                $validated['feed_id'],
                $validated['platform_channel_id'],
                $validated['priority'] ?? 0,
                $validated['is_active'] ?? true,
            );

            return $this->sendResponse(
                new RouteResource($route->load(['feed', 'platformChannel', 'keywords'])),
                'Routing configuration created successfully!',
                201
            );
        } catch (Exception $e) {
            return $this->sendError('Failed to create routing configuration: '.$e->getMessage(), [], 500);
        }
    }

    /**
     * Display the specified routing configuration
     */
    public function show(Feed $feed, PlatformChannel $channel): JsonResponse
    {
        $route = $this->findRoute($feed, $channel);

        if (! $route) {
            return $this->sendNotFound('Routing configuration not found.');
        }

        $route->load(['feed', 'platformChannel', 'keywords']);

        return $this->sendResponse(
            new RouteResource($route),
            'Routing configuration retrieved successfully.'
        );
    }

    /**
     * Update the specified routing configuration
     */
    public function update(Request $request, Feed $feed, PlatformChannel $channel): JsonResponse
    {
        try {
            $route = $this->findRoute($feed, $channel);

            if (! $route) {
                return $this->sendNotFound('Routing configuration not found.');
            }

            $validated = $request->validate([
                'is_active' => 'boolean',
                'priority' => 'nullable|integer|min:0',
            ]);

            Route::where('feed_id', $feed->id)
                ->where('platform_channel_id', $channel->id)
                ->update($validated);

            return $this->sendResponse(
                new RouteResource($route->fresh(['feed', 'platformChannel', 'keywords'])),
                'Routing configuration updated successfully!'
            );
        } catch (ValidationException $e) {
            return $this->sendValidationError($e->errors());
        } catch (Exception $e) {
            return $this->sendError('Failed to update routing configuration: '.$e->getMessage(), [], 500);
        }
    }

    /**
     * Remove the specified routing configuration
     */
    public function destroy(Feed $feed, PlatformChannel $channel): JsonResponse
    {
        try {
            $route = $this->findRoute($feed, $channel);

            if (! $route) {
                return $this->sendNotFound('Routing configuration not found.');
            }

            Route::where('feed_id', $feed->id)
                ->where('platform_channel_id', $channel->id)
                ->delete();

            return $this->sendResponse(
                null,
                'Routing configuration deleted successfully!'
            );
        } catch (Exception $e) {
            return $this->sendError('Failed to delete routing configuration: '.$e->getMessage(), [], 500);
        }
    }

    /**
     * Toggle routing configuration active status
     */
    public function toggle(Feed $feed, PlatformChannel $channel): JsonResponse
    {
        try {
            $route = $this->findRoute($feed, $channel);

            if (! $route) {
                return $this->sendNotFound('Routing configuration not found.');
            }

            $newStatus = ! $route->is_active;
            Route::where('feed_id', $feed->id)
                ->where('platform_channel_id', $channel->id)
                ->update(['is_active' => $newStatus]);

            $status = $newStatus ? 'activated' : 'deactivated';

            return $this->sendResponse(
                new RouteResource($route->fresh(['feed', 'platformChannel', 'keywords'])),
                "Routing configuration {$status} successfully!"
            );
        } catch (Exception $e) {
            return $this->sendError('Failed to toggle routing configuration status: '.$e->getMessage(), [], 500);
        }
    }

    /**
     * Find a route by feed and channel
     */
    private function findRoute(Feed $feed, PlatformChannel $channel): ?Route
    {
        return Route::where('feed_id', $feed->id)
            ->where('platform_channel_id', $channel->id)
            ->first();
    }
}
