<?php

use App\Http\Controllers\AssetPreviewController;
use App\Http\Controllers\CampaignPerformanceController;
use App\Http\Controllers\CatalogLandingPageGenerationController;
use App\Http\Controllers\ChatController;
use App\Http\Controllers\CreativeController;
use App\Http\Controllers\LandingPagesController;
use App\Http\Controllers\PromptLandingPageController;
use App\Http\Controllers\PromptLandingPageEditorController;
use App\Livewire\CatalogLandingPages\ChatWizard as CatalogLandingPageChatWizard;
use App\Livewire\Creatives\ChatWizard;
// use App\Livewire\CatalogLandingPages\ChatWizard;
use Illuminate\Support\Facades\Route;

Route::view('/', 'welcome');

Route::view('home', 'dashboard')
    ->middleware(['auth', 'verified'])
    ->name('home');

Route::get('dashboard', function () {
    return redirect()->route('home');
})->name('dashboard');

Route::middleware(['auth', 'verified'])->group(function () {
    Route::get('chats', [ChatController::class, 'index'])->name('chats.index');
    Route::get('campaign-performance', [CampaignPerformanceController::class, 'index'])->name('campaigns.performance');
    Route::get('campaign-performance/{platform}/{campaign}', [CampaignPerformanceController::class, 'show'])
        ->where('platform', 'meta|google')
        ->name('campaigns.performance.show');
    Route::redirect('campaigns', '/campaign-performance');
    Route::get('chat', [ChatController::class, 'show'])->name('chat.show');
    Route::get('chat/new', [ChatController::class, 'create'])->name('chat.new');
    Route::post('chat/send', [ChatController::class, 'send'])->name('chat.send');
    Route::post('chat/publish', [ChatController::class, 'publish'])->name('chat.publish');
    Route::post('chat/decide', [ChatController::class, 'decide'])->name('chat.decide');
    // Looking at a campaign, which is not the same as working on it. Renamed
    // from chat.focus when the tab stopped retargeting the conversation.
    Route::post('chat/view', [ChatController::class, 'view'])->name('chat.view');
    // Creatives live on two different disks and only one of them is web served,
    // so they are streamed to their owner rather than published.
    Route::get('assets/{asset}/preview', AssetPreviewController::class)->name('assets.preview');

});

Route::get('creatives/create', ChatWizard::class)
    ->middleware(['auth', 'verified'])
    ->name('creatives.create');

Route::resource('creatives', CreativeController::class)
    ->only(['index', 'store', 'show', 'destroy'])
    ->middleware(['auth', 'verified']);

Route::get('landing-pages', [LandingPagesController::class, 'index'])
    ->middleware(['auth', 'verified'])
    ->name('landing-pages.index');

Route::get('catalog-landing-pages/create', CatalogLandingPageChatWizard::class)
    ->middleware(['auth', 'verified'])
    ->name('catalog-landing-pages.create');

Route::middleware(['auth', 'verified'])->group(function () {
    Route::get('catalog-landing-pages/templates/{template}/preview', [CatalogLandingPageGenerationController::class, 'templatePreview'])
        ->where('template', '[A-Za-z0-9][A-Za-z0-9_-]*')
        ->name('catalog-landing-pages.template-preview');
    Route::get('catalog-landing-pages/products-json-template', [CatalogLandingPageGenerationController::class, 'downloadProductsJsonTemplate'])
        ->name('catalog-landing-pages.products-json-template');
    Route::get('catalog-landing-pages/{generation}/status', [CatalogLandingPageGenerationController::class, 'status'])
        ->name('catalog-landing-pages.status');
    Route::patch('catalog-landing-pages/{generation}/pages/{landing_page}/publish', [CatalogLandingPageGenerationController::class, 'publish'])
        ->name('catalog-landing-pages.publish');
    Route::get('catalog-landing-pages/{generation}/pages/{landing_page}/analytics', [CatalogLandingPageGenerationController::class, 'analytics'])
        ->name('catalog-landing-pages.analytics');
    Route::get('catalog-landing-pages/{generation}/pages/{landing_page}/preview', [CatalogLandingPageGenerationController::class, 'preview'])
        ->name('catalog-landing-pages.preview');
    Route::get('catalog-landing-pages/{generation}/pages/{landing_page}/download', [CatalogLandingPageGenerationController::class, 'download'])
        ->name('catalog-landing-pages.download');
    Route::post('catalog-landing-pages/{generation}/pages/{landing_page}/retry', [CatalogLandingPageGenerationController::class, 'retry'])
        ->name('catalog-landing-pages.retry');
    Route::patch('catalog-landing-pages/{generation}/pixels', [CatalogLandingPageGenerationController::class, 'updatePixels'])
        ->name('catalog-landing-pages.pixels.update');
    Route::patch('catalog-landing-pages/{generation}/affiliate', [CatalogLandingPageGenerationController::class, 'updateAffiliateTracking'])
        ->name('catalog-landing-pages.affiliate.update');
});

Route::resource('catalog-landing-pages', CatalogLandingPageGenerationController::class)
    ->parameters(['catalog-landing-pages' => 'generation'])
    ->only(['index', 'show', 'destroy'])
    ->middleware(['auth', 'verified']);

Route::middleware(['auth', 'verified'])->group(function () {
    Route::get('prompt-landing-pages/create', [PromptLandingPageController::class, 'create'])
        ->name('prompt-landing-pages.create');
    Route::post('prompt-landing-pages/setup', [PromptLandingPageController::class, 'setup'])
        ->name('prompt-landing-pages.setup');
    Route::post('prompt-landing-pages/send', [PromptLandingPageController::class, 'send'])
        ->name('prompt-landing-pages.send');
    Route::get('prompt-landing-pages/{page}/status', [PromptLandingPageController::class, 'status'])
        ->name('prompt-landing-pages.status');
    Route::get('prompt-landing-pages/{page}/preview', [PromptLandingPageController::class, 'preview'])
        ->name('prompt-landing-pages.preview');
    Route::post('prompt-landing-pages/{page}/approve', [PromptLandingPageController::class, 'approve'])
        ->name('prompt-landing-pages.approve');
    Route::post('prompt-landing-pages/{page}/reject', [PromptLandingPageController::class, 'reject'])
        ->name('prompt-landing-pages.reject');
    Route::get('prompt-landing-pages/{page}/download', [PromptLandingPageController::class, 'download'])
        ->name('prompt-landing-pages.download');
    Route::post('prompt-landing-pages/{page}/duplicate', [PromptLandingPageController::class, 'duplicate'])
        ->name('prompt-landing-pages.duplicate');
    Route::post('prompt-landing-pages/{page}/override', [PromptLandingPageController::class, 'override'])
        ->name('prompt-landing-pages.override');
    Route::get('prompt-landing-pages/{page}/attachments/{attachment}', [PromptLandingPageController::class, 'attachment'])
        ->scopeBindings()
        ->name('prompt-landing-pages.attachments.show');
    Route::get('prompt-landing-pages/{page}/leads', [PromptLandingPageController::class, 'leads'])
        ->name('prompt-landing-pages.leads.index');
    Route::patch('prompt-landing-pages/{page}/pixels', [PromptLandingPageController::class, 'updatePixels'])
        ->name('prompt-landing-pages.pixels.update');

    Route::get('prompt-landing-pages/{page}/editor', [PromptLandingPageEditorController::class, 'show'])
        ->name('prompt-landing-pages.editor');
    Route::get('prompt-landing-pages/{page}/editor/data', [PromptLandingPageEditorController::class, 'data'])
        ->name('prompt-landing-pages.editor.data');
    Route::put('prompt-landing-pages/{page}/editor', [PromptLandingPageEditorController::class, 'update'])
        ->middleware('throttle:prompt-landing-page-editor')
        ->name('prompt-landing-pages.editor.update');
    Route::post('prompt-landing-pages/{page}/editor/draft', [PromptLandingPageEditorController::class, 'draft'])
        ->middleware('throttle:prompt-landing-page-editor')
        ->name('prompt-landing-pages.editor.draft');
    Route::post('prompt-landing-pages/{page}/editor/preview', [PromptLandingPageEditorController::class, 'preview'])
        ->middleware('throttle:prompt-landing-page-editor')
        ->name('prompt-landing-pages.editor.preview');
    Route::post('prompt-landing-pages/{page}/editor/reset', [PromptLandingPageEditorController::class, 'reset'])
        ->name('prompt-landing-pages.editor.reset');
    Route::get('prompt-landing-pages/{page}/editor/versions', [PromptLandingPageEditorController::class, 'versions'])
        ->name('prompt-landing-pages.editor.versions');
    Route::get('prompt-landing-pages/{page}/editor/versions/{version}/preview', [PromptLandingPageEditorController::class, 'previewVersion'])
        ->middleware('throttle:prompt-landing-page-editor')
        ->whereNumber('version')
        ->name('prompt-landing-pages.editor.versions.preview');
    Route::post('prompt-landing-pages/{page}/editor/versions/{version}/restore', [PromptLandingPageEditorController::class, 'restore'])
        ->whereNumber('version')
        ->name('prompt-landing-pages.editor.versions.restore');
    Route::post('prompt-landing-pages/{page}/editor/versions/{version}/publish', [PromptLandingPageEditorController::class, 'publishVersion'])
        ->middleware('throttle:prompt-landing-page-editor')
        ->whereNumber('version')
        ->name('prompt-landing-pages.editor.versions.publish');
    Route::delete('prompt-landing-pages/{page}/editor/versions/{version}', [PromptLandingPageEditorController::class, 'destroyVersion'])
        ->middleware('throttle:prompt-landing-page-editor')
        ->whereNumber('version')
        ->name('prompt-landing-pages.editor.versions.destroy');
});

Route::resource('prompt-landing-pages', PromptLandingPageController::class)
    ->parameters(['prompt-landing-pages' => 'page'])
    ->only(['index', 'show', 'destroy'])
    ->middleware(['auth', 'verified']);

Route::post('creatives/manual-upload', [CreativeController::class, 'manualUpload'])
    ->middleware(['auth', 'verified'])
    ->name('creatives.manual-upload');

Route::post('creatives/{creative}/regenerate', [CreativeController::class, 'regenerate'])
    ->middleware(['auth', 'verified'])
    ->name('creatives.regenerate');

Route::view('profile', 'profile')
    ->middleware(['auth'])
    ->name('profile');

require __DIR__.'/auth.php';
require __DIR__.'/googlechat.php';
