/*
PLANTILLA DE ESTANDARIZACIÓN PARA OBJETOS osBase
Usar esta plantilla como guía para estandarizar cualquier objeto derivado de osBase
*/

namespace CtrEditor.ObjetosSim
{
    public partial class osEjemplo : osBase, IosBase
    {
        // 1. MÉTODO NOMBRECLASE - Usar nombres descriptivos en español
        public static string NombreClase()
        {
            return "Nombre Descriptivo del Objeto"; // Ej: "Motor VetroMeccanica", "Fotocélula", "Transporte TTOP"
        }
        private string nombre = NombreClase();

        // 2. PROPIEDAD NOMBRE - Siempre en categoría "Identificación"
        [property: Category("Identificación")]
        [property: Description("Nombre identificativo del objeto")]
        [property: Name("Nombre")]
        public override string Nombre
        {
            get => nombre;
            set => SetProperty(ref nombre, value);
        }

        // 3. CATEGORÍAS ESTÁNDAR:

        // IDENTIFICACIÓN - Información básica del objeto
        [ObservableProperty]
        [property: Category("Identificación")]
        [property: Description("Descripción o comentario del objeto")]
        [property: Name("Descripción")]
        public string descripcion;

        // POSICIÓN Y TAMAÑO - Heredadas de osBase (Left, Top, Ancho, Alto, Angulo)
        // No necesitan redefinirse, ya están en osBase

        // CONFIGURACIÓN - Parámetros principales del objeto
        [ObservableProperty]
        [property: Category("Configuración")]
        [property: Description("Velocidad máxima del objeto")]
        [property: Name("Velocidad Máxima")]
        public float velocidadMaxima;

        [ObservableProperty]
        [property: Category("Configuración")]
        [property: Description("Habilita/deshabilita funcionalidad específica")]
        [property: Name("Habilitar Función")]
        public bool habilitarFuncion;

        // SIMULACIÓN - Parámetros físicos y de simulación
        [ObservableProperty]
        [property: Category("Simulación")]
        [property: Description("Velocidad actual en la simulación")]
        [property: Name("Velocidad Actual")]
        public float velocidadActual;

        [ObservableProperty]
        [property: Category("Simulación")]
        [property: Description("Coeficiente de fricción")]
        [property: Name("Coeficiente de Fricción")]
        public float coeficienteFriccion;

        // ENLACE PLC - Conexiones con PLC y otros objetos
        [ObservableProperty]
        [property: Category("Enlace PLC")]
        [property: Description("Dirección del tag en el PLC")]
        [property: Name("Tag Principal")]
        public string tagPrincipal;

        [ObservableProperty]
        [property: Category("Enlace PLC")]
        [property: Description("Seleccionar motor para enlazar")]
        [property: Name("Motor Enlazado")]
        [property: ItemsSource(typeof(osBaseItemsSource<osVMmotorSim>))]
        public string motorEnlazado;

        // INFORMACIÓN - Valores calculados, estados, debug
        [ObservableProperty]
        [property: Category("Información")]
        [property: Description("Estado actual del objeto")]
        [property: Name("Estado")]
        public bool estado;

        [ObservableProperty]
        [property: Category("Información")]
        [property: Description("Último valor calculado")]
        [property: Name("Último Valor")]
        public float ultimoValor;

        // APARIENCIA - Aspectos visuales
        [ObservableProperty]
        [property: Category("Apariencia")]
        [property: Description("Tamaño visual del objeto")]
        [property: Name("Tamaño")]
        public float tamano;

        [ObservableProperty]
        [property: Category("Apariencia")]
        [property: Description("Color del objeto")]
        [property: Name("Color")]
        public Brush color;

        // ENCODER - Específico para motores con encoder
        [ObservableProperty]
        [property: Category("Encoder")]
        [property: Description("Habilita el encoder")]
        [property: Name("Con Encoder")]
        public bool conEncoder;

        [ObservableProperty]
        [property: Category("Encoder")]
        [property: Description("Posición actual del encoder")]
        [property: Name("Posición Encoder")]
        public float posicionEncoder;
    }
}

/*
GUÍA DE CATEGORÍAS:

1. "Identificación"
   - Nombre del objeto
   - Descripción
   - Etiquetas de clasificación

2. "Posición y Tamaño" 
   - Ya heredadas de osBase: Left, Top, Ancho, Alto, Angulo, Lock_movement

3. "Configuración"
   - Parámetros principales del objeto
   - Configuraciones específicas por tipo
   - Valores que el usuario configura

4. "Simulación"
   - Velocidades, fuerzas, coeficientes
   - Parámetros físicos
   - Comportamiento en simulación

5. "Enlace PLC"
   - Tags de entrada y salida
   - Conexiones con motores/sensores
   - Direcciones de PLC

6. "Información"
   - Valores calculados
   - Estados actuales
   - Datos de depuración
   - Información de solo lectura

7. "Apariencia"
   - Colores, tamaños visuales
   - Aspectos gráficos
   - Elementos de UI

8. "Encoder" (solo para motores)
   - Configuración del encoder
   - Valores del encoder

FORMATO DE DESCRIPCIONES:
- Usar español
- Ser descriptivo y claro
- Explicar qué hace la propiedad
- Evitar términos técnicos innecesarios

FORMATO DE NOMBRES:
- Usar español
- Formato "Título" (primera letra mayúscula)
- Ser conciso pero descriptivo
- Ej: "Velocidad Actual", "Tag Principal", "Con Encoder"
*/ 