using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

namespace Kav
{
    public class MeshPart : IIndexDrawable, IGBufferDrawable, ICullable, IHasVertexPositions
    {
        public IndexBuffer IndexBuffer { get; }
        public VertexBuffer VertexBuffer { get; }
        public Triangle[] Triangles { get; }
        public Vector3[] Positions { get; }

        public BoundingBox BoundingBox { get; }

        private Texture2D albedoTexture = null;
        private Texture2D normalTexture = null;
        private Texture2D metallicRoughnessTexture = null;

        public Texture2D AlbedoTexture
        {
            get { return DisableAlbedoMap ? null : albedoTexture; }
            set { albedoTexture = value; }
        }

        public Texture2D NormalTexture
        {
            get { return DisableNormalMap ? null : normalTexture; }
            set { normalTexture = value; }
        }

        public Texture2D MetallicRoughnessTexture
        {
            get { return DisableMetallicRoughnessMap ? null : metallicRoughnessTexture; }
            set { metallicRoughnessTexture = value; }
        }

        public Vector3 Albedo { get; set; } = Vector3.One;
        public float Metallic { get; set; } = 0.5f;
        public float Roughness { get; set; } = 0.5f;

        public int NumTextureRows { get; set; } = 1;
        public int NumTextureColumns { get; set; } = 1;

        public bool DisableAlbedoMap { get; set; } = false;
        public bool DisableNormalMap { get; set; } = false;
        public bool DisableMetallicRoughnessMap { get; set; } = false;

        public MeshPart(
            VertexBuffer vertexBuffer,
            IndexBuffer indexBuffer,
            Vector3[] positions,
            Triangle[] triangles
        ) {
            VertexBuffer = vertexBuffer;
            IndexBuffer = indexBuffer;
            Positions = positions;
            Triangles = triangles;

            BoundingBox = BoundingBox.CreateFromPoints(Positions);
        }
    }
}