using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Indy.IL2CPU.Assembler.X86.X {
    public class MemoryAction {
        protected string mValue;
        public bool IsRegister = false;

        public override string ToString() {
            return mValue;
        }

        public static implicit operator MemoryAction(UInt32 aValue) {
            return new MemoryAction(aValue);
        }

        public static implicit operator MemoryAction(Register aRegister) {
            return new MemoryAction(aRegister.ToString(), true);
        }

        public static MemoryAction operator ++(MemoryAction aTarget) {
            new X86.Inc(SizeToString(aTarget.mSize), aTarget.ToString());
            return null;
        }

        public static MemoryAction operator --(MemoryAction aTarget) {
            new X86.Dec(SizeToString(aTarget.mSize), aTarget.ToString());
            return null;
        }

        protected byte mSize = 0;

        // For registers
        public MemoryAction(string aValue, bool aIsRegister) {
            mValue = aValue;
            IsRegister = aIsRegister;
        }
        // This form used for reading memory - Addresses are passed in
        public MemoryAction(string aValue) {
            mValue = aValue;
        }
        public MemoryAction(string aValue, byte aSize) {
            mValue = aValue;
            mSize = aSize;
        }

        // For constants/literals
        public MemoryAction(UInt32 aValue) {
            mValue = aValue.ToString();
        }

        public static string SizeToString(byte aSize) {
            switch (aSize) {
                case 8:
                    return "byte";
                case 16:
                    return "word";
                case 32:
                    return "dword";
                case 64:
                    return "qword";
                default:
                    throw new Exception("Invalid size: " + aSize);
            }
        }

        //TODO: Put memory compare here - will later have to limit it to the size
        // variant and if possible to self usage, ie no assignments. May however result 
        // in too many class variants to be worth while.
        public void Compare(UInt32 aValue) {
            new Compare(SizeToString(mSize), ToString(), aValue);
        }

    }
}
