from panda3d.core import *
from direct.showbase import DirectObject
from direct.directnotify import DirectNotifyGlobal
from toontown.launcher import DownloadForceAcknowledge
import random
from toontown.toonbase import ToontownGlobals
from toontown.hood import ZoneUtil

class HoodMgr(DirectObject.DirectObject):
    notify = DirectNotifyGlobal.directNotify.newCategory('HoodMgr')
    ToontownCentralInitialDropPoints = ([-90.7,
      -60.0,
      0.025,
      102.575,
      0,
      0],
     [-91.4,
      -40.5,
      -3.948,
      125.763,
      0,
      0],
     [-107.8,
      -17.8,
      -1.937,
      149.456,
      0,
      0],
     [-108.7,
      12.8,
      -1.767,
      158.756,
      0,
      0],
     [-42.1,
      -22.8,
      -1.328,
      -248.1,
      0,
      0],
     [-35.2,
      -60.2,
      0.025,
      -265.639,
      0,
      0])
    ToontownCentralHQDropPoints = ([-43.5,
      42.6,
      -0.55,
      -100.454,
      0,
      0],
     [-53.0,
      12.5,
      -2.948,
      281.502,
      0,
      0],
     [-40.3,
      -18.5,
      -0.913,
      -56.674,
      0,
      0],
     [-1.9,
      -37.0,
      0.025,
      -23.43,
      0,
      0],
     [1.9,
      -5.9,
      4.0,
      -37.941,
      0,
      0])
    ToontownCentralTunnelDropPoints = ([-28.3,
      40.1,
      0.25,
      17.25,
      0,
      0],
     [-63.75,
      58.96,
      -0.5,
      -23.75,
      0,
      0],
     [-106.93,
      17.66,
      -2.2,
      99.0,
      0,
      0],
     [-116.0,
      -21.5,
      -0.038,
      50.0,
      0,
      0],
     [74.88,
      -115.0,
      2.53,
      -224.41,
      0,
      0],
     [30.488,
      -101.5,
      2.53,
      -179.23,
      0,
      0])
    dropPoints = {ToontownGlobals.DonaldsDock: ([-28.0,
                                    -2.5,
                                    5.8,
                                    120.0,
                                    0.0,
                                    0.0],
                                   [-22,
                                    13,
                                    5.8,
                                    155.6,
                                    0.0,
                                    0.0],
                                   [67,
                                    47,
                                    5.7,
                                    134.7,
                                    0.0,
                                    0.0],
                                   [62,
                                    19,
                                    5.7,
                                    97.0,
                                    0.0,
                                    0.0],
                                   [66,
                                    -27,
                                    5.7,
                                    80.5,
                                    0.0,
                                    0.0],
                                   [-114,
                                    -7,
                                    5.7,
                                    -97.0,
                                    -0.0,
                                    0.0],
                                   [-108,
                                    36,
                                    5.7,
                                    -153.8,
                                    -0.0,
                                    0.0],
                                   [-116,
                                    -46,
                                    5.7,
                                    -70.1,
                                    -0.0,
                                    0.0],
                                   [-63,
                                    -79,
                                    5.7,
                                    -41.2,
                                    -0.0,
                                    0.0],
                                   [-2,
                                    -79,
                                    5.7,
                                    57.4,
                                    -0.0,
                                    0.0],
                                   [-38,
                                    -78,
                                    5.7,
                                    9.1,
                                    -0.0,
                                    0.0]),
     ToontownGlobals.ToontownCentral: ([-60,
                                        -8,
                                        1.3,
                                        -90,
                                        0,
                                        0],
                                       [-66,
                                        -9,
                                        1.3,
                                        -274,
                                        0,
                                        0],
                                       [17,
                                        -28,
                                        4.1,
                                        -44,
                                        0,
                                        0],
                                       [87.7,
                                        -22,
                                        4,
                                        66,
                                        0,
                                        0],
                                       [-9.6,
                                        61.1,
                                        0,
                                        132,
                                        0,
                                        0],
                                       [-109.0,
                                        -2.5,
                                        -1.656,
                                        -90,
                                        0,
                                        0],
                                       [-35.4,
                                        -81.3,
                                        0.5,
                                        -4,
                                        0,
                                        0],
                                       [-103,
                                        72,
                                        0,
                                        -141,
                                        0,
                                        0],
                                       [93.5,
                                        -148.4,
                                        2.5,
                                        43,
                                        0,
                                        0],
                                       [25,
                                        123.4,
                                        2.55,
                                        272,
                                        0,
                                        0],
                                       [48,
                                        39,
                                        4,
                                        201,
                                        0,
                                        0],
                                       [-80,
                                        -61,
                                        0.1,
                                        -265,
                                        0,
                                        0],
                                       [-46.875,
                                        43.68,
                                        -1.05,
                                        124,
                                        0,
                                        0],
                                       [34,
                                        -105,
                                        2.55,
                                        45,
                                        0,
                                        0],
                                       [16,
                                        -75,
                                        2.55,
                                        56,
                                        0,
                                        0],
                                       [-27,
                                        -56,
                                        0.1,
                                        45,
                                        0,
                                        0],
                                       [100,
                                        27,
                                        4.1,
                                        150,
                                        0,
                                        0],
                                       [-70,
                                        4.6,
                                        -1.9,
                                        90,
                                        0,
                                        0],
                                       [-130.7,
                                        50,
                                        0.55,
                                        -111,
                                        0,
                                        0]),
     ToontownGlobals.TheBrrrgh: ([35,
                                  -32,
                                  6.2,
                                  138,
                                  0.0,
                                  0.0],
                                 [26,
                                  -105,
                                  6.2,
                                  -339,
                                  0.0,
                                  0.0],
                                 [-29,
                                  -139,
                                  6.2,
                                  -385,
                                  0.0,
                                  0.0],
                                 [-79,
                                  -123,
                                  6.2,
                                  -369,
                                  0.0,
                                  0.0],
                                 [-114,
                                  -86,
                                  3,
                                  -54,
                                  0.0,
                                  0.0],
                                 [-136,
                                  9,
                                  6.2,
                                  -125,
                                  0.0,
                                  0.0],
                                 [-75,
                                  92,
                                  6.2,
                                  -187,
                                  0.0,
                                  0.0],
                                 [-7,
                                  75,
                                  6.2,
                                  -187,
                                  0.0,
                                  0.0],
                                 [-106,
                                  -42,
                                  8.6,
                                  -111,
                                  0.0,
                                  0.0],
                                 [-116,
                                  -44,
                                  8.3,
                                  -20,
                                  0.0,
                                  0.0]),
     ToontownGlobals.MinniesMelodyland: ([86,
                                          44,
                                          -13.5,
                                          121.1,
                                          0.0,
                                          0.0],
                                         [88,
                                          -8,
                                          -13.5,
                                          91,
                                          0,
                                          0],
                                         [92,
                                          -76,
                                          -13.5,
                                          62.5,
                                          0.0,
                                          0.0],
                                         [53,
                                          -112,
                                          6.5,
                                          65.8,
                                          0.0,
                                          0.0],
                                         [-69,
                                          -71,
                                          6.5,
                                          -67.2,
                                          0.0,
                                          0.0],
                                         [-75,
                                          21,
                                          6.5,
                                          -100.9,
                                          0.0,
                                          0.0],
                                         [-21,
                                          72,
                                          6.5,
                                          -129.5,
                                          0.0,
                                          0.0],
                                         [56,
                                          72,
                                          6.5,
                                          138.2,
                                          0.0,
                                          0.0],
                                         [-41,
                                          47,
                                          6.5,
                                          -98.9,
                                          0.0,
                                          0.0]),
     ToontownGlobals.DaisyGardens: ([0,
                                     0,
                                     0,
                                     -10.5,
                                     0,
                                     0],
                                    [76,
                                     35,
                                     1.1,
                                     -30.2,
                                     0.0,
                                     0.0],
                                    [97,
                                     106,
                                     0.0,
                                     51.4,
                                     0.0,
                                     0.0],
                                    [51,
                                     180,
                                     10.0,
                                     22.6,
                                     0.0,
                                     0.0],
                                    [-14,
                                     203,
                                     10.0,
                                     85.6,
                                     0.0,
                                     0.0],
                                    [-58,
                                     158,
                                     10.0,
                                     -146.9,
                                     0.0,
                                     0.0],
                                    [-86,
                                     128,
                                     0.0,
                                     -178.9,
                                     0.0,
                                     0.0],
                                    [-64,
                                     65,
                                     0.0,
                                     17.7,
                                     0.0,
                                     0.0],
                                    [-13,
                                     39,
                                     0.0,
                                     -15.7,
                                     0.0,
                                     0.0],
                                    [-12,
                                     193,
                                     0.0,
                                     -112.4,
                                     0.0,
                                     0.0],
                                    [87,
                                     128,
                                     0.0,
                                     45.4,
                                     0.0,
                                     0.0]),
     ToontownGlobals.DonaldsDreamland: ([77,
                                         91,
                                         0.0,
                                         124.4,
                                         0.0,
                                         0.0],
                                        [29,
                                         92,
                                         0.0,
                                         -154.5,
                                         0.0,
                                         0.0],
                                        [-28,
                                         49,
                                         -16.4,
                                         -142.0,
                                         0.0,
                                         0.0],
                                        [21,
                                         40,
                                         -16.0,
                                         -65.1,
                                         0.0,
                                         0.0],
                                        [48,
                                         27,
                                         -15.4,
                                         -161.0,
                                         0.0,
                                         0.0],
                                        [-2,
                                         -22,
                                         -15.2,
                                         -132.1,
                                         0.0,
                                         0.0],
                                        [-92,
                                         -88,
                                         0.0,
                                         -116.3,
                                         0.0,
                                         0.0],
                                        [-56,
                                         -93,
                                         0.0,
                                         -21.5,
                                         0.0,
                                         0.0],
                                        [20,
                                         -88,
                                         0.0,
                                         -123.4,
                                         0.0,
                                         0.0],
                                        [76,
                                         -90,
                                         0.0,
                                         11.0,
                                         0.0,
                                         0.0]),
     ToontownGlobals.GoofySpeedway: ([-0.7,
                                      62,
                                      0.08,
                                      182,
                                      0,
                                      0],
                                     [-1,
                                      -30,
                                      0.06,
                                      183,
                                      0,
                                      0],
                                     [-13,
                                      -120,
                                      0,
                                      307,
                                      0,
                                      0],
                                     [16.4,
                                      -120,
                                      0,
                                      65,
                                      0,
                                      0],
                                     [-0.5,
                                      -90,
                                      0,
                                      182,
                                      0,
                                      0],
                                     [-30,
                                      -25,
                                      -0.373,
                                      326,
                                      0,
                                      0],
                                     [29,
                                      -17,
                                      -0.373,
                                      32,
                                      0,
                                      0]),
     ToontownGlobals.GolfZone: ([-49.6,
                                 102,
                                 0,
                                 162,
                                 0,
                                 0],
                                [-22.8,
                                 36.6,
                                 0,
                                 157.5,
                                 0,
                                 0],
                                [40,
                                 51,
                                 0,
                                 185,
                                 0,
                                 0],
                                [48.3,
                                 122.2,
                                 0,
                                 192,
                                 0,
                                 0],
                                [106.3,
                                 69.2,
                                 0,
                                 133,
                                 0,
                                 0],
                                [-81.5,
                                 47.2,
                                 0,
                                 183,
                                 0,
                                 0],
                                [-80.5,
                                 -84.2,
                                 0,
                                 284,
                                 0,
                                 0],
                                [73,
                                 -111,
                                 0,
                                 354,
                                 0,
                                 0]),
     ToontownGlobals.OutdoorZone: ([-165.8,
                                    108,
                                    0.025,
                                    252,
                                    0,
                                    0],
                                   [21,
                                    130,
                                    0.16,
                                    170,
                                    0,
                                    0],
                                   [93,
                                    78.5,
                                    0.23,
                                    112,
                                    0,
                                    0],
                                   [79,
                                    -1.6,
                                    0.75,
                                    163,
                                    0,
                                    0],
                                   [10,
                                    33,
                                    5.32,
                                    130.379,
                                    0,
                                    0],
                                   [-200,
                                    -42,
                                    0.025,
                                    317.543,
                                    0,
                                    0],
                                   [-21,
                                    -65,
                                    0.335,
                                    -18,
                                    0,
                                    0],
                                   [23,
                                    68.5,
                                    4.51,
                                    -22.808,
                                    0,
                                    0]),
     ToontownGlobals.Tutorial: ([130.9,
                                 -8.6,
                                 -1.3,
                                 105.5,
                                 0,
                                 0],),
     ToontownGlobals.SellbotHQ: ([64,
                                  -128,
                                  0.26,
                                  36,
                                  0,
                                  0],
                                 [9,
                                  -140,
                                  0.26,
                                  0,
                                  0,
                                  0],
                                 [-82,
                                  -112,
                                  0.26,
                                  -127,
                                  0,
                                  0],
                                 [-73,
                                  -213,
                                  0.26,
                                  -23,
                                  0,
                                  0],
                                 [-20,
                                  -243,
                                  0.26,
                                  -9,
                                  0,
                                  0],
                                 [79,
                                  -208,
                                  0.26,
                                  43,
                                  0,
                                  0]),
     ToontownGlobals.CashbotHQ: ([102,
                                  -437,
                                  -23.439,
                                  360,
                                  0,
                                  0],
                                 [124,
                                  -437,
                                  -23.439,
                                  360,
                                  0,
                                  0],
                                 [110,
                                  -446,
                                  -23.439,
                                  360,
                                  0,
                                  0],
                                 [132,
                                  -446,
                                  -23.439,
                                  360,
                                  0,
                                  0]),
     ToontownGlobals.LawbotHQ: ([77.5,
                                 129.13,
                                 -68.4,
                                 -166.6,
                                 0,
                                 0],
                                [-57.7,
                                 80.75,
                                 -68.4,
                                 -139.2,
                                 0,
                                 0],
                                [203.3,
                                 46.36,
                                 -68.4,
                                 -213.37,
                                 0,
                                 0],
                                [88.2,
                                 -336.52,
                                 -68.4,
                                 -720.4,
                                 0,
                                 0],
                                [232.77,
                                 -305.33,
                                 -68.4,
                                 -651,
                                 0,
                                 0],
                                [-20.16,
                                 -345.76,
                                 -68.4,
                                 -777.98,
                                 0,
                                 0])}
    hoodName2Id = {'dd': ToontownGlobals.DonaldsDock,
     'tt': ToontownGlobals.ToontownCentral,
     'br': ToontownGlobals.TheBrrrgh,
     'mm': ToontownGlobals.MinniesMelodyland,
     'dg': ToontownGlobals.DaisyGardens,
     'oz': ToontownGlobals.OutdoorZone,
     'ff': ToontownGlobals.FunnyFarm,
     'gs': ToontownGlobals.GoofySpeedway,
     'dl': ToontownGlobals.DonaldsDreamland,
     'bosshq': ToontownGlobals.BossbotHQ,
     'sellhq': ToontownGlobals.SellbotHQ,
     'cashhq': ToontownGlobals.CashbotHQ,
     'lawhq': ToontownGlobals.LawbotHQ,
     'gz': ToontownGlobals.GolfZone}
    hoodId2Name = {ToontownGlobals.DonaldsDock: 'dd',
     ToontownGlobals.ToontownCentral: 'tt',
     ToontownGlobals.Tutorial: 'tt',
     ToontownGlobals.TheBrrrgh: 'br',
     ToontownGlobals.MinniesMelodyland: 'mm',
     ToontownGlobals.DaisyGardens: 'dg',
     ToontownGlobals.OutdoorZone: 'oz',
     ToontownGlobals.FunnyFarm: 'ff',
     ToontownGlobals.GoofySpeedway: 'gs',
     ToontownGlobals.DonaldsDreamland: 'dl',
     ToontownGlobals.BossbotHQ: 'bosshq',
     ToontownGlobals.SellbotHQ: 'sellhq',
     ToontownGlobals.CashbotHQ: 'cashhq',
     ToontownGlobals.LawbotHQ: 'lawhq',
     ToontownGlobals.GolfZone: 'gz'}
    DefaultDropPoint = [0,
     0,
     0,
     0,
     0,
     0]
    dbgDropMode = 0
    currentDropPoint = 0

    def __init__(self, cr):
        self.cr = cr

    def getDropPoint(self, dropPointList):
        if self.dbgDropMode == 0:
            return random.choice(dropPointList)
        else:
            droppnt = self.currentDropPoint % len(dropPointList)
            self.currentDropPoint = (self.currentDropPoint + 1) % len(dropPointList)
            return dropPointList[droppnt]

    def getAvailableZones(self):
        if base.launcher == None:
            return self.getZonesInPhase(4) + self.getZonesInPhase(6) + self.getZonesInPhase(8) + self.getZonesInPhase(9) + self.getZonesInPhase(10) + self.getZonesInPhase(11) + self.getZonesInPhase(12) + self.getZonesInPhase(13)
        else:
            zones = []
            for phase in set(ToontownGlobals.phaseMap.values()):
                if base.launcher.getPhaseComplete(phase):
                    zones = zones + self.getZonesInPhase(phase)

            return zones
        return

    def getZonesInPhase(self, phase):
        p = []
        for i in list(ToontownGlobals.phaseMap.items()):
            if i[1] == phase:
                p.append(i[0])

        return p

    def getPhaseFromHood(self, hoodId):
        hoodId = ZoneUtil.getCanonicalHoodId(hoodId)
        return ToontownGlobals.phaseMap[hoodId]

    def getPlaygroundCenterFromId(self, hoodId):
        dropPointList = self.dropPoints.get(hoodId, None)
        if dropPointList:
            return self.getDropPoint(dropPointList)
        else:
            self.notify.warning('getPlaygroundCenterFromId: No such hood name as: ' + str(hoodId))
            return self.DefaultDropPoint
        return

    def getIdFromName(self, hoodName):
        id = self.hoodName2Id.get(hoodName)
        if id:
            return id
        else:
            self.notify.error('No such hood name as: %s' % hoodName)
            return None
        return None

    def getNameFromId(self, hoodId):
        name = self.hoodId2Name.get(hoodId)
        if name:
            return name
        else:
            self.notify.error('No such hood id as: %s' % hoodId)
            return None
        return None

    def getFullnameFromId(self, hoodId):
        hoodId = ZoneUtil.getCanonicalZoneId(hoodId)
        return ToontownGlobals.hoodNameMap[hoodId][-1]

    def addLinkTunnelHooks(self, hoodPart, nodeList, currentZoneId):
        tunnelOriginList = []
        for i in nodeList:
            linkTunnelNPC = i.findAllMatches('**/linktunnel*')
            for p in range(linkTunnelNPC.getNumPaths()):
                linkTunnel = linkTunnelNPC.getPath(p)
                name = linkTunnel.getName()
                nameParts = name.split('_')
                hoodStr = nameParts[1]
                zoneStr = nameParts[2]
                hoodId = self.getIdFromName(hoodStr)
                zoneId = int(zoneStr)
                hoodId = ZoneUtil.getTrueZoneId(hoodId, currentZoneId)
                zoneId = ZoneUtil.getTrueZoneId(zoneId, currentZoneId)
                linkSphere = linkTunnel.find('**/tunnel_trigger')
                if linkSphere.isEmpty():
                    linkSphere = linkTunnel.find('**/tunnel_sphere')
                if not linkSphere.isEmpty():
                    cnode = linkSphere.node()
                    cnode.setName('tunnel_trigger_' + hoodStr + '_' + zoneStr)
                    cnode.setCollideMask(ToontownGlobals.WallBitmask | ToontownGlobals.GhostBitmask)
                else:
                    linkSphere = linkTunnel.find('**/tunnel_trigger_' + hoodStr + '_' + zoneStr)
                    if linkSphere.isEmpty():
                        self.notify.error('tunnel_trigger not found')
                tunnelOrigin = linkTunnel.find('**/tunnel_origin')
                if tunnelOrigin.isEmpty():
                    self.notify.error('tunnel_origin not found')
                tunnelOriginPlaceHolder = render.attachNewNode('toph_' + hoodStr + '_' + zoneStr)
                tunnelOriginList.append(tunnelOriginPlaceHolder)
                tunnelOriginPlaceHolder.setPos(tunnelOrigin.getPos(render))
                tunnelOriginPlaceHolder.setHpr(tunnelOrigin.getHpr(render))
                hood = base.localAvatar.cr.playGame.hood
                if ZoneUtil.tutorialDict:
                    how = 'teleportIn'
                    tutorialFlag = 1
                else:
                    how = 'tunnelIn'
                    tutorialFlag = 0
                hoodPart.accept('enter' + linkSphere.getName(), hoodPart.handleEnterTunnel, [{'loader': ZoneUtil.getLoaderName(zoneId),
                  'where': ZoneUtil.getToonWhereName(zoneId),
                  'how': how,
                  'hoodId': hoodId,
                  'zoneId': zoneId,
                  'shardId': None,
                  'tunnelOrigin': tunnelOriginPlaceHolder,
                  'tutorial': tutorialFlag}])

        return tunnelOriginList

    def extractGroupName(self, groupFullName):
        return groupFullName.split(':', 1)[0]

    def makeLinkTunnelName(self, hoodId, currentZone):
        return '**/toph_' + self.getNameFromId(hoodId) + '_' + str(currentZone)