//------------------------------------------------------------------------------
//   Copyright (c) Microsoft Corporation. All Rights Reserved.
//------------------------------------------------------------------------------

namespace Microsoft.VisualStudio.WebHost
{
    using System;
    using System.Collections;
    using System.Text;

    internal sealed class ByteString {
        private byte[] _bytes;
        private int _offset;
        private int _length;

        public ByteString(byte[] bytes, int offset, int length) {
            _bytes = bytes;
            _offset = offset;
            _length = length;
        }

        public byte[] Bytes { 
            get { 
                return _bytes; 
            } 
        }

        public bool IsEmpty { 
            get { 
                return (_bytes == null || _length == 0); 
            }  
        }

        public int Length { 
            get {
                return _length; 
            } 
        }

        public int Offset { 
            get { 
                return _offset; 
            } 
        }

        public byte this[int index] {
            get {
                return _bytes[_offset+index];
            }
        }

        public String GetString() {
            return GetString(Encoding.UTF8);
        }

        public String GetString(Encoding enc) {
            if (IsEmpty) {
                return String.Empty;
            }
            return enc.GetString(_bytes, _offset, _length);
        }

        public byte[] GetBytes() {
            byte[] bytes = new byte[_length];
            if (_length > 0) {
                Buffer.BlockCopy(_bytes, _offset, bytes, 0, _length);
            }
            return bytes;
        }

        public int IndexOf(char ch) {
            return IndexOf(ch, 0);
        }

        public int IndexOf(char ch, int offset) {
            for (int i = offset; i < _length; i++) {
                if (this[i] == (byte)ch) {
                    return i;
                }
            }

            return -1;
        }

        public ByteString Substring(int offset) {
            return Substring(offset, _length-offset);
        }

        public ByteString Substring(int offset, int len) {
            return new ByteString(_bytes, _offset+offset, len);
        }

        public ByteString[] Split(char sep) {
            ArrayList list = new ArrayList();

            int pos = 0;
            while (pos < _length) {
                int i = IndexOf(sep, pos);
                if (i < 0) {
                    break;
                }

                list.Add(Substring(pos, i-pos));
                pos = i+1;

                while (this[pos] == (byte)sep && pos < _length) {
                    pos++;
                }
            }

            if (pos < _length) {
                list.Add(Substring(pos));
            }

            int n = list.Count;
            ByteString[] result = new ByteString[n];
            
            for (int i = 0; i < n; i++) {
                result[i] = (ByteString)list[i];
            }

            return result;
        }
    }
}
