/**
 * @module @aiox/{{kebabCase serviceName}}
 * @description {{description}}
 * @story {{storyId}}
 */

// Re-export types
export * from './types';

// Re-export errors
export * from './errors';

{{#if isApiIntegration}}
// Re-export client (API integrations only)
export { {{pascalCase serviceName}}Client } from './client';
{{/if}}

import type { {{pascalCase serviceName}}Config, {{pascalCase serviceName}}Service } from './types';
import { {{pascalCase serviceName}}Error, {{pascalCase serviceName}}ErrorCode } from './errors';
{{#if isApiIntegration}}
import { {{pascalCase serviceName}}Client } from './client';
{{/if}}

/**
 * Creates a new {{pascalCase serviceName}} service instance.
 *
 * @param config - Service configuration
 * @returns Configured service instance
 * @throws {{{pascalCase serviceName}}Error} If configuration is invalid
 *
 * @example
 * ```typescript
 * const service = create{{pascalCase serviceName}}Service({
 *   // configuration options
 * });
 *
 * const result = await service.execute();
 * ```
 */
export function create{{pascalCase serviceName}}Service(
  config: {{pascalCase serviceName}}Config
): {{pascalCase serviceName}}Service {
  // Validate configuration
  validateConfig(config);

{{#if isApiIntegration}}
  // Create API client
  const client = new {{pascalCase serviceName}}Client(config);

{{/if}}
  return {
    /**
     * Execute the primary service operation.
     */
    async execute(): Promise<void> {
      // TODO: Implement primary operation
      throw new {{pascalCase serviceName}}Error(
        'Not implemented',
        {{pascalCase serviceName}}ErrorCode.NOT_IMPLEMENTED
      );
    },

    /**
     * Get the current configuration (without sensitive values).
     */
    getConfig(): Partial<{{pascalCase serviceName}}Config> {
      return {
        // Return non-sensitive config values
{{#each envVars}}
{{#unless this.sensitive}}
        {{camelCase this.name}}: config.{{camelCase this.name}},
{{/unless}}
{{/each}}
      };
    },

    /**
     * Check if the service is properly configured and operational.
     */
    async healthCheck(): Promise<boolean> {
      try {
{{#if isApiIntegration}}
        // Verify API connectivity
        await client.ping();
{{/if}}
        return true;
      } catch {
        return false;
      }
    },
  };
}

/**
 * Validates the service configuration.
 * @throws {{{pascalCase serviceName}}Error} If configuration is invalid
 */
function validateConfig(config: {{pascalCase serviceName}}Config): void {
  if (!config) {
    throw new {{pascalCase serviceName}}Error(
      'Configuration is required',
      {{pascalCase serviceName}}ErrorCode.CONFIGURATION_ERROR
    );
  }

{{#each envVars}}
{{#if this.required}}
  if (config.{{camelCase this.name}} === undefined || config.{{camelCase this.name}} === null) {
    throw new {{pascalCase serviceName}}Error(
      '{{this.name}} is required',
      {{pascalCase serviceName}}ErrorCode.CONFIGURATION_ERROR
    );
  }

{{/if}}
{{/each}}
}

// Default export
export default create{{pascalCase serviceName}}Service;
