import streamlit as st
import pandas as pd
import requests
import json
from PIL import Image
from io import BytesIO
from itertools import groupby
import instaloader
import datetime

access_token = ""
account_id = ""

instaloading = instaloader.Instaloader()

def load_media_info(access_token, account_id):
    base_url = f"https://graph.facebook.com/v11.0/{account_id}/media"
    params = {
    "fields": "id,media_type,media_url,thumbnail_url,permalink,caption,timestamp,like_count,comments_count,insights.metric(impressions,reach,engagement)",
    "access_token": access_token
    }

    items = []
    while base_url:
        response = requests.get(base_url, params=params)
        data = json.loads(response.text)

        items.extend(data["data"])

        if "paging" in data and "next" in data["paging"]:
            base_url = data["paging"]["next"]
            params = {}
        else:
            base_url = None

    return pd.DataFrame(items)

df = load_media_info(access_token, account_id)
if 'thumbnail_url' not in df.columns:
    df['thumbnail_url'] = df['media_url']
df['thumbnail_url'] = df.apply(lambda x: x["media_url"] if x["media_type"] == "IMAGE" else x["thumbnail_url"], axis=1)

df["id"] = df["timestamp"]
df["id"] = df["id"].apply(lambda x: datetime.datetime.strptime(x.split("+")[0], "%Y-%m-%dT%H:%M:%S").strftime("%Y%m%d"))

df = df.sort_values("timestamp", ascending=False)
df["id_rank"] = [f"＿＿{len(list(group))}" for _, group in groupby(df["id"])]
df["id"] += df["id_rank"]

menu = ["Content", "Analytics"]
choice = st.sidebar.radio("Menu", menu)

if choice == "Content":
    selected_id = st.sidebar.selectbox("Select Post", df["id"].unique())
    selected_data = df[df["id"] == selected_id].iloc[0]
    image_url = selected_data["media_url"] if selected_data["media_type"] == "IMAGE" else selected_data["thumbnail_url"]
    image_response = requests.get(image_url)
    image = Image.open(BytesIO(image_response.content))

    st.image(image, caption=selected_data["caption"])

    likes = selected_data["like_count"]

    if "insights" in selected_data.keys():
        try:
            impressions = selected_data["insights"][0]['values'][0]['value']
            percentage = (likes * 100) / impressions
            st.write(f"いいね: {likes} (インプレッションに対する割合: {percentage:.2f}%)")
        except (KeyError, IndexError):
            st.write(f"いいね: {likes}")
    else:
        st.write(f"いいね: {likes}")

    st.write(f"コメント数: {selected_data['comments_count']}")

elif choice == "Analytics":
    categories = ["フォロワー数", "いいね数", "コメント数"]
    selected_category = st.selectbox("Select metric", categories)

    if selected_category == "フォロワー数":
        # フォロワー数を使ったグラフの作成
        st.write("Here you can display the followers count graph")
    elif selected_category == "いいね数":
        # いいね数を使ったグラフの作成
        st.write("Here you can display the likes count graph")
    elif selected_category == "コメント数":
        # コメント数を使ったグラフの作成
        st.write("Here you can display the comments count graph")        


'''

上記コードにてJupyter開発環境ではエラー表示はなく、streamlitで表示された事を確認できました。しかし、期待された表示がされていない箇所ががあり以下に改修点を列挙します。①"Content"で右ペインにpostされた当該コンテンツの画像が大きすぎるため縦横サイズを半分ほどに縮小表示してほしい。②"Content"の右ペインの"いいね数"の隣に「インプレッション数と"いいね数"から計算された"いいね"実施率」を"(24.9%)"のように小数点第一位まで表示してほしい。③"コメント数"の下に、実際のコメント一覧とコメントしたユーザ名をリスト表示してほしい。④左ペインで"Analytics"を選択し、右ペインでリストからmetricを選択してもグラフが表示されない。例えば、投稿日を基準とした時系列を横軸にして、"フォロワー数"や"いいね数"などを縦軸に設定して"フォロワー数"や"いいね数"などのデータをグラフ脇のリストから選択して動的に表示できるように改修してほしい。これらの機能が正常に動作するよう修正済みのコードを省略せずにすべて表示してください。もしコード内にアンダースコアを2つ連続で使用するのであれば、出力時に不可視にされてしまうので"＿＿"に置換して表示してください。
