import os
from django.core.management.base import BaseCommand
from apps.parks.models import ParkPhoto
from apps.rides.models import RidePhoto
from django.db import transaction


class Command(BaseCommand):
    help = "Fix photo paths in database to match actual file locations for domain-specific photos"

    def handle(self, *args, **kwargs):
        self.stdout.write("Fixing photo paths in database...")

        # Get all domain-specific photos
        park_photos = ParkPhoto.objects.all()
        ride_photos = RidePhoto.objects.all()
        photos = list(park_photos) + list(ride_photos)

        for photo in photos:
            try:
                with transaction.atomic():
                    # Get current file path
                    current_name = photo.image.name

                    # Remove any 'media/' prefix if it exists
                    if current_name.startswith("media/"):
                        # Remove 'media/' prefix
                        current_name = current_name[6:]

                    parts = current_name.split("/")

                    if len(parts) >= 2:
                        content_type = parts[0]  # 'park' or 'ride'
                        identifier = parts[1]  # e.g., 'alton-towers'

                        # Look for files in the media directory
                        media_dir = os.path.join("media", content_type, identifier)
                        if os.path.exists(media_dir):
                            files = [
                                f
                                for f in os.listdir(media_dir)
                                if not f.startswith(".")  # Skip hidden files
                                and not f.startswith("tmp")  # Skip temp files
                                and os.path.isfile(os.path.join(media_dir, f))
                            ]

                            if files:
                                # Get the first file and update the database record
                                file_path = os.path.join(content_type, identifier, files[0])
                                if os.path.exists(os.path.join("media", file_path)):
                                    photo.image.name = file_path
                                    photo.save()
                                    self.stdout.write(
                                        f"Updated path for photo {photo.id} to {file_path}"
                                    )
                                else:
                                    # If the expected file is still missing, fall back to placeholder
                                    placeholder = os.path.join("placeholders", "default.svg")
                                    photo.image.name = placeholder
                                    photo.save()
                                    self.stdout.write(
                                        f"File missing for photo {photo.id}; set placeholder {placeholder}"
                                    )
                            else:
                                # No files found for this identifier -> set placeholder
                                placeholder = os.path.join("placeholders", "default.svg")
                                photo.image.name = placeholder
                                photo.save()
                                self.stdout.write(
                                    f"No files in {media_dir} for photo {photo.id}; set placeholder {placeholder}"
                                )
                        else:
                            # Directory missing -> set placeholder
                            placeholder = os.path.join("placeholders", "default.svg")
                            photo.image.name = placeholder
                            photo.save()
                            self.stdout.write(
                                f"Directory not found for photo {photo.id}: {media_dir}; set placeholder {placeholder}"
                            )

            except Exception as e:
                self.stdout.write(f"Error updating photo {photo.id}: {str(e)}")
                continue

        self.stdout.write("Finished fixing photo paths")
