import os.path

from src.config.logger import shop_logger
from src.data.repositories.base import BaseRepository
from src.config import settings
from fastapi import UploadFile
from src.data.model.db import article as db
from src.utils import file_system as utils
from sqlalchemy import select


class PictureRepository(BaseRepository):

    async def upload_picture(self, ref_id: int, picture: UploadFile):
        """
        Saves picture
        :param ref_id: the id of referenced item
        :param picture: the picture upload
        """
        path = os.path.join(settings.pictures_path, picture.filename)

        utils.save_file(picture.file, path)

        new = db.Picture(
            ref_id=ref_id,
            path=path
        )

        self.async_session.add(instance=new)
        await self.async_session.refresh(instance=new)
        await self.async_session.commit()

        shop_logger.info(f"picture uploaded: {str(new)}")

    async def get_missing_pictures(self) -> dict[str, str]:
        """
        Determinate all picture entities with no corresponding image file
        :return: dict of form { "ref_id" : "file_name" }
        """
        query = await self.async_session.execute(select(db.Picture))
        pictures = query.scalars().all()
        missing = {picture.ref_id: picture.file for picture in pictures if not self.__get_picture_path(picture.path)}
        return missing

    @staticmethod
    def __get_picture_path(file):
        return os.path.join(settings.pictures_path, file)

    @staticmethod
    def __picture_exists(self, file):
        os.path.exists(self.__get_picture_path())
