$this->currentStep, 'form_data' => $this->formData, 'errors' => $this->errors, 'submitted' => $this->submitted, 'submission_id' => $this->submissionId, ]; } // Transformation methods for immutable state changes public function withFieldUpdate(string $field, mixed $value): self { $newFormData = $this->formData; $newFormData[$field] = $value; return new self( currentStep: $this->currentStep, formData: $newFormData, errors: $this->errors, submitted: $this->submitted, submissionId: $this->submissionId ); } public function withNextStep(): self { return new self( currentStep: $this->currentStep + 1, formData: $this->formData, errors: [], submitted: $this->submitted, submissionId: $this->submissionId ); } public function withPreviousStep(): self { return new self( currentStep: max(1, $this->currentStep - 1), formData: $this->formData, errors: [], submitted: $this->submitted, submissionId: $this->submissionId ); } public function withErrors(array $errors): self { return new self( currentStep: $this->currentStep, formData: $this->formData, errors: $errors, submitted: $this->submitted, submissionId: $this->submissionId ); } public function withSubmitted(string $submissionId): self { return new self( currentStep: $this->currentStep, formData: $this->formData, errors: [], submitted: true, submissionId: $submissionId ); } public function withReset(): self { return new self( currentStep: 1, formData: [], errors: [], submitted: false, submissionId: null ); } // Query methods public function hasErrors(): bool { return !empty($this->errors); } public function getFieldValue(string $field): mixed { return $this->formData[$field] ?? null; } public function isFirstStep(): bool { return $this->currentStep === 1; } public function isCompleted(): bool { return $this->submitted; } }