﻿using System;
using System.Collections.Generic;
using Oni.Imaging;

namespace Oni.Motoko
{
    internal class TextureDatWriter
    {
        private readonly Importer importer;

        public static void Write(Texture texture, string outputDirPath)
        {
            var writer = new DatWriter();
            Write(texture, writer);
            writer.Write(outputDirPath);
        }

        public static void Write(Texture texture, Importer importer)
        {
            var writer = new TextureDatWriter(importer);
            writer.Write(texture);
        }

        private TextureDatWriter(Importer importer)
        {
            this.importer = importer;
        }

        private void Write(Texture texture)
        {
            var txmp = importer.CreateInstance(TemplateTag.TXMP, texture.Name);
            int rawOffset = importer.RawWriter.Align32();
            var flags = texture.Flags;
            ImporterDescriptor envMapTxmp = null;

            if (texture.EnvMap != null)
            {
                envMapTxmp = importer.CreateInstance(TemplateTag.TXMP, texture.EnvMap.Name);
                flags |= TextureFlags.HasEnvMap;
            }

            if (texture.Surfaces.Count > 1)
            {
                flags |= TextureFlags.HasMipMaps;
            }

            using (var writer = txmp.OpenWrite(128))
            {
                writer.Write((int)flags);
                writer.WriteInt16(texture.Width);
                writer.WriteInt16(texture.Height);
                writer.Write((int)texture.Format);
                writer.Write(0);
                writer.Write(envMapTxmp);
                writer.Write(rawOffset);
                writer.Skip(12);
            }

            foreach (var surface in texture.Surfaces)
                importer.RawWriter.Write(surface.Data);
        }
    }
}
