 <?php
//chmod -R 755 storage/app
// namespace App\Http\Controllers;

// use Illuminate\Support\Facades\Http;
// use App\Models\ProductVideo;

// class VideoImportController extends Controller
// {
//     private $shop = "timele-classics.myshopify.com";
//     private $token = "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";
//     private $apiVersion = "2024-01";

//     public function upload()
//     {
//         // set_time_limit(0);
//         // ini_set('memory_limit', '2048M');

//         // if (ob_get_level() == 0) {
//         //     ob_start();
//         // }

//         // $filePath = storage_path('app/cleaned_video_links2.csv');

//         // if (!file_exists($filePath)) {
//         //     return "CSV file nahi mili";
//         // }

//         // $rows = array_map('str_getcsv', file($filePath));

//         // $header = array_map('trim', $rows[0]);
//         // unset($rows[0]);

//         // // Batch Processing
//         // $chunks = array_chunk($rows, 100);

//         // foreach ($chunks as $batchIndex => $batch) {

//         //     echo "<h3>Batch " . ($batchIndex + 1) . "</h3>";

//         //     foreach ($batch as $row) {

//         //         try {

//         //             if (count($header) !== count($row)) {
//         //                 continue;
//         //             }

//         //             $data = array_combine($header, $row);

//         //             $handle      = trim($data['Handle'] ?? '');
//         //             $variantSku  = trim($data['Variant SKU'] ?? '');
//         //             $videoUrl    = trim($data['video'] ?? '');

//         //             if (!$handle || !$variantSku || !$videoUrl) {
//         //                 continue;
//         //             }

//         //             echo "Processing SKU: {$variantSku}<br>";

//         //             // Product ID
//         //             $productId = $this->getProductId($handle);

//         //             if (!$productId) {
//         //                 echo "Product not found<br>";
//         //                 continue;
//         //             }

//         //             // Duplicate Check
//         //             $existing = ProductVideo::where('handle', $handle)
//         //                 ->where('variant_sku', $variantSku)
//         //                 ->where('video_url', $videoUrl)
//         //                 ->first();

//         //             if ($existing) {
//         //                 echo "Already Exists<br><hr>";
//         //                 continue;
//         //             }

//         //             // Download Video
//         //             $localFile = $this->downloadVideo($videoUrl);

//         //             if (!$localFile) {
//         //                 echo "Download Failed<br>";
//         //                 continue;
//         //             }

//         //             // Create Staged Upload
//         //             $staged = $this->createStagedUpload($localFile);

//         //             $target = $staged['data']['stagedUploadsCreate']['stagedTargets'][0] ?? null;

//         //             if (!$target) {
//         //                 echo "Staged Upload Failed<br>";
//         //                 continue;
//         //             }

//         //             // Upload to Shopify
//         //             $uploaded = $this->uploadToShopify($target, $localFile);

//         //             if (!$uploaded) {
//         //                 echo "Upload Failed<br>";
//         //                 continue;
//         //             }

//         //             // Attach Video
//         //             $attached = $this->attachVideo(
//         //                 $productId,
//         //                 $target['resourceUrl']
//         //             );

//         //             if (!$attached) {
//         //                 echo "Attach Failed<br>";
//         //                 continue;
//         //             }

//         //             // Save DB
//         //             ProductVideo::create([
//         //                 'handle'             => $handle,
//         //                 'variant_sku'        => $variantSku,
//         //                 'product_id'         => $productId,
//         //                 'video_url'          => $videoUrl,
//         //                 'shopify_video_url'  => $target['resourceUrl']
//         //             ]);

//         //             echo "Uploaded Successfully<br>";

//         //             // Delete Temp File
//         //             if (file_exists($localFile)) {
//         //                 unlink($localFile);
//         //             }

//         //             echo "<hr>";

//         //             if (ob_get_level() > 0) {
//         //                 ob_flush();
//         //             }

//         //             flush();

//         //             // Shopify Rate Limit Safety
//         //             usleep(500000);

//         //         } catch (\Exception $e) {

//         //             echo "Error: " . $e->getMessage() . "<br><hr>";

//         //             continue;
//         //         }
//         //     }

//         //     // Batch Delay
//         //     sleep(1);
//         // }

//         // if (ob_get_level() > 0) {
//         //     ob_end_flush();
//         // }

//         // return "Videos Upload Completed";
//     }

//     /*
//     |--------------------------------------------------------------------------
//     | GraphQL
//     |--------------------------------------------------------------------------
//     */

//     private function graphql($query, $variables = [])
//     {
//         $response = Http::withHeaders([
//             'X-Shopify-Access-Token' => $this->token,
//             'Content-Type' => 'application/json',
//         ])
//         ->timeout(300)
//         ->post(
//             "https://{$this->shop}/admin/api/{$this->apiVersion}/graphql.json",
//             [
//                 'query' => $query,
//                 'variables' => $variables
//             ]
//         );

//         return $response->json();
//     }

//     /*
//     |--------------------------------------------------------------------------
//     | Get Product ID
//     |--------------------------------------------------------------------------
//     */

//     private function getProductId($handle)
//     {
//         $query = <<<GQL
// query getProduct(\$query: String!) {
//   products(first: 1, query: \$query) {
//     edges {
//       node {
//         id
//       }
//     }
//   }
// }
// GQL;

//         $response = $this->graphql($query, [
//             "query" => "handle:$handle"
//         ]);

//         return $response['data']['products']['edges'][0]['node']['id'] ?? null;
//     }

//     /*
//     |--------------------------------------------------------------------------
//     | Download Video
//     |--------------------------------------------------------------------------
//     */

//     private function downloadVideo($url)
//     {
//         try {

//             $extension = pathinfo(parse_url($url, PHP_URL_PATH), PATHINFO_EXTENSION);

//             if (!$extension) {
//                 $extension = "mp4";
//             }

//             $tempPath = storage_path(
//                 'app/temp_' . uniqid() . '.' . $extension
//             );

//             $response = Http::timeout(300)->get($url);

//             if (!$response->successful()) {
//                 return false;
//             }

//             file_put_contents($tempPath, $response->body());

//             return $tempPath;

//         } catch (\Exception $e) {

//             return false;
//         }
//     }

//     /*
//     |--------------------------------------------------------------------------
//     | Create Staged Upload
//     |--------------------------------------------------------------------------
//     */

//     private function createStagedUpload($filePath)
//     {
//         $fileSize = filesize($filePath);

//         $query = <<<GQL
// mutation stagedUploadsCreate(\$input: [StagedUploadInput!]!) {
//   stagedUploadsCreate(input: \$input) {
//     stagedTargets {
//       url
//       resourceUrl
//       parameters {
//         name
//         value
//       }
//     }
//     userErrors {
//       message
//     }
//   }
// }
// GQL;

//         return $this->graphql($query, [
//             "input" => [[
//                 "filename" => basename($filePath),
//                 "mimeType" => "video/mp4",
//                 "resource" => "VIDEO",
//                 "fileSize" => (string)$fileSize
//             ]]
//         ]);
//     }

//     /*
//     |--------------------------------------------------------------------------
//     | Upload to Shopify
//     |--------------------------------------------------------------------------
//     */

//     private function uploadToShopify($target, $filePath)
//     {
//         $ch = curl_init();

//         $postFields = [];

//         foreach ($target['parameters'] as $param) {
//             $postFields[$param['name']] = $param['value'];
//         }

//         $postFields['file'] = new \CURLFile(
//             $filePath,
//             'video/mp4',
//             basename($filePath)
//         );

//         curl_setopt_array($ch, [
//             CURLOPT_URL => $target['url'],
//             CURLOPT_RETURNTRANSFER => true,
//             CURLOPT_POST => true,
//             CURLOPT_POSTFIELDS => $postFields,
//             CURLOPT_TIMEOUT => 300,
//         ]);

//         curl_exec($ch);

//         $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

//         curl_close($ch);

//         return in_array($httpCode, [200, 201, 204]);
//     }

//     /*
//     |--------------------------------------------------------------------------
//     | Attach Video
//     |--------------------------------------------------------------------------
//     */

//     private function attachVideo($productId, $resourceUrl)
//     {
//         $query = <<<GQL
// mutation addMedia(\$productId: ID!, \$media: [CreateMediaInput!]!) {
//   productCreateMedia(productId: \$productId, media: \$media) {
//     media {
//       status
//     }
//     mediaUserErrors {
//       message
//     }
//   }
// }
// GQL;

//         $response = $this->graphql($query, [
//             "productId" => $productId,
//             "media" => [[
//                 "mediaContentType" => "VIDEO",
//                 "originalSource" => $resourceUrl
//             ]]
//         ]);

//         return empty(
//             $response['data']['productCreateMedia']['mediaUserErrors']
//         );
//     }
// }