using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Collections.Generic;

namespace SilverlightGame
{
    public class CollisionManager
    {
        protected static CollisionManager instance = null;
        protected Dictionary<string, List<string>> collisionMap = new Dictionary<string, List<string>>();

        public static CollisionManager Instance
        {
            get
            {
                if (instance == null)
                    instance = new CollisionManager();
                return instance;
            }
        }

        protected CollisionManager()
        {

        }

        public void addCollisionMapping(string type1, string type2)
        {
            if (!collisionMap.ContainsKey(type1))
                collisionMap.Add(type1, new List<string>());
            if (!collisionMap.ContainsKey(type2))
                collisionMap.Add(type2, new List<string>());

            if (!collisionMap[type1].Contains(type2))
                collisionMap[type1].Add(type2);
            if (!collisionMap[type2].Contains(type1))
                collisionMap[type2].Add(type1);
            
        }

        public void enterFrame(double dt)
        {
            for (int i = 0; i < GameObject.gameObjects.Count; ++i)
            {
                GameObject gameObjectI = GameObject.gameObjects[i];
                            
                for (int j = i + 1; j < GameObject.gameObjects.Count; ++j)
                {
                    GameObject gameObjectJ = GameObject.gameObjects[j];
                    
                    // early out for non-colliders
                    bool collisionNameNotNothing = gameObjectI.CollisionName != CollisionIdentifiers.NONE &&
                        gameObjectJ.CollisionName != CollisionIdentifiers.NONE;
                    // objects can still exist in the baseObjects collection after being disposed, so check
                    bool bothInUse = gameObjectI.InUse && gameObjectJ.InUse;
                    // make sure we have an entry in the collisionMap
                    bool collisionMapEntryExists = collisionMap.ContainsKey(gameObjectI.CollisionName);
                    // make sure the two objects are set to collide
                    bool testForCollision = collisionMapEntryExists && collisionMap[gameObjectI.CollisionName].Contains(gameObjectJ.CollisionName);
                    
                    if ( collisionNameNotNothing &&                    
                         bothInUse &&        
                         collisionMapEntryExists &&
                         testForCollision)
                    {
                        if (MathUtil.RectIntersect(gameObjectI.Rect, gameObjectJ.Rect))
                        {
                            gameObjectI.collision(gameObjectJ);
                            gameObjectJ.collision(gameObjectI);
                        }
                    }                    
                }
            }
        }
        

    }
}