name: conectamed-dev

services:
  postgres:
    image: postgres:16-alpine
    container_name: postgres-conectamed-dev
    restart: unless-stopped
    environment:
      POSTGRES_USER: ${DB_USER:-app}
      POSTGRES_PASSWORD: ${DB_PASSWORD:?set in .env}
      POSTGRES_DB: ${DB_NAME:-appdb}
      DB_AUTH_NAME: ${DB_AUTH_NAME:-conectamed-auth}
      DB_INVENTORY_NAME: ${DB_INVENTORY_NAME:-conectamed-inventory}
      DB_CAPTIVE_PORTAL_NAME: ${DB_CAPTIVE_PORTAL_NAME:-conectamed-captive-portal}
      DB_INTELLIGENCE_NAME: ${DB_INTELLIGENCE_NAME:-conectamed-intelligence}
      INTELLIGENCE_READONLY_DB_USER: ${INTELLIGENCE_READONLY_DB_USER:-moni_readonly}
      INTELLIGENCE_READONLY_DB_PASSWORD: ${INTELLIGENCE_READONLY_DB_PASSWORD:-moni_readonly}
      TZ: America/Bogota
    ports:
      - "5432:5432"
    volumes:
      - pg_data_prodclone:/var/lib/postgresql/data
      - ./docker/postgres-init:/docker-entrypoint-initdb.d:ro
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"]
      interval: 10s
      timeout: 5s
      retries: 6
    networks:
      - private_net

  auth-service:
    build:
      context: ./nwi-app-conectamed-auth-ms
      dockerfile: Dockerfile.dev
      args:
        GITHUB_TOKEN: ${GITHUB_TOKEN}
    container_name: auth-service-conectamed-dev
    working_dir: /usr/src/app
    volumes:
      - ./nwi-app-conectamed-auth-ms:/usr/src/app
      - /usr/src/app/node_modules
    environment:
      # === Variables del micro (según tu .env) ===
      NODE_ENV: ${NODE_ENV:-local}
      SERVICE_NAME: nwi-app-conectamed-auth-ms
      SERVICE_PORT: 3001

      # === TypeORM / DB (red interna, no localhost) ===
      DB_SSL_ENABLED: ${DB_SSL_ENABLED}
      TYPEORM_LOGGING: "true"
      TYPEORM_ENTITIES: ./dist/domain/**/*.entity.[tj]s
      TYPEORM_MIGRATIONS: ./dist/db/migration/**/*.[tj]s

      TYPEORM_HOST: ${DB_HOST:-postgres}
      TYPEORM_PORT: "5432"
      TYPEORM_USERNAME: ${DB_USER:-admin}
      TYPEORM_PASSWORD: ${DB_PASSWORD:-admin}
      TYPEORM_DATABASE: ${DB_AUTH_NAME:-vg-auth}

      # === Secretos app ===
      JWT_SECRET: ${JWT_SECRET:?set in .env}

      # === Redis (tokens de recuperación de contraseña) ===
      REDIS_HOST: ${REDIS_HOST:-redis}
      REDIS_PORT: ${REDIS_PORT:-6379}
      REDIS_PASSWORD: ${REDIS_PASSWORD:-}
      REDIS_DB: ${REDIS_DB:-0}

      # === Notificación + enlace de reset (front) ===
      NOTIFICATION_SERVICE_URL: ${NOTIFICATION_SERVICE_URL:-http://notification-service:3005}
      PASSWORD_RESET_TOKEN_TTL_SECONDS: ${PASSWORD_RESET_TOKEN_TTL_SECONDS:-600}
      PASSWORD_RESET_APP_URL: ${PASSWORD_RESET_APP_URL:-http://localhost:9060}

      # === (Opcional) Zona horaria homogénea ===
      TZ: America/Bogota
    ports:
      - "3001:3001"
    depends_on:
      postgres:
        condition: service_healthy
      redis:
        condition: service_healthy
    networks:
      private_net:
        aliases:
          # Mismo hostname que SERVICE_NAME / URLs típicas en .env
          - nwi-app-conectamed-auth-ms
  
  captive-portal-service:
    build:
      context: ./nwi-app-conectamed-captive-portal-ms
      dockerfile: Dockerfile.dev
      args:
        GITHUB_TOKEN: ${GITHUB_TOKEN}
    container_name: captive-portal-service-conectamed-dev
    working_dir: /usr/src/app
    volumes:
      - ./nwi-app-conectamed-captive-portal-ms:/usr/src/app
      - /usr/src/app/node_modules
    environment:
      # === Variables del micro (según tu .env) ===
      NODE_ENV: ${NODE_ENV:-local}
      SERVICE_NAME: nwi-app-conectamed-captive-portal-ms
      SERVICE_PORT: 3002

      # === TypeORM / DB (red interna, no localhost) ===
      DB_SSL_ENABLED: ${DB_SSL_ENABLED}
      TYPEORM_LOGGING: "true"
      TYPEORM_ENTITIES: ./dist/domain/**/*.entity.[tj]s
      TYPEORM_MIGRATIONS: ./dist/db/migration/**/*.[tj]s

      TYPEORM_HOST: ${DB_HOST:-postgres}
      TYPEORM_PORT: "5432"
      TYPEORM_USERNAME: ${DB_USER:-admin}
      TYPEORM_PASSWORD: ${DB_PASSWORD:-admin}
      TYPEORM_DATABASE: ${DB_CAPTIVE_PORTAL_NAME:-conectamed-captive-portal}

      # === Integración con inventario (config portal por connection point) ===
      INVENTORY_SERVICE_URL: ${INVENTORY_SERVICE_URL:-http://inventory-service:3003/v1}

      # === (Opcional) Zona horaria homogénea ===
      TZ: America/Bogota
    ports:
      - "3002:3002"
    depends_on:
      postgres:
        condition: service_healthy
      inventory-service:
        condition: service_started
    networks:
      private_net:
        aliases:
          - nwi-app-conectamed-captive-portal-ms
  
  inventory-service:
    build:
      context: ./nwi-app-conectamed-inventory-ms
      dockerfile: Dockerfile.dev
      args:
        GITHUB_TOKEN: ${GITHUB_TOKEN}
    container_name: inventory-service-conectamed-dev
    working_dir: /usr/src/app
    volumes:
      - ./nwi-app-conectamed-inventory-ms:/usr/src/app
      - /usr/src/app/node_modules
    environment:
      # === Variables del micro (según tu .env) ===
      NODE_ENV: ${NODE_ENV:-local}
      SERVICE_NAME: nwi-app-conectamed-inventory-ms
      SERVICE_PORT: 3003

      # === TypeORM / DB (red interna, no localhost) ===
      DB_SSL_ENABLED: ${DB_SSL_ENABLED}
      TYPEORM_LOGGING: "true"
      TYPEORM_ENTITIES: ./dist/domain/**/*.entity.[tj]s
      TYPEORM_MIGRATIONS: ./dist/db/migration/**/*.[tj]s

      TYPEORM_HOST: ${DB_HOST:-postgres}
      TYPEORM_PORT: "5432"
      TYPEORM_USERNAME: ${DB_USER:-admin}
      TYPEORM_PASSWORD: ${DB_PASSWORD:-admin}
      TYPEORM_DATABASE: ${DB_INVENTORY_NAME:-conectamed-inventory}

      REDIS_HOST: redis
      REDIS_PORT: 6379
      REDIS_PASSWORD: ${REDIS_PASSWORD:-}
      REDIS_DB: 0
      CAPTIVE_VENDOR_SESSION_TTL_SECONDS: ${CAPTIVE_VENDOR_SESSION_TTL_SECONDS:-900}

      # Retención device_health_history (purge diario 03:00 TZ del contenedor). 0 = desactivado.
      DEVICE_HEALTH_RETENTION_DAYS: ${DEVICE_HEALTH_RETENTION_DAYS:-90}

      # === (Opcional) Zona horaria homogénea ===
      TZ: America/Bogota
    ports:
      - "3003:3003"
    depends_on:
      postgres:
        condition: service_healthy
      redis:
        condition: service_healthy
    networks:
      private_net:
        aliases:
          - nwi-app-conectamed-inventory-ms

  notification-service:
    build:
      context: ./nwi-app-conectamed-notification-ms
      dockerfile: Dockerfile.dev
      args:
        GITHUB_TOKEN: ${GITHUB_TOKEN}
    container_name: notification-service-conectamed-dev
    working_dir: /usr/src/app
    volumes:
      - ./nwi-app-conectamed-notification-ms:/usr/src/app
      - /usr/src/app/node_modules
    environment:
      NODE_ENV: ${NODE_ENV:-local}
      SERVICE_NAME: nwi-app-conectamed-notification-ms
      SERVICE_PORT: 3005

      # === (Opcional) Zona horaria homogénea ===
      TZ: America/Bogota

      SMTP_HOST: ${SMTP_HOST:-localhost}
      SMTP_PORT: ${SMTP_PORT:-587}
      SMTP_SECURE: ${SMTP_SECURE:-false}
      SMTP_USER: ${SMTP_USER:-}
      SMTP_PASSWORD: ${SMTP_PASSWORD:-}
      SMTP_TLS_REJECT_UNAUTHORIZED: ${SMTP_TLS_REJECT_UNAUTHORIZED:-false}
      EMAIL_FROM: ${EMAIL_FROM:-ConectaMed <noreply@conectamed.com>}
      EMAIL_TEMPLATES_DIR: ${EMAIL_TEMPLATES_DIR:-./src/templates/email}
    ports:
      - "3005:3005"
    networks:
      private_net:
        aliases:
          - nwi-app-conectamed-notification-ms

  bff-api:
    build:
      context: ./nwi-app-conectamed-bff
      dockerfile: Dockerfile.dev
      args:
        GITHUB_TOKEN: ${GITHUB_TOKEN}
    container_name: nwi-app-conectamed-bff
    working_dir: /usr/src/app
    volumes:
      - ./nwi-app-conectamed-bff:/usr/src/app
      - /usr/src/app/node_modules
    environment:
      NODE_ENV: ${BFF_NODE_ENV:-local}
      SERVICE_NAME: nwi-app-conectamed-bff
      SERVICE_PORT: 8080      

      # Rutas internas: usar nombres de servicio Compose (o alias *-ms abajo)
      AUTH_SERVICE_URL: ${AUTH_SERVICE_URL:-http://auth-service:3001/v1}
      CAPTIVE_PORTAL_SERVICE_URL: ${CAPTIVE_PORTAL_SERVICE_URL:-http://captive-portal-service:3002/v1}
      INVENTORY_SERVICE_URL: ${INVENTORY_SERVICE_URL:-http://inventory-service:3003/v1}
      RADIUS_WORKER_SERVICE_URL: ${RADIUS_WORKER_SERVICE_URL:-http://worker-radius:3004/v1}
      RADIUS_WORKER_INTERNAL_API_KEY: ${RADIUS_WORKER_INTERNAL_API_KEY:-}
      INTELLIGENCE_WORKER_SERVICE_URL: ${INTELLIGENCE_WORKER_SERVICE_URL:-http://intelligence-worker:3007/v1}
      INTELLIGENCE_WORKER_INTERNAL_API_KEY: ${INTELLIGENCE_WORKER_INTERNAL_API_KEY:-}
      CAPTIVE_RADIUS_SESSION_TTL_SECONDS: ${CAPTIVE_RADIUS_SESSION_TTL_SECONDS:-3600}      

      TZ: America/Bogota

      # Redis dentro de la red privada
      REDIS_HOST: redis
      REDIS_PORT: 6379
      REDIS_PASSWORD: ${REDIS_PASSWORD:-}
      REDIS_DB: 0

      METABASE_SITE_URL: ${METABASE_SITE_URL:-}
      METABASE_SECRET_KEY: ${METABASE_SECRET_KEY:-}
    ports:
      - "8080:8080"
    dns:
      - 8.8.8.8
      - 1.1.1.1
    depends_on:
      - auth-service
      - captive-portal-service
      - inventory-service
      - worker-radius
      - intelligence-worker
    networks:
      - private_net
      - public_net

  redis:
    image: redis:alpine
    container_name: redis-dev
    command: >
      sh -c '
      if [ -n "$$REDIS_PASSWORD" ]; then
        echo "requirepass $$REDIS_PASSWORD" > /usr/local/etc/redis/redis.conf;
        redis-server /usr/local/etc/redis/redis.conf;
      else
        redis-server --appendonly yes;
      fi'
    ports:
      - "6379:6379"
    volumes:
      - redis_data:/data
    healthcheck:
      test: ["CMD-SHELL", "redis-cli ping"]
      interval: 10s
      timeout: 5s
      retries: 6
    networks:
      - private_net

  soketi:
    image: quay.io/soketi/soketi:1.6-16-alpine
    container_name: soketi-conectamed-dev
    restart: unless-stopped
    environment:
      SOKETI_DEBUG: "${SOKETI_DEBUG:-1}"
      SOKETI_DEFAULT_APP_ID: "${SOKETI_DEFAULT_APP_ID:-conectamed}"
      SOKETI_DEFAULT_APP_KEY: "${SOKETI_DEFAULT_APP_KEY:-conectamed-app-key}"
      SOKETI_DEFAULT_APP_SECRET: "${SOKETI_DEFAULT_APP_SECRET:-conectamed-app-secret}"
    ports:
      - "${SOKETI_HOST_PORT:-6001}:6001"
    networks:
      private_net:
        aliases:
          - soketi

  worker-radius:
    build:
      context: ./nwi-app-conectamed-radius-worker
      dockerfile: Dockerfile.dev
      args:
        GITHUB_TOKEN: ${GITHUB_TOKEN}
    container_name: worker-radius-dev
    working_dir: /usr/src/app
    volumes:
      - ./nwi-app-conectamed-radius-worker:/usr/src/app
      - /usr/src/app/node_modules
    environment:
      NODE_ENV: ${NODE_ENV:-local}
      SERVICE_NAME: nwi-app-conectamed-radius-worker
      SERVICE_PORT: 3004

      REDIS_HOST: redis
      REDIS_PORT: 6379
      REDIS_PASSWORD: ${REDIS_PASSWORD:-}
      REDIS_DB: 0
      INTERNAL_API_KEY: ${RADIUS_WORKER_INTERNAL_API_KEY:-}

    ports:
      - "3004:3004"
    depends_on:
      redis:
        condition: service_healthy    
    networks:
      - private_net

  intelligence-worker:
    build:
      context: ./nwi-app-conectamed-intelligence-worker
      dockerfile: Dockerfile.dev
      args:
        GITHUB_TOKEN: ${GITHUB_TOKEN}
    container_name: intelligence-worker-dev
    mem_limit: 6g
    working_dir: /usr/src/app
    volumes:
      - ./nwi-app-conectamed-intelligence-worker:/usr/src/app
      - /usr/src/app/node_modules
    environment:
      NODE_ENV: ${NODE_ENV:-local}
      SERVICE_NAME: nwi-app-conectamed-intelligence-worker
      SERVICE_PORT: 3007
      # SWC en dev (nest-cli); heap moderado evita SIGKILL por OOM del host (no subir a 4096 si hay poca RAM).
      NODE_OPTIONS: "--max-old-space-size=${INTELLIGENCE_WORKER_NODE_HEAP:-2048}"

      # === LLM (estrategia configurable) ===
      LLM_PROVIDER: ${LLM_PROVIDER:-openai}
      LLM_OPENAI_MODEL: ${LLM_OPENAI_MODEL:-gpt-4o-mini}
      LLM_ANTHROPIC_MODEL: ${LLM_ANTHROPIC_MODEL:-claude-3-5-sonnet-latest}
      LLM_TEMPERATURE: ${LLM_TEMPERATURE:-0}
      OPENAI_API_KEY: ${OPENAI_API_KEY:-}
      ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY:-}
      LLM_MAX_OUTPUT_TOKENS: ${LLM_MAX_OUTPUT_TOKENS:-}
      INTELLIGENCE_ENCRYPTION_KEY: ${INTELLIGENCE_ENCRYPTION_KEY:-}
      INTELLIGENCE_AGENT_MAX_ITERATIONS: ${INTELLIGENCE_AGENT_MAX_ITERATIONS:-8}
      INTELLIGENCE_AGENT_TOP_K_ROWS: ${INTELLIGENCE_AGENT_TOP_K_ROWS:-20}

      # === DB (TYPEORM_* + POSTGRES_CONFIG; agente SQL reutiliza host/user/pass) ===
      DB_SSL_ENABLED: ${DB_SSL_ENABLED:-false}
      TYPEORM_LOGGING: ${TYPEORM_LOGGING:-true}
      TYPEORM_HOST: ${DB_HOST:-postgres}
      TYPEORM_PORT: ${DB_PORT:-5432}
      TYPEORM_USERNAME: ${DB_USER:-admin}
      TYPEORM_PASSWORD: ${DB_PASSWORD:-admin}
      TYPEORM_DATABASE: ${DB_INTELLIGENCE_NAME:-conectamed-intelligence}
      DB_INVENTORY_NAME: ${DB_INVENTORY_NAME:-conectamed-inventory}
      DB_CAPTIVE_PORTAL_NAME: ${DB_CAPTIVE_PORTAL_NAME:-conectamed-captive-portal}
      SQL_ANALYTICS_DATABASES: ${SQL_ANALYTICS_DATABASES:-}
      SQL_ANALYTICS_TABLES: ${SQL_ANALYTICS_TABLES:-devices,device_types,device_health_history,device_connectivity_alerts,connection_points,connection_point_types,manufacturers,municipalities,departments,portal_configs,survey_questions,portal_configs_questions,survey_responses}
      TYPEORM_ENTITIES: ./dist/db/entities/**/*.entity.[tj]s
      TYPEORM_MIGRATIONS: ./dist/db/migration/**/*.[tj]s

      # === Soketi / Pusher para chat en tiempo real ===
      PUSHER_APP_ID: ${SOKETI_DEFAULT_APP_ID:-conectamed}
      PUSHER_KEY: ${SOKETI_DEFAULT_APP_KEY:-conectamed-app-key}
      PUSHER_SECRET: ${SOKETI_DEFAULT_APP_SECRET:-conectamed-app-secret}
      PUSHER_HOST: soketi
      PUSHER_PORT: 6001
      PUSHER_USE_TLS: "false"
      INTELLIGENCE_PUSHER_CHANNEL_PREFIX: ${INTELLIGENCE_PUSHER_CHANNEL_PREFIX:-intelligence-chat}

      # === Seguridad llamada interna desde el BFF ===
      INTERNAL_API_KEY: ${INTELLIGENCE_WORKER_INTERNAL_API_KEY:-}

      TZ: America/Bogota
    ports:
      - "3007:3007"
    depends_on:
      postgres:
        condition: service_healthy
      soketi:
        condition: service_started
    networks:
      private_net:
        aliases:
          - nwi-app-conectamed-intelligence-worker
          - intelligence-worker

  radius-server:
    build:
      context: ./radius-server
      dockerfile: Dockerfile.freeradius
    container_name: radius-server-freeradius
    restart: unless-stopped
    environment:
      RADIUS_WORKER_URL: ${RADIUS_WORKER_URL:-http://worker-radius:3004}
    volumes:
      - ./radius-server/raddb/sites-enabled/default:/etc/raddb/sites-enabled/default
      - ./radius-server/raddb/mods-available/rest:/etc/raddb/mods-available/rest
      - ./radius-server/raddb/clients.conf:/etc/raddb/clients.conf
    depends_on:
      - redis
      - worker-radius
    ports:
      - "1812:1812/udp"
      - "1813:1813/udp"
    networks:
      - private_net
      - public_net

networks:
  public_net:
    driver: bridge
  private_net:
    driver: bridge

volumes:
  pg_data_prodclone:
  redis_data: