import discord
from discord.ui import Button, View
import os
import csv
from datetime import datetime, timedelta

# 定義輸出
class ReminderView(View):
    def __init__(self, bot):
        super().__init__(timeout=None)
        self.bot = bot
        self.data_file = "data/reminder_data.csv"
        self.data_dicts = {} # 所有提醒事項
        # test channel ID = 1306873851577106442
        # show channel ID = 1345374449376956469
        self.channel_id = 1345374449376956469

        self.page = 0 # 當前頁面
        self.total_page = 0 # 總頁面(總提醒事項數量)

        # 檢查檔案並加載提醒資料
        self.load_reminders()

    async def on_timeout(self):
        """當視圖超時後，禁用所有按鈕"""
        for item in self.children:  # self.children 包含所有按鈕
            item.disabled = True  # 禁用按鈕
        await self.message.edit(view=self)  # 更新訊息，讓按鈕顯示為禁用狀態

    def load_reminders(self):
        """讀取提醒資料(csv)並加載到字典(self.data_dicts)中"""
        try:
            with open(self.data_file, mode="r", newline="", encoding="utf-8-sig") as f:
                csv_reader = csv.DictReader(f) # 把每一行轉換成字典

                i = 0
                # 將data_file值存入字典
                for row in csv_reader:
                    # 若 self.data_dicts 已經有了就不儲存
                    if row["reminder_userID_time"] not in self.data_dicts:
                        row["Content"] = row["Content"].replace("\\n", "\n")

                        try:
                            row["Repeat Count"] = int(row["Repeat Count"])
                        except ValueError:
                            row["Repeat Count"] = 0
                        try:
                            row["Interval"] = int(row["Interval"])
                        except ValueError:
                            row["Interval"] = 0

                        self.data_dicts[i] = row
                        i += 1
                        # print(f" - 訊息欄: self.data_dicts 更新 {row["reminder_userID_time"]}")
            self.total_page = len(self.data_dicts)
        except FileNotFoundError:
            print(" - 錯誤訊息: CSV file not found.")
    
    def get_current_time(self):
        """獲取當前時間並格式化為 YYYY-MM-DD HH:MM:SS"""
        now = datetime.now()
        formatted_time = now.strftime("%Y-%m-%d %H:%M:%S") # 轉為 str 格式
        return formatted_time
    
    def get_reminder_output_time(self, reminder_data):
        """提醒事項，所有輸出時間"""
        time = []
        
        first_reminder_time = reminder_data["First Reminder Time"]
        repeat_count = reminder_data["Repeat Count"]
        append_hour = reminder_data["Interval"] # 每次提醒間隔(小時)

        time.append(first_reminder_time)

        for _ in range(repeat_count):
            # 將提醒時間更新
            change_time = first_reminder_time
            change_time = datetime.strptime(change_time, "%Y-%m-%d %H:%M")
            change_time = change_time + timedelta(hours=append_hour)
            first_reminder_time = change_time.strftime("%Y-%m-%d %H:%M")

            time.append(first_reminder_time)
        return "\n- ".join(map(str, time))

    # 點擊上一個按鈕
    @discord.ui.button(label="上一個", style=discord.ButtonStyle.grey)
    async def previous_button(self, interaction: discord.Interaction, button: discord.ui.Button):
        self.load_reminders()
        self.page -= 1
        if self.page < 0:
            self.page = self.total_page - 1  # 防止頁面小於 0
        await self.update_embed(interaction)

    # 點擊下一個按鈕
    @discord.ui.button(label="下一個", style=discord.ButtonStyle.grey)
    async def next_button(self, interaction: discord.Interaction, button: discord.ui.Button):
        self.load_reminders()
        self.page += 1
        if self.page == self.total_page:
            self.page = 0
        await self.update_embed(interaction)

    # 更新嵌入內容
    async def update_embed(self, interaction: discord.Interaction):
        """根據當前頁面更新嵌入內容"""
        if not self.data_dicts:
            channel = self.bot.get_channel(self.channel_id)
            await channel.send("目前沒有提醒事項")
        if self.page >= len(self.data_dicts):
            self.page = len(self.data_dicts) - 1  # 防止超出範圍
        reminder_data = self.data_dicts[self.page]


        # 去除雙引號並分割檔案名稱
        if reminder_data["Files"] == "None":
            file_names_str = "這個提醒事項沒有附件"
        elif isinstance(reminder_data["Files"], str):
            file_names = reminder_data["Files"].strip('"').split(', ')  # 去掉雙引號並分割檔案名稱
            file_names_str = "\n- ".join(file_names)  # 將檔案名稱列表轉為字串

        now_time = self.get_current_time()
        now_time = datetime.strptime(now_time, "%Y-%m-%d %H:%M:%S") # 轉為 datetime 格式
        now_time = now_time.strftime("%Y-%m-%d %H:%M") # 轉為 str 格式
        now_time = datetime.strptime(now_time, "%Y-%m-%d %H:%M") # 轉為 datetime 格式
        # text = (
        #     f"標題: {reminder_data["Title"]}\n",
        #     f"提醒時間: \n",
        #     f"- {self.get_reminder_output_time(reminder_data)}\n",
        #     f"內文:\n",
        #     f"{reminder_data["Content"]}\n",
        #     f"相關附件名稱:\n",
        #     f"- {file_names_str}\n",
        #     f"-# {self.page +1} / {self.total_page}\n"
        # )
        text = "\n".join((
            f"標題: {reminder_data['Title']}",
            f"提醒時間: ",
            f"- {self.get_reminder_output_time(reminder_data)}\n",
            f"內文:",
            f"{reminder_data['Content']}\n",
            f"相關附件名稱:",
            f"- {file_names_str}\n",
            f"-# 頁數: {self.page + 1}/{self.total_page}"
        ))

        embed = discord.Embed(
            title = f"查看所有提醒事項",
            description = text,
            timestamp = now_time,
            color = discord.Color.green()
        )

        # 發送更新的嵌入內容
        await interaction.response.edit_message(embed=embed, view=self)

class ViewReminderButton(View):
    def __init__(self):
        super().__init__(timeout=None)

    @discord.ui.button(label="查看提醒事項", style=discord.ButtonStyle.primary)
    async def view_reminder(self, interaction: discord.Interaction, button: Button):
        view = ReminderView(interaction.client)
        await view.update_embed(interaction)
        await interaction.response.send_message("提醒事項列表", view=view)

async def send_reminder(channel, bot):
    view = ViewReminderButton()
    await channel.send("點擊下方按鈕來查看提醒事項", view=view)