"Upload provided file to the S3 XCM bucket and ChromaDB"
import logging
import sys

from utils.document_loader.DocUploader import DocUploader

sys.path.append(".")

## pull in the provided files from bubble

from services.ppt_generator.data_classes.project import Project
from utils.bubble.BubbleRetriever import BubbleRetriever
from utils.client_check import ClientConfig
from utils.dynamo_db import DynamoDB


class UploadProvidedFiles:

    def __init__(self, project: Project, client: ClientConfig = None):
        self.bubble_retriever = BubbleRetriever()
        self.client = client if client else ClientConfig("xcm").get_client_config()
        self.project = project
        self.project_files = self.download_files_from_bubble()
        self.s3_files = self.store_on_s3(self.project_files)
        self.store_on_chromadb(self.s3_files)

    def download_files_from_bubble(self):
        "Download files from bubble"
        projects_files = self.bubble_retriever.get_project_files(project=self.project)
        new_files = [file for file in projects_files if not self.is_file_on_s3(file)]
        return new_files

    def store_on_s3(self, files: list):
        "Store files on S3"
        s3_files = []
        project_id = self.project.project_id
        for file in files:
            uploaded_file = self.bubble_retriever.store_on_xcm_bucket(
                self.project, file, self.client, project_id
            )
            s3_files.append(uploaded_file)
            logging.info(
                f"File Uploaded: Project ID: {project_id}. File: {file.filename} to path: {uploaded_file}"
            )

        return s3_files

    def store_on_chromadb(self, files: list):
        "Store files on ChromaDB"
        print(files)
        print("Inside store on chromadb")
        for file in files:
            doc_uploader = DocUploader(
                file,
                self.project,
                self.client,
            )
            if doc_uploader.supported:
                doc_uploader.upload_to_chromadb()


if __name__ == "__main__":
    # db = DynamoDB()
    # project = db.get_item(db.projects, "sunbelt_demo_3")
    project = Project.check_project_in_db(project_id="1713555471934x244047193002475520")

    UploadProvidedFiles(
        project=project, client=ClientConfig("sunbelt").get_client_config()
    )
