<?php

use Drupal\node\Entity\Node;
use Drupal\media\Entity\Media;
use Drupal\file\Entity\File;
use Drupal\Core\File\FileSystemInterface;

/**
 * Migrate audio files from public Audio media type to private Private Audio media type.
 * This script:
 * - Copies files to private://audio/
 * - Creates new File entities
 * - Creates new Media entities of type 'private_audio'
 * - Updates Project nodes to reference the new media
 */

$nids = \Drupal::entityQuery('node')
  ->condition('type', 'project')
  ->exists('field_audio') // Change if your old field name is different
  ->execute();

$fs = \Drupal::service('file_system');

foreach (Node::loadMultiple($nids) as $node) {
  if (!$node->hasField('field_audio') || $node->get('field_audio')->isEmpty()) {
    continue;
  }

  $old_media = $node->get('field_audio')->entity;
  if (!$old_media || !$old_media->hasField('field_media_audio')) {
    continue;
  }

  $old_file = $old_media->get('field_media_audio')->entity;
  if (!$old_file instanceof File) {
    continue;
  }

  $source_uri = $old_file->getFileUri();
  $filename = $old_file->getFilename();
  $private_uri = "private://audio/{$filename}";

  // Ensure private://audio directory exists
  $fs->prepareDirectory('private://audio', FileSystemInterface::CREATE_DIRECTORY);

  // Copy file into private directory
  $result = $fs->copy($source_uri, $private_uri, FileSystemInterface::EXISTS_RENAME);
  if (!$result) {
    echo "❌ Failed to copy {$filename} to private directory.\n";
    continue;
  }

  // Create new private file entity
  $new_file = File::create([
    'uri' => $private_uri,
    'status' => FILE_STATUS_PERMANENT,
    'uid'

