// Auto.cs
// Versión 1.0 Fecha: 7-Enero-2003
// Versión 1.1 Fecha: 16-Enero-2003
// Juan Manuel Cueva Lovelle
// Ejemplo de Agregación y Composición

#define DEPURACION

using System;

namespace Agregacion
{
    class Carroceria
    {
        protected string color="Blanco";
        /// <summary>
        /// Propiedad Color: Color de la carrocería
        /// </summary>
        public string Color
        {
            set{color=value;}
            get{return color;}
        }

        /// <summary>
        /// Contiene el número de Serie de la carrocería
        /// </summary>
        protected int numeroSerie;
        /// <summary>
        /// Propiedad con sólo get
        /// </summary>
        public int NumeroSerie
        {
            get{return numeroSerie;}
        }
        /// <summary>
        /// Campo estático
        /// </summary>
        protected static int contador;
        /// <summary>
        /// Propiedad de un campo estático con sólo get
        /// </summary>
        public static int Contador
        {
            get{return contador;}
        }
        public Carroceria()
        {
            numeroSerie=contador++;
            #if DEPURACION
                Console.WriteLine("Se ha creado la Carroceria {0}",numeroSerie);
            #endif
        }
    }
    class Motor
    {
        /// <summary>
        /// Caballos de Vapor
        /// </summary>
        protected int cv;
        public int Cv
        {
            set{cv=value;}
            get{return cv;}
        }
        public Motor()
        {
            #if DEPURACION
            Console.WriteLine("Se ha creado un Motor de {0} CV",cv);
            #endif
        }
    }
    class Rueda
    {
        protected string neumatico="Sin marca";
        public string Neumatico
        {
            set{neumatico=value;}
            get{return neumatico;}
        }
        public Rueda()
        {
            #if DEPURACION
            Console.WriteLine("Se ha creado una Rueda con neumatico "+neumatico);
            #endif
        }
    }
    /// <summary>
    /// Contiene objetos  de las clases Carroceria, Motor y Rueda
    /// </summary>
    class Auto
    {
        protected Carroceria c;
        protected Motor m;
        protected Rueda r1,r2,r3,r4;
        /// <summary>
        /// Constructor de objetos por Composición
        /// </summary>
        public Auto()
        {
            c=new Carroceria();
            m=new Motor();
            r1=new Rueda();
            r2=new Rueda();
            r3=new Rueda();
            r4=new Rueda();
        }
        /// <summary>
        /// Constructor de objetos por Composición
        /// </summary>
        /// <param name="color">Color de la carroceria</param>
        /// <param name="cv">CV del motor</param>
        /// <param name="neumatico">Neumáticos de las ruedas</param>
        public Auto(string color, int cv, string neumatico)
        {
            c=new Carroceria();
            c.Color=color;

            m=new Motor();
            m.Cv=cv;

            r1=new Rueda();
            r2=new Rueda();
            r3=new Rueda();
            r4=new Rueda();

            r1.Neumatico=neumatico;
            r2.Neumatico=neumatico;
            r3.Neumatico=neumatico;
            r4.Neumatico=neumatico;
        }
        /// <summary>
        /// Constructor de objetos por agregación
        /// </summary>
        /// <param name="c">referencia a Carroceria</param>
        /// <param name="m">referencia a Rueda</param>
        /// <param name="r2">referencia a Rueda</param>
        /// <param name="r3">referencia a Rueda</param>
        /// <param name="r4">referencia a Rueda</param>
        public Auto(Carroceria c, Motor m, Rueda r1, Rueda r2, Rueda r3, Rueda r4)
        {
            this.c=c;
            this.m=m;
            this.r1=r1;
            this.r2=r2;
            this.r3=r3;
            this.r4=r4;
        }

        public override string ToString()
        {
            return ("Auto: Código:"+c.NumeroSerie+" Color: "+c.Color+" CV: "+m.Cv+
                    " Neumaticos: "+r1.Neumatico+","
                                   +r2.Neumatico+","
                                   +r3.Neumatico+","
                                   +r4.Neumatico);
        }

        /// <summary>
        /// Prueba unitaria de la clase Auto
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            //Creación por Composición
            Auto laguna = new Auto();
            Console.WriteLine("Dime lo que sabes de laguna "+laguna);

            //Espera una tecla
            Console.ReadLine();

            //Creación por Composición
            Auto clio = new Auto("azul",12,"Michelín");
            Console.WriteLine("Dime lo que sabes del clio "+clio);

            //Espera una tecla
            Console.ReadLine();

            laguna.c.Color="Verde";
            laguna.m.Cv=100;
            Console.WriteLine("Dime lo que sabes ahora de laguna "+laguna);

            //Espera una tecla
            Console.ReadLine();


            //Creación por agregación
            Carroceria formula1 = new Carroceria();
            formula1.Color="Rojo";

            Motor seat = new Motor();
            seat.Cv=500;

            Rueda michelin = new Rueda();
            michelin.Neumatico="300";

            Auto prototipo =new Auto(formula1,seat,michelin,michelin,michelin,michelin);
            Console.WriteLine("Dime lo que sabes ahora de prototipo "+prototipo);



            Console.WriteLine("Número de Carrocerías producidas: {0} ",Carroceria.Contador);


            //Espera una tecla para finalizar
            Console.ReadLine();

        }
    }
}