using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.VisualBasic;
using System.Windows.Forms;

namespace HaloMap
{
    public class Tag
    {
        public string Class, Path;
        public int Ident, Offset, Size, IndexOffset;
    }

    public class Tags
    {
        public void Read(Map map, TreeView tv)
        {
            map.br.BaseStream.Position = map.Index.TagStart;
            for (int i = 0; i < map.Index.TagCount; i++)
            {
                Tag t = new Tag();
                t.IndexOffset = (int)map.br.BaseStream.Position;
                t.Class = Strings.StrReverse(new string(map.br.ReadChars(4)));
                t.Ident = map.br.ReadInt32();
                t.Offset = map.br.ReadInt32() - map.Index.SecondaryMagic;
                t.Size = map.br.ReadInt32();
                map.Tags.Add(t);
            }

            map.br.BaseStream.Position = map.Header.FileTableOffset;
            for (int i = 0; i < map.Index.TagCount; i++)
            {
                char c;
                while ((c = map.br.ReadChar()) != '\0')
                    map.Tags[i].Path += c;
            }

            //Form the tree nodes
            if (tv == null)
                return;
            List<string> Classes = new List<string>();
            for (int i = 0; i < map.Index.TagCount; i++)
            {
                if (Classes.Contains(map.Tags[i].Class) == false)
                {
                    Classes.Add(map.Tags[i].Class);
                    TreeNode n = new TreeNode(map.Tags[i].Class);
                    for (int x = 0; x < map.Index.TagCount; x++)
                    {
                        if (map.Tags[x].Class == n.Text)
                        {
                            n.Nodes.Add(map.Tags[x].Path);
                            n.Nodes[n.Nodes.Count - 1].Tag = x;
                        }
                    }
                    tv.Nodes.Add(n);
                }
            }
            tv.Sort();
        }

        public Tag FindTag(Map map, string Class, string Path)
        {
            for (int i = 0; i < map.Index.TagCount; i++)
            {
                if (map.Tags[i].Class == Class && map.Tags[i].Path == Path)
                {
                    return map.Tags[i];
                }
            }
            return null;
        }
    }
}
