from pandac.PandaModules import *
from direct.gui.DirectGui import *
from pandac.PandaModules import *
from direct.showbase import DirectObject
from toontown.friends import FriendHandle
from otp.avatar import Avatar
from direct.distributed import DistributedObject
from direct.directnotify import DirectNotifyGlobal
from toontown.toonbase import ToontownGlobals
from toontown.toonbase import TTLocalizer
from toontown.friends import ToontownFriendSecret
import ToonAvatarDetailPanel
import AvatarPanelBase
import PlayerDetailPanel
from otp.otpbase import OTPGlobals
GAME_LOGO_NAMES = {'Default': 'GameLogo_Toontown'}
GAME_LOGO_FILE = 'phase_3/models/misc/game_logo_card'

class PlayerInfoPanel(AvatarPanelBase.AvatarPanelBase):
    notify = DirectNotifyGlobal.directNotify.newCategory('PlayerInfoPanel')

    def __init__(self, playerId):
        from toontown.friends import FriendsListPanel
        AvatarPanelBase.AvatarPanelBase.__init__(self, None, FriendsListPanel=FriendsListPanel)
        self.setup(playerId)
        self.avId = 0
        self.avName = None
        return

    def setup(self, playerId):
        from toontown.friends import FriendsListPanel
        self.playerId = playerId
        self.playerInfo = base.cr.playerFriendsManager.playerId2Info.get(playerId)
        if not self.playerInfo:
            return
        avId = None
        avatar = None
        if playerId:
            if self.playerInfo.onlineYesNo:
                avId = self.playerInfo.avatarId
                avatar = base.cr.playerFriendsManager.identifyFriend(avId)
        self.notify.debug('Opening player panel, %s' % self.playerInfo)
        self.avatar = avatar
        self.noAv = 0
        if not avatar:
            self.noAv = 1
        self.accountText = None
        self.listName = ' '
        world = self.playerInfo.location
        if self.playerInfo.onlineYesNo == 0:
            world = TTLocalizer.AvatarDetailPanelRealLife
        self.accountText = self.playerInfo.playerName
        if self.noAv:
            avButtonState = DGG.DISABLED
        else:
            avButtonState = DGG.NORMAL
        self.online = self.playerInfo.onlineYesNo
        if self.online:
            onlineButtonState = DGG.NORMAL
        else:
            onlineButtonState = DGG.DISABLED
        base.localAvatar.obscureFriendsListButton(1)
        gui = loader.loadModel('phase_3.5/models/gui/avatar_panel_gui')
        self.frame = DirectFrame(
            image=gui.find('**/avatar_panel'),
            relief=None,
            pos=(1.1, 100, 0.525))
        disabledImageColor = Vec4(1, 1, 1, 0.4)
        text0Color = Vec4(1, 1, 1, 1)
        text1Color = Vec4(0.5, 1, 0.5, 1)
        text2Color = Vec4(1, 1, 0.5, 1)
        text3Color = Vec4(0.6, 0.6, 0.6, 1)
        if self.playerInfo:
            logoImageName = GAME_LOGO_NAMES['Default']
            if not self.playerInfo.onlineYesNo:
                logoImageName = GAME_LOGO_NAMES['Default']
            elif self.playerInfo.location in GAME_LOGO_NAMES:
                logoImageName = GAME_LOGO_NAMES[self.playerInfo.location]
            model = loader.loadModel(GAME_LOGO_FILE)
            logoImage = model.find('**/' + logoImageName)
            del model
            self.outsideLogo = DirectLabel(
                parent=self.frame,
                relief=None,
                image=logoImage,
                pos=(0.0125, 0.0, 0.25),
                image_color=(1.0, 1.0, 1.0, 1),
                scale=(0.175, 1, 0.175))
        font = ToontownGlobals.getInterfaceFont()
        textScale = 0.047
        textWrap = 7.5
        textAlign = TextNode.ACenter
        textPos = (0, 0)
        self.nameLabel = DirectLabel(
            parent=self.frame,
            pos=(0.0125, 0, 0.385),
            relief=None,
            text=self.listName,
            text_font=font,
            text_fg=Vec4(0, 0, 0, 1),
            text_pos=textPos,
            text_scale=textScale,
            text_wordwrap=textWrap,
            text_align=textAlign,
            text_shadow=(1, 1, 1, 1))
        if self.accountText:
            self.accountLabel = DirectLabel(
                parent=self.frame,
                pos=(0.0125, 0, 0.385),
                text=self.accountText,
                relief=None,
                text_font=font,
                text_fg=Vec4(0, 0, 0, 1),
                text_pos=textPos,
                text_scale=textScale,
                text_wordwrap=textWrap,
                text_align=textAlign,
                text_shadow=(1, 1, 1, 1))
            self.accountLabel.show()
        self.closeButton = DirectButton(
            parent=self.frame,
            image=(
                gui.find('**/CloseBtn_UP'),
                gui.find('**/CloseBtn_DN'),
                gui.find('**/CloseBtn_Rllvr'),
                gui.find('**/CloseBtn_UP')),
            relief=None,
            pos=(0.157644, 0, -0.379167),
            command=self.__handleClose)
        self.friendButton = DirectButton(
            parent=self.frame,
            image=(
                gui.find('**/Frnds_Btn_UP'),
                gui.find('**/Frnds_Btn_DN'),
                gui.find('**/Frnds_Btn_RLVR'),
                gui.find('**/Frnds_Btn_UP')),
            image3_color=disabledImageColor,
            image_scale=0.9,
            relief=None,
            text=TTLocalizer.AvatarPanelFriends,
            text_scale=0.06,
            pos=(-0.103, 0, 0.133),
            text0_fg=text0Color,
            text1_fg=text1Color,
            text2_fg=text2Color,
            text3_fg=text3Color,
            text_pos=(0.06, -0.02),
            text_align=TextNode.ALeft,
            state=avButtonState,
            command=self.__handleFriend)
        self.friendButton['state'] = DGG.DISABLED
        self.goToButton = DirectButton(
            parent=self.frame,
            image=(
                gui.find('**/Go2_Btn_UP'),
                gui.find('**/Go2_Btn_DN'),
                gui.find('**/Go2_Btn_RLVR'),
                gui.find('**/Go2_Btn_UP')),
            image3_color=disabledImageColor,
            image_scale=0.9,
            relief=None,
            pos=(-0.103, 0, 0.045),
            text=TTLocalizer.AvatarPanelGoTo,
            text0_fg=text0Color,
            text1_fg=text1Color,
            text2_fg=text2Color,
            text3_fg=text3Color,
            text_scale=0.06,
            text_pos=(0.06, -0.015),
            text_align=TextNode.ALeft,
            state=avButtonState,
            command=self.__handleGoto)
        self.goToButton['state'] = DGG.DISABLED
        self.whisperButton = DirectButton(
            parent=self.frame,
            image=(
                gui.find('**/ChtBx_ChtBtn_UP'),
                gui.find('**/ChtBx_ChtBtn_DN'),
                gui.find('**/ChtBx_ChtBtn_RLVR'),
                gui.find('**/ChtBx_ChtBtn_UP')),
            image3_color=disabledImageColor,
            relief=None,
            image_scale=0.9,
            pos=(-0.103, 0, -0.0375),
            text=TTLocalizer.AvatarPanelWhisper,
            text0_fg=text0Color,
            text1_fg=text1Color,
            text2_fg=text2Color,
            text3_fg=text3Color,
            text_scale=TTLocalizer.PIPwisperButton,
            text_pos=(0.06, -0.0125),
            text_align=TextNode.ALeft,
            state=onlineButtonState,
            command=self.__handleWhisper)
        self.secretsButton = DirectButton(
            parent=self.frame,
            image=(
                gui.find('**/ChtBx_ChtBtn_UP'),
                gui.find('**/ChtBx_ChtBtn_DN'),
                gui.find('**/ChtBx_ChtBtn_RLVR'),
                gui.find('**/ChtBx_ChtBtn_UP')),
            image3_color=disabledImageColor,
            image_scale=0.9,
            relief=None,
            pos=(-0.103, 0, -0.13),
            text=TTLocalizer.AvatarPanelSecrets,
            text0_fg=text0Color,
            text1_fg=text1Color,
            text2_fg=text2Color,
            text3_fg=text3Color,
            text_scale=TTLocalizer.PIPsecretsButton,
            text_pos=(0.055, -0.01),
            text_align=TextNode.ALeft,
            state=avButtonState,
            command=self.__handleSecrets)
        self.secretsButton['state'] = DGG.DISABLED
        if not base.localAvatar.isTeleportAllowed():
            self.goToButton['state'] = DGG.DISABLED
        ignoreStr, ignoreCmd, ignoreSize = self.getIgnoreButtonInfo()
        self.ignoreButton = DirectButton(
            parent=self.frame,
            image=(
                gui.find('**/Ignore_Btn_UP'),
                gui.find('**/Ignore_Btn_DN'),
                gui.find('**/Ignore_Btn_RLVR'),
                gui.find('**/Ignore_Btn_UP')),
            image3_color=disabledImageColor,
            image_scale=0.9,
            relief=None,
            pos=(-0.103697, 0, -0.21),
            text=ignoreStr,
            text0_fg=text0Color,
            text1_fg=text1Color,
            text2_fg=text2Color,
            text3_fg=text3Color,
            text_scale=ignoreSize,
            text_pos=(0.06, -0.015),
            text_align=TextNode.ALeft,
            state=avButtonState,
            command=ignoreCmd)
        if base.cr.productName not in ['JP', 'DE', 'BR', 'FR']:
            self.reportButton = DirectButton(
                parent=self.frame,
                image=(
                    gui.find('**/report_BtnUP'),
                    gui.find('**/report_BtnDN'),
                    gui.find('**/report_BtnRLVR'),
                    gui.find('**/report_BtnUP')),
                image3_color=disabledImageColor,
                image_scale=0.65,
                relief=None,
                pos=(-0.103, 0, -0.29738),
                text=TTLocalizer.AvatarPanelReport,
                text0_fg=text0Color,
                text1_fg=text1Color,
                text2_fg=text2Color,
                text3_fg=text3Color,
                text_scale=0.06,
                text_pos=(0.06, -0.015),
                text_align=TextNode.ALeft,
                command=self.handleReport)
        self.detailButton = DirectButton(
            parent=self.frame,
            image=(
                gui.find('**/ChtBx_BackBtn_UP'),
                gui.find('**/ChtBx_BackBtn_DN'),
                gui.find('**/ChtBx_BackBtn_Rllvr'),
                gui.find('**/ChtBx_BackBtn_UP')),
            relief=None,
            text=('', TTLocalizer.PlayerPanelDetail,
                  TTLocalizer.PlayerPanelDetail, ''),
            text_fg=text2Color,
            text_shadow=(0, 0, 0, 1),
            text_scale=TTLocalizer.PIPdetailButton,
            text_pos=(0.085, 0.055),
            text_align=TextNode.ACenter,
            pos=(-0.133773, 0, -0.387132),
            state=DGG.NORMAL,
            command=self.__handleDetails)
        gui.removeNode()
        menuX = -0.05
        menuScale = 0.064
        self.frame.show()
        messenger.send('avPanelDone')
        self.accept('playerOnline', self.__handlePlayerChanged)
        self.accept('playerOffline', self.__handlePlayerChanged)
        self.accept(OTPGlobals.PlayerFriendUpdateEvent, self.__handlePlayerChanged)
        self.accept(OTPGlobals.PlayerFriendRemoveEvent, self.__handlePlayerUnfriend)
        return

    def disableAll(self):
        self.detailButton['state'] = DGG.DISABLED
        self.ignoreButton['state'] = DGG.DISABLED
        if base.cr.productName not in ['JP',
         'DE',
         'BR',
         'FR']:
            self.reportButton['state'] = DGG.DISABLED
        self.goToButton['state'] = DGG.DISABLED
        self.secretsButton['state'] = DGG.DISABLED
        self.whisperButton['state'] = DGG.DISABLED
        self.friendButton['state'] = DGG.DISABLED
        self.closeButton['state'] = DGG.DISABLED

    def cleanup(self):
        self.unsetup()
        self.ignore('playerOnline')
        self.ignore('playerOffline')
        self.ignore(OTPGlobals.PlayerFriendUpdateEvent)
        self.ignore(OTPGlobals.PlayerFriendRemoveEvent)
        AvatarPanelBase.AvatarPanelBase.cleanup(self)

    def unsetup(self):
        if not hasattr(self, 'frame') or self.frame == None:
            return
        PlayerDetailPanel.unloadPlayerDetail()
        self.frame.destroy()
        del self.frame
        self.frame = None
        base.localAvatar.obscureFriendsListButton(-1)
        self.laffMeter = None
        self.ignore('updateLaffMeter')
        if hasattr(self.avatar, 'bFake') and self.avatar.bFake:
            self.avatar.delete()
        return

    def __handleGoto(self):
        if base.localAvatar.isTeleportAllowed():
            base.localAvatar.chatMgr.noWhisper()
            messenger.send('gotoAvatar', [self.avId, self.avName, self.avDisableName])

    def __handleWhisper(self):
        if self.noAv:
            base.localAvatar.chatMgr.whisperTo(self.listName, 0, self.playerId)
        else:
            base.localAvatar.chatMgr.whisperTo(self.avName, self.avId, self.playerId)

    def __handleSecrets(self):
        base.localAvatar.chatMgr.noWhisper()
        ToontownFriendSecret.showFriendSecret(ToontownFriendSecret.BothSecrets)

    def __handleFriend(self):
        base.localAvatar.chatMgr.noWhisper()
        self.__getAvInfo()
        messenger.send('friendAvatar', [self.avId, self.avName, self.avDisableName])

    def __getAvInfo(self):
        if self.playerId:
            self.avId = self.playerInfo.avatarId
            if self.avId:
                avatar = base.cr.playerFriendsManager.identifyFriend(self.avId)
                if avatar:
                    self.avName = avatar.getName()
                    if not self.avDisableName:
                        self.avDisableName = avatar.uniqueName('disable')

    def __handleDetails(self):
        base.localAvatar.chatMgr.noWhisper()
        self.__getAvInfo()
        messenger.send('playerDetails', [self.avId, self.avName, self.playerId])

    def handleDisableAvatar(self):
        pass

    def __handlePlayerChanged(self, playerId, info = None):
        if playerId == self.playerId:
            self.unsetup()
            self.setup(playerId)

    def __handlePlayerUnfriend(self, playerId):
        if playerId == self.playerId:
            self.__handleClose()

    def __handleClose(self):
        self.cleanup()
        AvatarPanelBase.currentAvatarPanel = None
        if self.friendsListShown:
            self.FriendsListPanel.showFriendsList()
        return

    def getAvId(self):
        if hasattr(self, 'avatar'):
            if self.avatar:
                return self.avatar.doId
        return None

    def getPlayerId(self):
        if hasattr(self, 'playerId'):
            return self.playerId
        return None

    def isHidden(self):
        if not hasattr(self, 'frame') or not self.frame:
            return 1
        return self.frame.isHidden()

    def getType(self):
        return 'player'