<?php

/**
 * MediaEngine Example Codes - Clean Version
 *
 * This file contains comprehensive examples of how to use the MediaEngine
 * for both URL-based and file-based media handling.
 *
 * Features:
 * - Three modes: 'save_file', 'download', 'save_url'
 * - Full backward compatibility
 * - Auto-generated filenames (optional)
 * - Auto-detected MIME types
 * - Smart mode detection
 *
 * Parameter Order:
 * addMedia(mediaCollectionKey, mediaType, mediaSource, mediaProvider,
 *          fileContent, url, mode, fileName, disk, name, userId, mimeType)
 */

namespace App\Examples;

use App\Helpers\FirstParty\MediaEngine\MediaEngine;

class MediaEngineExampleCodes
{
    /**
     * ============================================
     * MODE-BASED EXAMPLES
     * ============================================
     */

    /**
     * Basic examples showing all three modes
     */
    public function basicModeExamples()
    {
        $userId = 123;

        // MODE: 'save_file' (default) - Store file content directly
        $fileContent = file_get_contents('/path/to/image.jpg');
        $saveFileExample = MediaEngine::addMedia(
            'user-i',
            'image',
            'user_uploaded',
            'web_app',
            $fileContent,  // fileContent provided
            null,          // url null
            'save_file'    // mode: save file content to disk
        );

        // MODE: 'download' - Download from URL and store locally
        $downloadExample = MediaEngine::addMedia(
            'user-i',
            'image',
            'user_uploaded',
            'web_app',
            null,          // fileContent null
            'https://example.com/image.jpg',  // url provided
            'download'     // mode: download URL and store to disk
        );

        // MODE: 'save_url' - Just save URL reference (no download)
        $saveUrlExample = MediaEngine::addMedia(
            'user-i',
            'image',
            'user_uploaded',
            'web_app',
            null,          // fileContent null
            'https://example.com/image.jpg',  // url provided
            'save_url'     // mode: just save URL reference
        );

        return [$saveFileExample, $downloadExample, $saveUrlExample];
    }

    /**
     * Practical scenarios for each mode
     */
    public function practicalModeScenarios()
    {
        $userId = 456;

        // SAVE_URL: Fast external references (CDNs, social media)
        $cdnReference = MediaEngine::addMedia(
            'user-i',
            'image',
            'user_uploaded',
            'web_app',
            null,
            'https://cdn.example.com/fast-image.jpg',
            'save_url'
        );

        // DOWNLOAD: Critical content that needs local backup
        $criticalDownload = MediaEngine::addMedia(
            'user-i',
            'document',
            'user_uploaded',
            'web_app',
            null,
            'https://external-site.com/important-doc.pdf',
            'download'
        );

        // SAVE_FILE: Direct user uploads
        $directUpload = MediaEngine::addMedia(
            'user-i',
            'image',
            'user_uploaded',
            'web_app',
            file_get_contents($_FILES['upload']['tmp_name'])
        );

        // AI content that might expire - download for safety
        $aiContentBackup = MediaEngine::addMedia(
            'user-v',
            'video',
            'ai_generated',
            'runway_ml',
            null,
            'https://temp-ai-api.com/video_123.mp4',
            'download'
        );

        return [$cdnReference, $criticalDownload, $directUpload, $aiContentBackup];
    }

    /**
     * ============================================
     * MINIMAL EXAMPLES
     * ============================================
     */

    /**
     * Absolute minimal calls with smart mode detection
     */
    public function minimalExamples()
    {
        // URL-based - auto-detects to 'save_url'
        $urlMinimal = MediaEngine::addMedia(
            'user-i',
            'image',
            'user_uploaded',
            'web_app',
            null,
            'https://example.com/photo.jpg'
        );

        // File-based - uses default 'save_file'
        $fileContent = file_get_contents('/path/to/file.jpg');
        $fileMinimal = MediaEngine::addMedia(
            'user-i',
            'image',
            'user_uploaded',
            'web_app',
            $fileContent
        );

        // Download - explicit mode required
        $downloadMinimal = MediaEngine::addMedia(
            'user-i',
            'image',
            'user_uploaded',
            'web_app',
            null,
            'https://example.com/photo.jpg',
            'download'
        );

        return [$urlMinimal, $fileMinimal, $downloadMinimal];
    }

    /**
     * Clean one-liners for common use cases
     */
    public function oneLineExamples()
    {
        $userId = 999;

        // Social media import
        $social = MediaEngine::addMedia('user-i', 'image', 'user_uploaded', 'social', null, 'https://instagram.com/photo.jpg');

        // AI content generation
        $ai = MediaEngine::addMedia('user-v', 'video', 'ai_generated', 'runway', null, 'https://ai-api.com/video.mp4', 'download');

        // File upload
        $upload = MediaEngine::addMedia('user-a', 'audio', 'user_uploaded', 'web_app', file_get_contents('/tmp/audio.mp3'));

        // Background music
        $bgm = MediaEngine::addMedia('user-a', 'audio', 'system', 'library', null, 'https://music.com/track.mp3');

        return [$social, $ai, $upload, $bgm];
    }

    /**
     * ============================================
     * URL-BASED EXAMPLES
     * ============================================
     */

    /**
     * URL examples with save_url mode (reference only)
     */
    public function urlReferenceExamples()
    {
        // Basic URL reference
        $imageRef = MediaEngine::addMedia(
            'user-i',
            'image',
            'user_uploaded',
            'web_app',
            null,
            'https://example.com/sunset.jpg',
            'save_url'
        );

        // Video reference with user
        $videoRef = MediaEngine::addMedia(
            'user-v',
            'video',
            'user_uploaded',
            'web_app',
            null,
            'https://example.com/vacation.mp4',
            'save_url',
            null,
            'r2',
            null,
            123
        );

        // Audio reference
        $audioRef = MediaEngine::addMedia(
            'user-a',
            'audio',
            'user_uploaded',
            'web_app',
            null,
            'https://example.com/song.mp3',
            'save_url'
        );

        return [$imageRef, $videoRef, $audioRef];
    }

    /**
     * URL examples with download mode (download and store)
     */
    public function urlDownloadExamples()
    {
        // Download image and store
        $downloadedImage = MediaEngine::addMedia(
            'user-i',
            'image',
            'user_uploaded',
            'web_app',
            null,
            'https://example.com/important.jpg',
            'download'
        );

        // Download with custom settings
        $customDownload = MediaEngine::addMedia(
            'user-i',
            'image',
            'user_uploaded',
            'web_app',
            null,
            'https://example.com/avatar.jpg',
            'download',
            'user-avatar.jpg',
            'r2',
            'User Avatar',
            456,
            'image/jpeg'
        );

        return [$downloadedImage, $customDownload];
    }

    /**
     * ============================================
     * FILE-BASED EXAMPLES
     * ============================================
     */

    /**
     * File-based examples with auto-generated names
     */
    public function fileBasedExamples()
    {
        // Basic file upload with auto-generated name
        $fileContent = file_get_contents('/path/to/image.jpg');
        $autoFile = MediaEngine::addMedia(
            'user-i',
            'image',
            'user_uploaded',
            'web_app',
            $fileContent
        );

        // File with explicit mode
        $explicitFile = MediaEngine::addMedia(
            'user-i',
            'image',
            'user_uploaded',
            'web_app',
            $fileContent,
            null,
            'save_file'
        );

        // File with custom settings
        $customFile = MediaEngine::addMedia(
            'user-i',
            'document',
            'user_uploaded',
            'web_app',
            file_get_contents('/path/to/doc.pdf'),
            null,
            'save_file',
            'important-doc.pdf',
            'r2',
            'Important Document',
            789
        );

        return [$autoFile, $explicitFile, $customFile];
    }

    /**
     * Laravel file upload handling
     */
    public function laravelFileUploadExamples()
    {
        $userId = 101;

        // Basic Laravel upload with original filename
        $uploadedFile = request()->file('media');
        if ($uploadedFile) {
            $fileContent = file_get_contents($uploadedFile->getPathname());
            $originalName = MediaEngine::addMedia(
                'user-i',
                'image',
                'user_uploaded',
                'web_app',
                $fileContent,
                null,
                'save_file',
                $uploadedFile->getClientOriginalName(),
                'r2',
                null,
                $userId
            );
        }

        // Laravel upload with auto-generated filename
        $uploadedFile2 = request()->file('another_media');
        if ($uploadedFile2) {
            $fileContent = file_get_contents($uploadedFile2->getPathname());
            $autoName = MediaEngine::addMedia(
                'user-i',
                'image',
                'user_uploaded',
                'web_app',
                $fileContent,
                null,
                'save_file',
                null,
                'r2',
                null,
                $userId
            );
        }

        return [$originalName ?? null, $autoName ?? null];
    }

    /**
     * ============================================
     * REAL-WORLD SCENARIOS
     * ============================================
     */

    /**
     * Social media integration examples
     */
    public function socialMediaIntegration()
    {
        $userId = 202;

        // Instagram - save reference (fast)
        $instagram = MediaEngine::addMedia(
            'user-i',
            'image',
            'user_uploaded',
            'instagram',
            null,
            'https://instagram.com/photos/abc123.jpg',
            'save_url',
            null,
            'r2',
            null,
            $userId
        );

        // YouTube thumbnail - download (reliable)
        $youtube = MediaEngine::addMedia(
            'user-i',
            'image',
            'system_uploaded',
            'youtube_api',
            null,
            'https://img.youtube.com/vi/VIDEO_ID/maxresdefault.jpg',
            'download'
        );

        // TikTok - backward compatible
        $tiktok = MediaEngine::addMedia(
            'user-v',
            'video',
            'user_uploaded',
            'tiktok',
            null,
            'https://tiktok.com/videos/dance.mp4'
        );

        return [$instagram, $youtube, $tiktok];
    }

    /**
     * AI-generated content examples
     */
    public function aiContentExamples()
    {
        $userId = 303;

        // ElevenLabs voice - save reference
        $voice = MediaEngine::addMedia(
            'user-a',
            'audio',
            'ai_generated',
            'elevenlabs',
            null,
            'https://api.elevenlabs.io/voice_sample.mp3'
        );

        // Runway video - download for backup
        $video = MediaEngine::addMedia(
            'user-v',
            'video',
            'ai_generated',
            'runway_ml',
            null,
            'https://api.runwayml.com/video_abc.mp4',
            'download',
            null,
            'r2',
            null,
            $userId
        );

        // Midjourney image - save reference
        $image = MediaEngine::addMedia(
            'user-i',
            'image',
            'ai_generated',
            'midjourney',
            null,
            'https://cdn.midjourney.com/artwork_def.png',
            'save_url',
            null,
            'r2',
            null,
            $userId
        );

        return [$voice, $video, $image];
    }

    /**
     * Enterprise/business scenarios
     */
    public function enterpriseExamples()
    {
        $userId = 404;

        // CDN assets - reference only
        $cdnAsset = MediaEngine::addMedia(
            'user-i',
            'image',
            'system_uploaded',
            'cdn',
            null,
            'https://cdn.company.com/logo.png',
            'save_url'
        );

        // Important documents - download and backup
        $document = MediaEngine::addMedia(
            'user-d',
            'document',
            'user_uploaded',
            'web_app',
            null,
            'https://external-api.com/contract.pdf',
            'download',
            'contract-2024.pdf',
            'r2',
            'Business Contract',
            $userId
        );

        // User profile photo - flexible handling
        $profile = MediaEngine::addMedia(
            'user-i',
            'image',
            'user_uploaded',
            'web_app',
            null,
            'https://social-login.com/avatar.jpg',
            'download',
            null,
            'r2',
            'Profile Photo',
            $userId
        );

        return [$cdnAsset, $document, $profile];
    }

    /**
     * ============================================
     * BACKWARD COMPATIBILITY
     * ============================================
     */

    /**
     * Examples showing backward compatibility with auto-detection
     */
    public function backwardCompatibilityExamples()
    {
        // OLD CODE - still works with auto-detection
        $oldUrl = MediaEngine::addMedia(
            'user-i',
            'image',
            'user_uploaded',
            'web_app',
            null,
            'https://example.com/photo.jpg'  // Auto-detects 'save_url'
        );

        $oldFile = MediaEngine::addMedia(
            'user-i',
            'image',
            'user_uploaded',
            'web_app',
            file_get_contents('/path/to/image.jpg')  // Uses default 'save_file'
        );

        // NEW CODE - explicit modes
        $newUrlRef = MediaEngine::addMedia(
            'user-i',
            'image',
            'user_uploaded',
            'web_app',
            null,
            'https://example.com/photo.jpg',
            'save_url'
        );

        $newDownload = MediaEngine::addMedia(
            'user-i',
            'image',
            'user_uploaded',
            'web_app',
            null,
            'https://example.com/photo.jpg',
            'download'
        );

        $newFile = MediaEngine::addMedia(
            'user-i',
            'image',
            'user_uploaded',
            'web_app',
            file_get_contents('/path/to/image.jpg'),
            null,
            'save_file'
        );

        return [$oldUrl, $oldFile, $newUrlRef, $newDownload, $newFile];
    }

    /**
     * ============================================
     * BULK OPERATIONS
     * ============================================
     */

    /**
     * Bulk processing examples
     */
    public function bulkOperationExamples()
    {
        $userId = 505;
        $urls = [
            'https://example.com/photo1.jpg',
            'https://example.com/photo2.png',
            'https://example.com/photo3.gif',
        ];

        $results = [];

        // Bulk URL references
        foreach ($urls as $url) {
            $media = MediaEngine::addMedia(
                'user-i',
                'image',
                'user_uploaded',
                'bulk_import',
                null,
                $url,
                'save_url',
                null,
                'r2',
                null,
                $userId
            );
            $results[] = $media;
        }

        // Bulk downloads with error handling
        $downloadResults = [];
        foreach ($urls as $url) {
            try {
                $media = MediaEngine::addMedia(
                    'user-i',
                    'image',
                    'user_uploaded',
                    'bulk_download',
                    null,
                    $url,
                    'download',
                    null,
                    'r2',
                    null,
                    $userId
                );
                $downloadResults[] = $media;
            } catch (\Exception $e) {
                $downloadResults[] = ['error' => $e->getMessage(), 'url' => $url];
            }
        }

        return [$results, $downloadResults];
    }

    /**
     * ============================================
     * ERROR HANDLING
     * ============================================
     */

    /**
     * Comprehensive error handling examples
     */
    public function errorHandlingExamples()
    {
        try {
            // Invalid URL
            $invalidUrl = MediaEngine::addMedia(
                'user-i',
                'image',
                'user_uploaded',
                'web_app',
                null,
                'https://invalid-domain-12345.com/image.jpg',
                'download'
            );
        } catch (\RuntimeException $e) {
            // Handle download failure
            $error1 = ['error' => 'Download failed: '.$e->getMessage()];
        }

        try {
            // Invalid collection key
            $invalidCollection = MediaEngine::addMedia(
                'invalid-collection',
                'image',
                'user_uploaded',
                'web_app',
                null,
                'https://example.com/image.jpg'
            );
        } catch (\InvalidArgumentException $e) {
            // Handle invalid collection
            $error2 = ['error' => 'Invalid collection: '.$e->getMessage()];
        }

        try {
            // Invalid mode
            $invalidMode = MediaEngine::addMedia(
                'user-i',
                'image',
                'user_uploaded',
                'web_app',
                null,
                'https://example.com/image.jpg',
                'invalid_mode'
            );
        } catch (\InvalidArgumentException $e) {
            // Handle invalid mode
            $error3 = ['error' => 'Invalid mode: '.$e->getMessage()];
        }

        return [$error1 ?? null, $error2 ?? null, $error3 ?? null];
    }

    /**
     * ============================================
     * ADVANCED USE CASES
     * ============================================
     */

    /**
     * Advanced scenarios with custom settings
     */
    public function advancedExamples()
    {
        $userId = 606;

        // Custom filename and MIME type
        $customized = MediaEngine::addMedia(
            'user-i',
            'image',
            'user_uploaded',
            'web_app',
            null,
            'https://example.com/photo.jpg',
            'download',
            'custom-avatar-2024.jpg',
            'r2',
            'Profile Avatar',
            $userId,
            'image/jpeg'
        );

        // Multiple disk storage
        $s3Storage = MediaEngine::addMedia(
            'user-v',
            'video',
            'user_uploaded',
            'web_app',
            file_get_contents('/path/to/video.mp4'),
            null,
            'save_file',
            'presentation-video.mp4',
            's3',
            'Presentation Video',
            $userId
        );

        // Complex AI workflow
        $aiWorkflow = MediaEngine::addMedia(
            'user-a',
            'audio',
            'ai_generated',
            'custom_pipeline',
            null,
            'https://ai-pipeline.com/processed-audio.wav',
            'download',
            'processed-voice-'.time().'.wav',
            'r2',
            'AI Processed Voice',
            $userId,
            'audio/wav'
        );

        return [$customized, $s3Storage, $aiWorkflow];
    }

    /**
     * Performance optimization examples
     */
    public function performanceExamples()
    {
        $userId = 707;

        // Fast CDN reference (no download overhead)
        $fastReference = MediaEngine::addMedia(
            'user-i',
            'image',
            'user_uploaded',
            'web_app',
            null,
            'https://fast-cdn.com/optimized-image.webp',
            'save_url'
        );

        // Strategic download for critical assets
        $criticalAsset = MediaEngine::addMedia(
            'user-i',
            'image',
            'system_uploaded',
            'web_app',
            null,
            'https://external-api.com/logo.png',
            'download',
            'company-logo.png',
            'r2',
            'Company Logo'
        );

        // Lazy loading approach
        $lazyLoad = MediaEngine::addMedia(
            'user-v',
            'video',
            'user_uploaded',
            'web_app',
            null,
            'https://video-service.com/large-video.mp4',
            'save_url',
            null,
            'r2',
            null,
            $userId
        );

        return [$fastReference, $criticalAsset, $lazyLoad];
    }
}
