﻿using System;

namespace Oni.Particles
{
    internal class Emitter
    {
        #region Private data
        private string particleClass;
        private EmitterFlags flags;
        private int turnOffTreshold;
        private int probability;
        private float copies;
        private int linkTo;
        private EmitterRate rate;
        private EmitterPosition position;
        private EmitterDirection direction;
        private EmitterSpeed speed;
        private EmitterOrientation orientationDir;
        private EmitterOrientation orientationUp;
        private Value[] parameters;
        #endregion

        public Emitter()
        {
            parameters = new Value[12];
        }

        public Emitter(BinaryReader reader)
        {
            particleClass = reader.ReadString(64);
            reader.Skip(4);
            flags = (EmitterFlags)reader.ReadInt32();
            turnOffTreshold = reader.ReadInt16();
            probability = reader.ReadUInt16();
            copies = reader.ReadSingle();
            linkTo = reader.ReadInt32();
            rate = (EmitterRate)reader.ReadInt32();
            position = (EmitterPosition)reader.ReadInt32();
            direction = (EmitterDirection)reader.ReadInt32();
            speed = (EmitterSpeed)reader.ReadInt32();
            orientationDir = (EmitterOrientation)reader.ReadInt32();
            orientationUp = (EmitterOrientation)reader.ReadInt32();

            parameters = new Value[12];

            for (int i = 0; i < parameters.Length; i++)
                parameters[i] = Value.Read(reader);
        }

        public void Write(BinaryWriter writer)
        {
            writer.Write(particleClass, 64);
            writer.Skip(4);
            writer.Write((int)flags);
            writer.WriteInt16(turnOffTreshold);
            writer.WriteUInt16(probability);
            writer.Write(copies);
            writer.Write(linkTo);
            writer.Write((int)rate);
            writer.Write((int)position);
            writer.Write((int)direction);
            writer.Write((int)speed);
            writer.Write((int)orientationDir);
            writer.Write((int)orientationUp);

            for (int i = 0; i < parameters.Length; i++)
            {
                if (parameters[i] != null)
                    parameters[i].Write(writer);
                else
                    Value.Empty.Write(writer);
            }
        }

        public EmitterFlags Flags
        {
            get { return flags; }
            set { flags = value; }
        }

        public int Probability
        {
            get { return probability; }
            set { probability = value; }
        }

        public int TurnOffTreshold
        {
            get { return turnOffTreshold; }
            set { turnOffTreshold = value; }
        }

        public int LinkTo
        {
            get { return linkTo; }
            set { linkTo = value; }
        }

        public string ParticleClass
        {
            get { return particleClass; }
            set { particleClass = value; }
        }

        public float Copies
        {
            get { return copies; }
            set { copies = value; }
        }

        public EmitterRate Rate
        {
            get { return rate; }
            set { rate = value; }
        }

        public EmitterPosition Position
        {
            get { return position; }
            set { position = value; }
        }

        public EmitterDirection Direction
        {
            get { return direction; }
            set { direction = value; }
        }

        public EmitterSpeed Speed
        {
            get { return speed; }
            set { speed = value; }
        }

        public EmitterOrientation OrientationDir
        {
            get { return orientationDir; }
            set { orientationDir = value; }
        }

        public EmitterOrientation OrientationUp
        {
            get { return orientationUp; }
            set { orientationUp = value; }
        }

        public Value[] Parameters => parameters;
    }
}
