from django.core.management.base import BaseCommand
from parts.models import Component, Package, Distributor, Manufacturer
import os
import shutil

class Command(BaseCommand):
	help = 'Migrate all media files to the current folder structure'

	def move_files_of_model(self, queryset):
		for comp in queryset:
			img_path = comp.image.name
			img_path = os.path.normpath(img_path)
			path_components = img_path.split(os.sep)

			if len(path_components) <= 2:
				self.stdout.write(f'Legacy path found: {img_path}. Will be moved')
				full_path_components = os.path.normpath(comp.image.path).split(os.sep)
				fname = full_path_components[-1]
				path_elem_count = len(full_path_components)
				full_path_components.insert(path_elem_count-1, str(fname[1]))
				full_path_components.insert(path_elem_count-1, str(fname[0]))
				dest_path = os.sep.join(full_path_components)

				# Move file
				os.makedirs(os.path.dirname(dest_path), exist_ok=True)
				shutil.move(comp.image.path, dest_path)

				# Update model
				new_rel_path_comps = path_components
				l = len(new_rel_path_comps)
				new_rel_path_comps.insert(l-1, str(fname[1]))
				new_rel_path_comps.insert(l-1, str(fname[0]))
				new_name = os.sep.join(new_rel_path_comps)
				self.stdout.write(f'New location: {dest_path}, new name: {new_name}')
				comp.image.name = new_name
				comp.save()

	def handle(self, *args, **kwargs):

		self.stdout.write('Querying components...')
		components = Component.objects.exclude(image='')
		self.stdout.write(f'Count of components with images: {components.count()}');
		self.move_files_of_model(components)

		self.stdout.write('Querying packages...')
		pkgs = Package.objects.exclude(image='')
		self.stdout.write(f'Count of components with images: {pkgs.count()}');
		self.move_files_of_model(pkgs)

		self.stdout.write('Querying manufacturers...')
		manufacturers = Manufacturer.objects.exclude(image='')
		self.stdout.write(f'Count of components with images: {manufacturers.count()}');
		self.move_files_of_model(manufacturers)

		self.stdout.write('Querying distributors...')
		distris = Distributor.objects.exclude(image='')
		self.stdout.write(f'Count of components with images: {distris.count()}');
		self.move_files_of_model(distris)

