import json
from typing import Union, List, Dict

import pandas as pd

from app.config import logger
from app.convert.base_converter import BaseConverter
from app.convert.utils.encode_utf8 import encode_utf8


class InstagramPostsConverter(BaseConverter):
    def read_file(self) -> None:
        content = encode_utf8(self.content)
        self.datadict = json.loads(content)
        posts_medias = []
        for post in self.datadict:
            medias = post['media']
            if len(medias) == 1:
                media = medias[0]
                posts_medias.append({
                    "chemin": [media["uri"]],
                    "texte": media["title"],
                    "creation_timestamp": media["creation_timestamp"]
                })
            else:
                title = post['title']
                creation_timestamp = post['creation_timestamp']
                list_uris = [media['uri'] for media in medias]
                posts_medias.append({
                    "chemin": list_uris,
                    "texte": title,
                    "creation_timestamp": creation_timestamp
                })

        self.df = pd.DataFrame(posts_medias).explode(['chemin'])

    def add_metadata(self) -> None:
        self.df = self.df.assign(
            index="instagram_posts",
            type="posts",
            network="Instagram"
        )

    def convert_columns(self) -> None:
        self.df['creation_timestamp'] = (self.df['creation_timestamp']
                                         .astype(int))

    def rename_columns(self) -> None:
        self.df = self.df.rename(columns={})

    def clean_data(self) -> None:
        self.df['url'] = ""
        self.df.fillna(value="", inplace=True)


def convert_instagram_posts_json(content: Union[str, bytes]) -> List[Dict]:
    logger.info(f"Starting conversion of {len(content)} bytes")
    converter = InstagramPostsConverter(content)

    return converter.convert()
