﻿using System;
using System.Collections.Generic;
using Oni.Akira;
using Oni.Motoko;
using Oni.Physics;

namespace Oni.Objects
{
    internal class TurretClass : GunkObjectClass
    {
        public string BaseName;
        public int Flags;
        public int FreeTime;
        public int ReloadTime;
        public int BarrelCount;
        public int RecoilAnimType;
        public int ReloadAnimType;
        public int MaxAmmo;
        public int AttachmentCount;
        public int ShooterCount;
        public float AimingSpeed;
        public Geometry BaseGeometry;
        public GunkFlags BaseGunkFlags;
        public Geometry TurretGeometry;
        public GunkFlags TurretGunkFlags;
        public Geometry BarrelGeometry;
        public GunkFlags BarrelGunkFlags;
        public Vector3 TurretPosition;
        public Vector3 BarrelPosition;

        public static TurretClass Read(InstanceDescriptor turr)
        {
            var klass = new TurretClass();

            InstanceDescriptor baseGeometryDescriptor;
            InstanceDescriptor turretGeometryDescriptor;
            InstanceDescriptor barrelGeometryDescriptor;

            using (var reader = turr.OpenRead())
            {
                klass.Name = reader.ReadString(32);
                klass.BaseName = reader.ReadString(32);
                klass.Flags = reader.ReadUInt16();
                klass.FreeTime = reader.ReadUInt16();
                klass.ReloadTime = reader.ReadUInt16();
                klass.BarrelCount = reader.ReadUInt16();
                klass.RecoilAnimType = reader.ReadUInt16();
                klass.ReloadAnimType = reader.ReadUInt16();
                klass.MaxAmmo = reader.ReadUInt16();
                klass.AttachmentCount = reader.ReadUInt16();
                klass.ShooterCount = reader.ReadUInt16();
                reader.Skip(2);
                klass.AimingSpeed = reader.ReadSingle();
                baseGeometryDescriptor = reader.ReadInstance();
                reader.Skip(4);
                klass.BaseGunkFlags = (GunkFlags)reader.ReadInt32();
                turretGeometryDescriptor = reader.ReadInstance();
                klass.TurretGunkFlags = (GunkFlags)reader.ReadInt32();
                barrelGeometryDescriptor = reader.ReadInstance();
                klass.BarrelGunkFlags = (GunkFlags)reader.ReadInt32();
                klass.TurretPosition = reader.ReadVector3();
                klass.BarrelPosition = reader.ReadVector3();
            }

            if (baseGeometryDescriptor != null)
                klass.BaseGeometry = GeometryDatReader.Read(baseGeometryDescriptor);

            if (barrelGeometryDescriptor != null)
                klass.BarrelGeometry = GeometryDatReader.Read(barrelGeometryDescriptor);

            if (turretGeometryDescriptor != null)
                klass.TurretGeometry = GeometryDatReader.Read(turretGeometryDescriptor);

            return klass;
        }

        public override ObjectGeometry[] GunkNodes
        {
            get
            {
                return new[] {
                    new ObjectGeometry {
                        Geometry = BaseGeometry,
                        Flags = BaseGunkFlags
                    }
                };
            }
        }
    }
}
