/*
 * Copyright (c) Contributors, http://opensimulator.org/
 * See CONTRIBUTORS.TXT for a full list of copyright holders.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *     * Redistributions of source code must retain the above copyright
 *       notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above copyright
 *       notice, this list of conditions and the following disclaimer in the
 *       documentation and/or other materials provided with the distribution.
 *     * Neither the name of the OpenSim Project nor the
 *       names of its contributors may be used to endorse or promote products
 *       derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

using System;
using System.Collections.Generic;
using OpenMetaverse;

namespace OpenSim.Framework
{
    public class LandData
    {
        private Vector3 _AABBMax = new Vector3();
        private Vector3 _AABBMin = new Vector3();
        private int _area = 0;
        private uint _auctionID = 0; //Unemplemented. If set to 0, not being auctioned
        private UUID _authBuyerID = UUID.Zero; //Unemplemented. Authorized Buyer's UUID
        private Parcel.ParcelCategory _category = new Parcel.ParcelCategory(); //Unemplemented. Parcel's chosen category
        private int _claimDate = 0;
        private int _claimPrice = 0; //Unemplemented
        private UUID _globalID = UUID.Zero;
        private UUID _groupID = UUID.Zero; //Unemplemented
        private int _groupPrims = 0;
        private bool _isGroupOwned = false;
        private byte[] _bitmap = new byte[512];
        private string _description = String.Empty;


        private uint _flags = (uint) Parcel.ParcelFlags.AllowFly | (uint) Parcel.ParcelFlags.AllowLandmark |
                                (uint) Parcel.ParcelFlags.AllowAPrimitiveEntry |
                                (uint) Parcel.ParcelFlags.AllowDeedToGroup | (uint) Parcel.ParcelFlags.AllowTerraform |
                                (uint) Parcel.ParcelFlags.CreateObjects | (uint) Parcel.ParcelFlags.AllowOtherScripts |
                                (uint) Parcel.ParcelFlags.SoundLocal;

        private byte _landingType = 0;
        private string _name = "Your Parcel";
        private Parcel.ParcelStatus _status = Parcel.ParcelStatus.Leased;
        private int _localID = 0;
        private byte _mediaAutoScale = 0;
        private UUID _mediaID = UUID.Zero;

        private string _mediaURL = String.Empty;
        private string _musicURL = String.Empty;
        private int _otherPrims = 0;
        private UUID _ownerID = UUID.Zero;
        private int _ownerPrims = 0;
        private List<ParcelManager.ParcelAccessEntry> _parcelAccessList = new List<ParcelManager.ParcelAccessEntry>();
        private float _passHours = 0;
        private int _passPrice = 0;
        private int _salePrice = 0; //Unemeplemented. Parcels price.
        private int _selectedPrims = 0;
        private int _simwideArea = 0;
        private int _simwidePrims = 0;
        private UUID _snapshotID = UUID.Zero;
        private Vector3 _userLocation = new Vector3();
        private Vector3 _userLookAt = new Vector3();

        public Vector3 AABBMax {
            get {
                return _AABBMax;
            }
            set {
                _AABBMax = value;
            }
        }

        public Vector3 AABBMin {
            get {
                return _AABBMin;
            }
            set {
                _AABBMin = value;
            }
        }

        public int Area {
            get {
                return _area;
            }
            set {
                _area = value;
            }
        }

        public uint AuctionID {
            get {
                return _auctionID;
            }
            set {
                _auctionID = value;
            }
        }

        public UUID AuthBuyerID {
            get {
                return _authBuyerID;
            }
            set {
                _authBuyerID = value;
            }
        }

        public OpenMetaverse.Parcel.ParcelCategory Category {
            get {
                return _category;
            }
            set {
                _category = value;
            }
        }

        public int ClaimDate {
            get {
                return _claimDate;
            }
            set {
                _claimDate = value;
            }
        }

        public int ClaimPrice {
            get {
                return _claimPrice;
            }
            set {
                _claimPrice = value;
            }
        }

        public UUID GlobalID {
            get {
                return _globalID;
            }
            set {
                _globalID = value;
            }
        }

        public UUID GroupID {
            get {
                return _groupID;
            }
            set {
                _groupID = value;
            }
        }

        public int GroupPrims {
            get {
                return _groupPrims;
            }
            set {
                _groupPrims = value;
            }
        }

        public bool IsGroupOwned {
            get {
                return _isGroupOwned;
            }
            set {
                _isGroupOwned = value;
            }
        }

        public byte[] Bitmap {
            get {
                return _bitmap;
            }
            set {
                _bitmap = value;
            }
        }

        public string Description {
            get {
                return _description;
            }
            set {
                _description = value;
            }
        }

        public uint Flags {
            get {
                return _flags;
            }
            set {
                _flags = value;
            }
        }

        public byte LandingType {
            get {
                return _landingType;
            }
            set {
                _landingType = value;
            }
        }

        public string Name {
            get {
                return _name;
            }
            set {
                _name = value;
            }
        }

        public OpenMetaverse.Parcel.ParcelStatus Status {
            get {
                return _status;
            }
            set {
                _status = value;
            }
        }

        public int LocalID {
            get {
                return _localID;
            }
            set {
                _localID = value;
            }
        }

        public byte MediaAutoScale {
            get {
                return _mediaAutoScale;
            }
            set {
                _mediaAutoScale = value;
            }
        }

        public UUID MediaID {
            get {
                return _mediaID;
            }
            set {
                _mediaID = value;
            }
        }

        public string MediaURL {
            get {
                return _mediaURL;
            }
            set {
                _mediaURL = value;
            }
        }

        public string MusicURL {
            get {
                return _musicURL;
            }
            set {
                _musicURL = value;
            }
        }

        public int OtherPrims {
            get {
                return _otherPrims;
            }
            set {
                _otherPrims = value;
            }
        }

        public UUID OwnerID {
            get {
                return _ownerID;
            }
            set {
                _ownerID = value;
            }
        }

        public int OwnerPrims {
            get {
                return _ownerPrims;
            }
            set {
                _ownerPrims = value;
            }
        }

        public List<OpenMetaverse.ParcelManager.ParcelAccessEntry> ParcelAccessList {
            get {
                return _parcelAccessList;
            }
            set {
                _parcelAccessList = value;
            }
        }

        public float PassHours {
            get {
                return _passHours;
            }
            set {
                _passHours = value;
            }
        }

        public int PassPrice {
            get {
                return _passPrice;
            }
            set {
                _passPrice = value;
            }
        }

        public int SalePrice {
            get {
                return _salePrice;
            }
            set {
                _salePrice = value;
            }
        }

        public int SelectedPrims {
            get {
                return _selectedPrims;
            }
            set {
                _selectedPrims = value;
            }
        }

        public int SimwideArea {
            get {
                return _simwideArea;
            }
            set {
                _simwideArea = value;
            }
        }

        public int SimwidePrims {
            get {
                return _simwidePrims;
            }
            set {
                _simwidePrims = value;
            }
        }

        public UUID SnapshotID {
            get {
                return _snapshotID;
            }
            set {
                _snapshotID = value;
            }
        }

        public Vector3 UserLocation {
            get {
                return _userLocation;
            }
            set {
                _userLocation = value;
            }
        }

        public Vector3 UserLookAt {
            get {
                return _userLookAt;
            }
            set {
                _userLookAt = value;
            }
        }

        public LandData()
        {
            _globalID = UUID.Random();
        }

        public LandData Copy()
        {
            LandData landData = new LandData();

            landData._AABBMax = _AABBMax;
            landData._AABBMin = _AABBMin;
            landData._area = _area;
            landData._auctionID = _auctionID;
            landData._authBuyerID = _authBuyerID;
            landData._category = _category;
            landData._claimDate = _claimDate;
            landData._claimPrice = _claimPrice;
            landData._globalID = _globalID;
            landData._groupID = _groupID;
            landData._groupPrims = _groupPrims;
            landData._otherPrims = _otherPrims;
            landData._ownerPrims = _ownerPrims;
            landData._selectedPrims = _selectedPrims;
            landData._isGroupOwned = _isGroupOwned;
            landData._localID = _localID;
            landData._landingType = _landingType;
            landData._mediaAutoScale = _mediaAutoScale;
            landData._mediaID = _mediaID;
            landData._mediaURL = _mediaURL;
            landData._musicURL = _musicURL;
            landData._ownerID = _ownerID;
            landData._bitmap = (byte[]) _bitmap.Clone();
            landData._description = _description;
            landData._flags = _flags;
            landData._name = _name;
            landData._status = _status;
            landData._passHours = _passHours;
            landData._passPrice = _passPrice;
            landData._salePrice = _salePrice;
            landData._snapshotID = _snapshotID;
            landData._userLocation = _userLocation;
            landData._userLookAt = _userLookAt;

            landData._parcelAccessList.Clear();
            foreach (ParcelManager.ParcelAccessEntry entry in _parcelAccessList)
            {
                ParcelManager.ParcelAccessEntry newEntry = new ParcelManager.ParcelAccessEntry();
                newEntry.AgentID = entry.AgentID;
                newEntry.Flags = entry.Flags;
                newEntry.Time = entry.Time;

                landData._parcelAccessList.Add(newEntry);
            }

            return landData;
        }
    }
}