import discord
from discord import app_commands
import requests
from datetime import datetime, timedelta
import asyncio
import logging
from config import config


class Destiny2:
    def __init__(self, bot):
        self.bot = bot
        self.api_key = config['BUNGIE_API_KEY']
        self.logger = logging.getLogger('Destiny2')
        self.logger.setLevel(logging.DEBUG)
        handler = logging.FileHandler(filename='destiny2.log', encoding='utf-8', mode='w')
        handler.setFormatter(logging.Formatter('%(asctime)s:%(levelname)s:%(name)s: %(message)s'))
        self.logger.addHandler(handler)

    async def fetch_item_details(self, item_hash):
        headers = {
            "X-API-Key": self.api_key
        }
        url = f"https://www.bungie.net/Platform/Destiny2/Manifest/DestinyInventoryItemDefinition/{item_hash}/"
        response = requests.get(url, headers=headers)
        if response.status_code == 200:
            item_data = response.json()
            return item_data['Response']
        else:
            self.logger.error(f'Error fetching item details for {item_hash}: {response.status_code} - {response.text}')
            return None

    async def fetch_vendors(self, interaction: discord.Interaction):
        await interaction.response.defer()  # Defer the interaction response

        headers = {
            "X-API-Key": self.api_key
        }
        url = "https://www.bungie.net/Platform/Destiny2/Vendors/"
        response = requests.get(url, headers=headers)
        if response.status_code == 200:
            data = response.json()
            self.logger.debug(f'Vendors data: {data}')
            try:
                vendors_info = data['Response']['vendors']
                embeds = []
                for vendor_hash, vendor_data in vendors_info.items():
                    vendor_name = vendor_data['vendorName']
                    vendor_icon = vendor_data['vendorIcon']
                    embed = discord.Embed(title=f"{vendor_name}'s Inventory", color=discord.Color.blue())
                    embed.set_thumbnail(url=f"https://www.bungie.net{vendor_icon}")
                    field_count = 0
                    for item in vendor_data['items']:
                        if field_count >= 25:
                            embeds.append(embed)
                            embed = discord.Embed(title=f"{vendor_name}'s Inventory (cont.)", color=discord.Color.blue())
                            embed.set_thumbnail(url=f"https://www.bungie.net{vendor_icon}")
                            field_count = 0
                        item_details = await self.fetch_item_details(item['itemHash'])
                        if item_details:
                            item_name = item_details['displayProperties']['name']
                            item_icon = item_details['displayProperties']['icon']
                            item_icon_url = f"https://www.bungie.net{item_icon}"
                            embed.add_field(
                                name=item_name,
                                value=f"Quantity: {item['quantity']}\n[Icon]({item_icon_url})",
                                inline=False
                            )
                            field_count += 1
                    embeds.append(embed)
                for embed in embeds:
                    await interaction.followup.send(embed=embed)
            except KeyError as e:
                self.logger.error(f'Error processing vendors data: {e}')
                await interaction.followup.send("Error processing vendor data.")
        else:
            self.logger.error(f'Error fetching vendors data: {response.status_code} - {response.text}')
            await interaction.followup.send("Error fetching vendor data.")

    async def fetch_xur(self, interaction: discord.Interaction):
        await interaction.response.defer()  # Defer the interaction response

        headers = {
            "X-API-Key": self.api_key
        }
        url = "https://www.bungie.net/Platform/Destiny2/Vendors/?components=402"
        response = requests.get(url, headers=headers)
        if response.status_code == 200:
            data = response.json()
            self.logger.debug(f'Xur data: {data}')
            try:
                xur_info = data['Response']['sales']['data']['2190858386']
                embed = discord.Embed(title="Xur's Inventory", color=discord.Color.purple())
                embed.set_thumbnail(url="https://www.bungie.net/img/misc/xur.png")
                field_count = 0
                for item in xur_info['saleItems'].values():
                    if field_count >= 25:
                        await interaction.followup.send(embed=embed)
                        embed = discord.Embed(title="Xur's Inventory (cont.)", color=discord.Color.purple())
                        embed.set_thumbnail(url="https://www.bungie.net/img/misc/xur.png")
                        field_count = 0
                    item_details = await self.fetch_item_details(item['itemHash'])
                    if item_details:
                        item_name = item_details['displayProperties']['name']
                        item_icon = item_details['displayProperties']['icon']
                        item_icon_url = f"https://www.bungie.net{item_icon}"
                        embed.add_field(
                            name=item_name,
                            value=f"Quantity: {item['quantity']}\n[Icon]({item_icon_url})",
                            inline=False
                        )
                        field_count += 1
                await interaction.followup.send(embed=embed)
            except KeyError as e:
                self.logger.error(f'Error processing Xur data: {e}')
                await interaction.followup.send("Error processing Xur data.")
        else:
            self.logger.error(f'Error fetching Xur data: {response.status_code} - {response.text}')
            await interaction.followup.send("Error fetching Xur data.")

    def setup(self, tree):
        @app_commands.command(name='fetch_vendors', description='Fetch the current vendors')
        async def fetch_vendors_command(interaction: discord.Interaction):
            await self.fetch_vendors(interaction)

        @app_commands.command(name='fetch_xur', description='Fetch Xur\'s items')
        async def fetch_xur_command(interaction: discord.Interaction):
            await self.fetch_xur(interaction)

        tree.add_command(fetch_vendors_command)
        tree.add_command(fetch_xur_command)

    async def setup_hook(self):
        await self.bot.wait_until_ready()
        while not self.bot.is_closed():
            if datetime.utcnow().weekday() == 1:  # Check vendors every Tuesday
                await self.check_vendors()
            if datetime.utcnow().weekday() == 4:  # Check Xur every Friday
                await self.check_xur()
            await asyncio.sleep(86400)  # Check once every 24 hours

    async def check_vendors(self):
        headers = {
            "X-API-Key": self.api_key
        }
        url = "https://www.bungie.net/Platform/Destiny2/Vendors/"
        response = requests.get(url, headers=headers)
        if response.status_code == 200:
            data = response.json()
            self.logger.debug(f'Vendors data: {data}')
            try:
                vendors_info = data['Response']['vendors']
                embeds = []
                for vendor_hash, vendor_data in vendors_info.items():
                    vendor_name = vendor_data['vendorName']
                    vendor_icon = vendor_data['vendorIcon']
                    embed = discord.Embed(title=f"{vendor_name}'s Inventory", color=discord.Color.blue())
                    embed.set_thumbnail(url=f"https://www.bungie.net{vendor_icon}")
                    field_count = 0
                    for item in vendor_data['items']:
                        if field_count >= 25:
                            embeds.append(embed)
                            embed = discord.Embed(title=f"{vendor_name}'s Inventory (cont.)", color=discord.Color.blue())
                            embed.set_thumbnail(url=f"https://www.bungie.net{vendor_icon}")
                            field_count = 0
                        item_details = await self.fetch_item_details(item['itemHash'])
                        if item_details:
                            item_name = item_details['displayProperties']['name']
                            item_icon = item_details['displayProperties']['icon']
                            item_icon_url = f"https://www.bungie.net{item_icon}"
                            embed.add_field(
                                name=item_name,
                                value=f"Quantity: {item['quantity']}\n[Icon]({item_icon_url})",
                                inline=False
                            )
                            field_count += 1
                    embeds.append(embed)
                channel = self.bot.get_channel(config['CHANNEL_ID'])
                for embed in embeds:
                    await channel.send(embed=embed)
            except KeyError as e:
                self.logger.error(f'Error processing vendors data: {e}')
        else:
            self.logger.error(f'Error fetching vendors data: {response.status_code} - {response.text}')

    async def check_xur(self):
        headers = {
            "X-API-Key": self.api_key
        }
        url = "https://www.bungie.net/Platform/Destiny2/Vendors/?components=402"
        response = requests.get(url, headers=headers)
        if response.status_code == 200:
            data = response.json()
            self.logger.debug(f'Xur data: {data}')
            try:
                xur_info = data['Response']['sales']['data']['2190858386']
                embed = discord.Embed(title="Xur's Inventory", color=discord.Color.purple())
                embed.set_thumbnail(url="https://www.bungie.net/img/misc/xur.png")
                field_count = 0
                for item in xur_info['saleItems'].values():
                    if field_count >= 25:
                        await channel.send(embed=embed)
                        embed = discord.Embed(title="Xur's Inventory (cont.)", color=discord.Color.purple())
                        embed.set_thumbnail(url="https://www.bungie.net/img/misc/xur.png")
                        field_count = 0
                    item_details = await self.fetch_item_details(item['itemHash'])
                    if item_details:
                        item_name = item_details['displayProperties']['name']
                        item_icon = item_details['displayProperties']['icon']
                        item_icon_url = f"https://www.bungie.net{item_icon}"
                        embed.add_field(
                            name=item_name,
                            value=f"Quantity: {item['quantity']}\n[Icon]({item_icon_url})",
                            inline=False
                        )
                        field_count += 1
                channel = self.bot.get_channel(config['CHANNEL_ID'])
                await channel.send(embed=embed)
            except KeyError as e:
                self.logger.error(f'Error processing Xur data: {e}')
        else:
            self.logger.error(f'Error fetching Xur data: {response.status_code} - {response.text}')


def setup(bot):
    destiny2 = Destiny2(bot)
    bot.add_cog(destiny2)
    bot.setup_hook = destiny2.setup_hook