def prompt(*args)

print(*args)
STDIN.gets.chomp

end

namespace :spina do

task convert_page_parts_to_json: :environment do
  page_partable_types = Spina::PagePart.joins(:page).pluck(:page_partable_type).uniq
  puts "Checking if parts are convertable to JSON..."

  all_set = true

  page_partable_types.each do |partable_type|

    if partable_type.constantize.new.respond_to?(:convert_to_json!)
      puts "✓ #{partable_type}"
    else
      puts "✗ #{partable_type}"
      all_set = false
    end

  end

  unless all_set
    answer = prompt("Not all parts can be converted to JSON. Continue? (y/n) ")
    answer = false if answer == "n"
    all_set = ActiveRecord::Type::Boolean.new.cast(answer)
  end

  if all_set
    Spina.config.locales.each do |locale|
      I18n.with_locale(locale) do
        Spina::Page.all.each do |page|
          page_parts = Spina::PagePart.where(page_id: page.id)
          json_content = page_parts.map do |page_part|
            next if page_part.page_partable.nil? # Skip blank page parts

            json_part = if page_part.page_partable.respond_to?(:convert_to_json!)
              page_part.convert_to_json!
            else
              nil
            end
          end.compact

          page.update("#{locale}_content".to_sym => json_content)
        end
      end
    end

    puts "Converted!"
  end
end

task photo_to_image: :environment do
  bar = ProgressBar.create title: "Photos", total: Spina::Photo.where(image_id: nil).count
  Spina::Photo.where(image_id: nil).find_each do |photo|
    image = Spina::Image.create(media_folder_id: photo.media_folder_id)
    begin
      image.file.attach(io: photo.file.sanitized_file.file, filename: photo.name)
      photo.update_column(:image_id, image.id)
    rescue Errno::ENOENT
      image.destroy
    end
    bar.increment
  end

  bar = ProgressBar.create title: "PageParts", total: Spina::PagePart.where(page_partable_type: 'Spina::Photo').count
  Spina::PagePart.where(page_partable_type: 'Spina::Photo').find_each do |page_part|
    if page_part.page_partable.present?
      page_part.update_columns(
        page_partable_type: 'Spina::Image',
        page_partable_id: page_part.page_partable.image_id
      )
    else
      page_part.update_column(:page_partable_type, 'Spina::Image')
    end
    bar.increment
  end

  bar = ProgressBar.create title: "StructureParts", total: Spina::StructurePart.where(structure_partable_type: 'Spina::Photo').count
  Spina::StructurePart.where(structure_partable_type: 'Spina::Photo').find_each do |structure_part|
    if structure_part.structure_partable.present?
      structure_part.update_columns(
        structure_partable_type: 'Spina::Image',
        structure_partable_id: structure_part.structure_partable.image_id
      )
    else
      structure_part.update_column(:structure_partable_type, 'Spina::Image')
    end
    bar.increment
  end

  bar = ProgressBar.create title: "PhotoCollections", total: Spina::PagePart.where(page_partable_type: 'Spina::PhotoCollection').count
  Spina::PagePart.where(page_partable_type: 'Spina::PhotoCollection').find_each do |page_part|
    if page_part.partable.present?
      image_collection = Spina::ImageCollection.create
      page_part.partable.photos.each do |photo|
        image_collection.images << Spina::Image.find(photo.image_id)
      end
      page_part.update_columns(
        page_partable_type: 'Spina::ImageCollection',
        page_partable_id: image_collection.id
      )
    else
      page_part.update_column :page_partable_type, 'Spina::ImageCollection'
    end
    bar.increment
  end

  bar = ProgressBar.create title: "StructurePart PhotoCollections", total: Spina::StructurePart.where(structure_partable_type: 'Spina::PhotoCollection').count
  Spina::StructurePart.where(structure_partable_type: 'Spina::PhotoCollection').find_each do |structure_part|
    if structure_part.partable.present?
      image_collection = Spina::ImageCollection.create
      structure_part.partable.photos.each do |photo|
        image_collection.images << Spina::Image.find(photo.image_id)
      end
      structure_part.update_columns(
        structure_partable_type: 'Spina::ImageCollection',
        structure_partable_id: image_collection.id
      )
    else
      structure_part.update_column :structure_partable_type, 'Spina::PhotoCollection'
    end
    bar.increment
  end
end

end