@a2a
Feature: A2A local facade wiring to live services
  As a client of the A2A local facade
  I want operations to route to real application services
  So that the facade delegates to live implementations

  # ---------------------------------------------------------------
  # Session wiring
  # ---------------------------------------------------------------

  Scenario: session.create delegates to SessionService
    Given a wired A2aLocalFacade with a mock SessionService
    When I dispatch wired operation "session.create" with params {"actor_name": "local/test-actor"}
    Then the wired response status should be "ok"
    And wired response data key "session_id" equals "MOCK-SESSION-001"
    And wired response data key "status" equals "created"

  Scenario: session.create with existing session_id is idempotent
    Given a wired A2aLocalFacade with a mock SessionService
    When I dispatch wired operation "session.create" with params {"session_id": "EXISTING-SESSION-999"}
    Then the wired response status should be "ok"
    And wired response data key "session_id" equals "EXISTING-SESSION-999"
    And wired response data key "status" equals "created"
    And the mock SessionService create should not have been called

  Scenario: session.close delegates to SessionService
    Given a wired A2aLocalFacade with a mock SessionService
    When I dispatch wired operation "session.close" with params {"session_id": "MOCK-SESSION-001"}
    Then the wired response status should be "ok"
    And wired response data key "status" equals "closed"

  Scenario: session.close without session_id returns error
    Given a wired A2aLocalFacade with a mock SessionService
    When I dispatch wired operation "session.close" with params {}
    Then the wired response status should be "error"

  # ---------------------------------------------------------------
  # Plan lifecycle wiring
  # ---------------------------------------------------------------

  Scenario: plan.create delegates to PlanLifecycleService
    Given a wired A2aLocalFacade with a mock PlanLifecycleService
    When I dispatch wired operation "plan.create" with params {"action_name": "local/test-action"}
    Then the wired response status should be "ok"
    And wired response data key "plan_id" equals "MOCK-PLAN-001"
    And wired response data key "status" equals "created"

  Scenario: plan.create without action_name returns error
    Given a wired A2aLocalFacade with a mock PlanLifecycleService
    When I dispatch wired operation "plan.create" with params {}
    Then the wired response status should be "error"

  Scenario: plan.execute delegates to PlanLifecycleService
    Given a wired A2aLocalFacade with a mock PlanLifecycleService
    When I dispatch wired operation "plan.execute" with params {"plan_id": "MOCK-PLAN-001"}
    Then the wired response status should be "ok"
    And wired response data key "plan_id" equals "MOCK-PLAN-001"

  Scenario: plan.status delegates to PlanLifecycleService
    Given a wired A2aLocalFacade with a mock PlanLifecycleService
    When I dispatch wired operation "plan.status" with params {"plan_id": "MOCK-PLAN-001"}
    Then the wired response status should be "ok"
    And wired response data key "plan_id" equals "MOCK-PLAN-001"
    And wired response data key "phase" equals "strategize"

  Scenario: plan.diff delegates to PlanLifecycleService
    Given a wired A2aLocalFacade with a mock PlanLifecycleService
    When I dispatch wired operation "plan.diff" with params {"plan_id": "MOCK-PLAN-001"}
    Then the wired response status should be "ok"
    And wired response data key "plan_id" equals "MOCK-PLAN-001"

  Scenario: plan.apply delegates to PlanLifecycleService
    Given a wired A2aLocalFacade with a mock PlanLifecycleService
    When I dispatch wired operation "plan.apply" with params {"plan_id": "MOCK-PLAN-001"}
    Then the wired response status should be "ok"
    And wired response data key "plan_id" equals "MOCK-PLAN-001"

  # ---------------------------------------------------------------
  # Registry wiring
  # ---------------------------------------------------------------

  Scenario: registry.list_tools delegates to ToolRegistry
    Given a wired A2aLocalFacade with a mock ToolRegistry
    When I dispatch wired operation "registry.list_tools" with params {}
    Then the wired response status should be "ok"
    And wired response data should contain tools list with 2 items

  Scenario: registry.list_resources delegates to ResourceRegistryService
    Given a wired A2aLocalFacade with a mock ResourceRegistryService
    When I dispatch wired operation "registry.list_resources" with params {}
    Then the wired response status should be "ok"
    And wired response data should contain resources list with 1 items

  # ---------------------------------------------------------------
  # Context stub
  # ---------------------------------------------------------------

  Scenario: context.get returns stub pending ACMS pipeline
    Given a wired A2aLocalFacade with no services
    When I dispatch wired operation "context.get" with params {}
    Then the wired response status should be "ok"
    And wired response data key "stub" equals "True"

  # ---------------------------------------------------------------
  # Event wiring
  # ---------------------------------------------------------------

  Scenario: event.subscribe delegates to A2aEventQueue
    Given a wired A2aLocalFacade with a mock A2aEventQueue
    When I dispatch wired operation "event.subscribe" with params {}
    Then the wired response status should be "ok"
    And wired response data key "status" equals "subscribed"
    And wired response data key "subscription_id" should not be empty

  # ---------------------------------------------------------------
  # Error mapping
  # ---------------------------------------------------------------

  Scenario: NOT_FOUND error code for missing resources
    Given a wired A2aLocalFacade with a raising SessionService for not-found
    When I dispatch wired operation "session.close" with params {"session_id": "nonexistent"}
    Then the wired response status should be "error"
    And wired response error code should be "NOT_FOUND"

  Scenario: VALIDATION_ERROR code for validation failures
    Given a wired A2aLocalFacade with a raising service for validation-error
    When I dispatch wired operation "plan.create" with params {"action_name": "bad"}
    Then the wired response status should be "error"
    And wired response error code should be "VALIDATION_ERROR"

  Scenario: PLAN_ERROR code for plan failures
    Given a wired A2aLocalFacade with a raising service for plan-error
    When I dispatch wired operation "plan.execute" with params {"plan_id": "P1"}
    Then the wired response status should be "error"
    And wired response error code should be "PLAN_ERROR"

  Scenario: INVALID_STATE code for business rule violations
    Given a wired A2aLocalFacade with a raising service for invalid-state
    When I dispatch wired operation "plan.apply" with params {"plan_id": "P1"}
    Then the wired response status should be "error"
    And wired response error code should be "INVALID_STATE"

  # ---------------------------------------------------------------
  # Fallback stubs when no service is wired
  # ---------------------------------------------------------------

  Scenario: session.create stub when no service wired
    Given a wired A2aLocalFacade with no services
    When I dispatch wired operation "session.create" with params {}
    Then the wired response status should be "ok"
    And wired response data key "status" equals "created"

  Scenario: plan.create stub when no service wired
    Given a wired A2aLocalFacade with no services
    When I dispatch wired operation "plan.create" with params {}
    Then the wired response status should be "ok"
    And wired response data key "status" equals "created"

  Scenario: registry.list_tools stub when no service wired
    Given a wired A2aLocalFacade with no services
    When I dispatch wired operation "registry.list_tools" with params {}
    Then the wired response status should be "ok"

  Scenario: event.subscribe stub when no service wired
    Given a wired A2aLocalFacade with no services
    When I dispatch wired operation "event.subscribe" with params {}
    Then the wired response status should be "ok"
    And wired response data key "status" equals "subscribed"
