import logging
from typing import TYPE_CHECKING

from flask import current_app

from .minifigure import BrickMinifigure
from .rebrickable import Rebrickable
from .rebrickable_image import RebrickableImage
from .rebrickable_parts import RebrickableParts
if TYPE_CHECKING:
    from .set import BrickSet
    from .socket import BrickSocket

logger = logging.getLogger(__name__)


# Minifigures from Rebrickable
class RebrickableMinifigures(object):
    socket: 'BrickSocket'
    brickset: 'BrickSet'

    def __init__(self, socket: 'BrickSocket', brickset: 'BrickSet', /):
        # Save the socket
        self.socket = socket

        # Save the objects
        self.brickset = brickset

    # Import the minifigures from Rebrickable
    def download(self, /) -> None:
        self.socket.auto_progress(
            message='Set {number}: loading minifigures from Rebrickable'.format(  # noqa: E501
                number=self.brickset.fields.set,
            ),
            increment_total=True,
        )

        logger.debug('rebrick.lego.get_set_minifigs("{set}")'.format(
            set=self.brickset.fields.set,
        ))

        minifigures = Rebrickable[BrickMinifigure](
            'get_set_minifigs',
            self.brickset.fields.set,
            BrickMinifigure,
            socket=self.socket,
            brickset=self.brickset,
        ).list()

        # Process each minifigure
        total = len(minifigures)
        for index, minifigure in enumerate(minifigures):
            # Insert into the database
            self.socket.auto_progress(
                message='Set {number}: inserting minifigure {current}/{total} into database'.format(  # noqa: E501
                    number=self.brickset.fields.set,
                    current=index+1,
                    total=total,
                )
            )

            # Insert into database
            minifigure.insert(commit=False)

            # Grab the image
            self.socket.progress(
                message='Set {number}: downloading minifigure {current}/{total} image'.format(  # noqa: E501
                    number=self.brickset.fields.set,
                    current=index+1,
                    total=total,
                )
            )

            if not current_app.config['USE_REMOTE_IMAGES']:
                RebrickableImage(
                    self.brickset,
                    minifigure=minifigure
                ).download()

            # Load the inventory
            RebrickableParts(
                self.socket,
                self.brickset,
                minifigure=minifigure,
            ).download()