using System;
using System.Linq;
using AIRuntime.Runtime.Agents;

using NUnit.Framework;


namespace AIRuntime.Tests
{
    public sealed class AgentDefinitionTests
    {
        [Test]
        public void Constructor_CreatesAgentDefinition()
        {
            AgentDefinition agent =
                new AgentDefinition(
                    "ArchitectAgent",
                    "Architect Agent",
                    "Technical architecture specialist.",
                    "You design systems.");


            Assert.AreEqual(
                "ArchitectAgent",
                agent.Id);


            Assert.AreEqual(
                "Architect Agent",
                agent.DisplayName);


            Assert.AreEqual(
                "Technical architecture specialist.",
                agent.Description);


            Assert.AreEqual(
                "You design systems.",
                agent.SystemPrompt);
        }



        [Test]
        public void Constructor_RejectsEmptyId()
        {
            Assert.Throws<ArgumentException>(
                () =>
                {
                    new AgentDefinition(
                        "",
                        "Agent",
                        "Description",
                        "Prompt");
                });
        }



        [Test]
        public void Constructor_RejectsEmptyDisplayName()
        {
            Assert.Throws<ArgumentException>(
                () =>
                {
                    new AgentDefinition(
                        "Agent",
                        "",
                        "Description",
                        "Prompt");
                });
        }



        [Test]
        public void AddCapability_AddsCapability()
        {
            AgentDefinition agent =
                CreateAgent();


            agent.AddCapability(
                "filesystem");


            Assert.AreEqual(
                1,
                agent.Capabilities.Count);


            Assert.IsTrue(
                agent.Capabilities.Contains(
                    "filesystem"));
        }



        [Test]
        public void AddCapability_DoesNotDuplicate()
        {
            AgentDefinition agent =
                CreateAgent();


            agent.AddCapability(
                "filesystem");


            agent.AddCapability(
                "filesystem");


            Assert.AreEqual(
                1,
                agent.Capabilities.Count);
        }



        [Test]
        public void RemoveCapability_RemovesCapability()
        {
            AgentDefinition agent =
                CreateAgent();


            agent.AddCapability(
                "filesystem");


            agent.RemoveCapability(
                "filesystem");


            Assert.AreEqual(
                0,
                agent.Capabilities.Count);
        }



        [Test]
        public void AddCapability_RejectsEmptyName()
        {
            AgentDefinition agent =
                CreateAgent();


            Assert.Throws<ArgumentException>(
                () =>
                {
                    agent.AddCapability(
                        "");
                });
        }



        private static AgentDefinition CreateAgent()
        {
            return new AgentDefinition(
                "TestAgent",
                "Test Agent",
                "Testing agent",
                "Testing prompt");
        }
    }
}