# Capa de Dominio - Shared (Fundación)

## Propósito

La capa de Dominio de `shared/` contiene la **lógica de negocio compartida** que utilizan todos los contextos
(admin y public). Es la fundación del proyecto y no debe tener dependencias de frameworks, librerías externas, o
capas superiores.

## Principios

1. **Sin dependencias externas**: No depende de WordPress, plugins, o librerías
2. **Lógica pura**: Solo reglas de negocio y objetos de dominio
3. **Inmutabilidad**: Los Value Objects son inmutables
4. **Validación**: Los objetos se validan a sí mismos

## Estructura

```
shared/Domain/
├── ValueObjects/        # Value Objects compartidos (ComponentID, SettingValue, etc.)
├── Exceptions/          # Excepciones de dominio (InvalidComponentException, etc.)
└── Contracts/           # Interfaces de repositorios y servicios de dominio
```

## Ejemplos de Uso

### Value Objects

Value Objects que representan conceptos del dominio:

```php
namespace ROITheme\Shared\Domain\ValueObjects;

final class ComponentID
{
    private int $value;

    public function __construct(int $value)
    {
        if ($value <= 0) {
            throw new \InvalidArgumentException('Component ID must be positive');
        }

        $this->value = $value;
    }

    public function value(): int
    {
        return $this->value;
    }

    public function equals(ComponentID $other): bool
    {
        return $this->value === $other->value;
    }
}
```

### Excepciones

Excepciones específicas del dominio:

```php
namespace ROITheme\Shared\Domain\Exceptions;

class InvalidComponentException extends \DomainException
{
    public static function withId(int $id): self
    {
        return new self("Component with ID {$id} is invalid");
    }
}
```

### Contracts (Interfaces)

Interfaces que definen comportamientos:

```php
namespace ROITheme\Shared\Domain\Contracts;

interface ComponentRepositoryInterface
{
    public function findById(ComponentID $id): ?Component;
    public function save(Component $component): void;
}
```

## Reglas de Dependencia

✅ **PUEDE** depender de:
- Otros objetos dentro de `shared/Domain/`
- SPL (Standard PHP Library)
- Nada más

❌ **NO PUEDE** depender de:
- `shared/Application/`
- `shared/Infrastructure/`
- `admin/` o `public/`
- WordPress functions
- Librerías externas

## Testing

Los objetos de esta capa se testean con **tests unitarios puros**, sin necesidad de WordPress:

```php
// tests/Unit/Shared/Domain/ValueObjects/ComponentIDTest.php
public function test_creates_valid_component_id()
{
    $id = new ComponentID(123);
    $this->assertEquals(123, $id->value());
}
```

## Cuándo Agregar Código Aquí

Agrega código a `shared/Domain/` cuando:
- Es lógica de negocio pura (sin WordPress)
- Es compartido por admin/ y public/
- Es un concepto fundamental del dominio
- Necesita alta cohesión y bajo acoplamiento

No agregues aquí:
- Código que depende de WordPress
- Lógica específica de un solo contexto
- Implementaciones concretas de servicios
