import cv2
import numpy as np

from json import dump, load

from pycs.interfaces.MediaFile import MediaFile
from pycs.interfaces.MediaStorage import MediaStorage
from pycs.interfaces.Pipeline import Pipeline as Interface

from .detector import Detector
from .classifier import Classifier

class Scanner(Interface):
    def __init__(self, root_folder: str, configuration: dict):
        super().__init__(root_folder, configuration)
        self.detector = Detector(configuration["detector"])
        self.classifier = Classifier(configuration["classifier"], root=root_folder)

    def close(self):
        pass

    def execute(self, storage: MediaStorage, file: MediaFile):

        im = self.read_image(file.path)
        im = cv2.cvtColor(im, cv2.COLOR_BGR2RGB)
        bw_im = cv2.cvtColor(im, cv2.COLOR_RGB2GRAY)

        detections = self.detector(bw_im)

        labels = {ml.reference: ml for ml in storage.labels()}

        for bbox, info in detections:
            if not info.selected:
                continue
            x0, y0, x1, y1 = bbox
            cls_ref = self.classifier(bbox.crop(im, enlarge=True))
            label = labels.get(cls_ref, cls_ref)
            file.add_bounding_box(x0, y0, bbox.w, bbox.h, label=label)

    def read_image(self, path: str, mode: int = cv2.IMREAD_COLOR) -> np.ndarray:
        return cv2.imread(path, mode)
