import json

import requests
from django.core.files.base import ContentFile
from django.core.management.base import BaseCommand

from apps.parks.models import Park, ParkPhoto
from apps.rides.models import Ride, RidePhoto


class Command(BaseCommand):
    help = "Download photos from seed data URLs"

    def handle(self, *args, **kwargs):
        self.stdout.write("Downloading photos from seed data...")

        # Read seed data
        with open("parks/management/commands/seed_data.json") as f:
            seed_data = json.load(f)

        # Process parks and their photos
        for park_data in seed_data["parks"]:
            try:
                park = Park.objects.get(name=park_data["name"])

                # Download park photos
                for idx, photo_url in enumerate(park_data["photos"], 1):
                    try:
                        # Download image
                        self.stdout.write(f"Downloading from URL: {photo_url}")
                        response = requests.get(photo_url, timeout=60)
                        if response.status_code == 200:
                            # Delete any existing photos for this park
                            ParkPhoto.objects.filter(park=park).delete()

                            # Create new photo record
                            photo = ParkPhoto(
                                park=park,
                                is_primary=idx == 1,
                            )

                            # Save image content
                            photo.image.save(
                                f"{park.slug}_{idx}.jpg",
                                ContentFile(response.content),
                                save=False,
                            )
                            photo.save()

                            self.stdout.write(
                                f"Downloaded photo for {
                                    park.name}: {
                                    photo.image.name}"
                            )
                            self.stdout.write(f"Database record created with ID: {photo.id}")
                        else:
                            self.stdout.write(
                                f"Error downloading image. Status code: {
                                    response.status_code}"
                            )

                    except Exception as e:
                        self.stdout.write(
                            f"Error downloading park photo: {
                                str(e)}"
                        )

                # Process rides and their photos
                for ride_data in park_data["rides"]:
                    try:
                        ride = Ride.objects.get(name=ride_data["name"], park=park)

                        # Download ride photos
                        for idx, photo_url in enumerate(ride_data["photos"], 1):
                            try:
                                # Download image
                                self.stdout.write(f"Downloading from URL: {photo_url}")
                                response = requests.get(photo_url, timeout=60)
                                if response.status_code == 200:
                                    # Delete any existing photos for this ride
                                    RidePhoto.objects.filter(ride=ride).delete()

                                    # Create new photo record
                                    photo = RidePhoto(
                                        ride=ride,
                                        is_primary=idx == 1,
                                    )

                                    # Save image content
                                    photo.image.save(
                                        f"{ride.slug}_{idx}.jpg",
                                        ContentFile(response.content),
                                        save=False,
                                    )
                                    photo.save()

                                    self.stdout.write(
                                        f"Downloaded photo for {
                                            ride.name}: {
                                            photo.image.name}"
                                    )
                                    self.stdout.write(
                                        f"Database record created with ID: {
                                            photo.id}"
                                    )
                                else:
                                    self.stdout.write(
                                        f"Error downloading image. Status code: {
                                            response.status_code}"
                                    )

                            except Exception as e:
                                self.stdout.write(f"Error downloading ride photo: {str(e)}")

                    except Ride.DoesNotExist:
                        self.stdout.write(
                            f'Ride not found: {
                                ride_data["name"]}'
                        )

            except Park.DoesNotExist:
                self.stdout.write(f'Park not found: {park_data["name"]}')

        self.stdout.write("Finished downloading photos")
