export const getServicesTemplate = (domainName: string): string => {
  const capitalizedName = domainName.charAt(0).toUpperCase() + domainName.slice(1);
  
  return `/**
 * Services and business logic for the ${capitalizedName} domain.
 * @packageDocumentation
 */

import type {
  ${capitalizedName}Entity,
  ${capitalizedName}CreationData,
  ${capitalizedName}UpdateData
} from '../entities/${capitalizedName}';

import type {
  ${capitalizedName}Port
} from '../ports/${capitalizedName}Port';

export class ${capitalizedName}Error extends Error {
  constructor(
    public code: string,
    message: string,
  ) {
    super(message);
    this.name = '${capitalizedName}Error';
  }
}

/**
 * Service implementation for ${capitalizedName} domain
 */
export class ${capitalizedName}Service {
  constructor(private readonly port: ${capitalizedName}Port) {}

  /**
   * Get all ${domainName} entities
   */
  async getAll(): Promise<${capitalizedName}Entity[]> {
    try {
      return await this.port.getAll();
    } catch (error) {
      throw new ${capitalizedName}Error('GET_ALL_ERROR', 'Failed to get all ${domainName} entities');
    }
  }

  /**
   * Get a ${domainName} entity by ID
   */
  async getById(id: string): Promise<${capitalizedName}Entity> {
    try {
      return await this.port.getById(id);
    } catch (error) {
      throw new ${capitalizedName}Error('GET_BY_ID_ERROR', \`Failed to get ${domainName} entity with id \${id}\`);
    }
  }

  /**
   * Create a new ${domainName} entity
   */
  async create(data: ${capitalizedName}CreationData): Promise<${capitalizedName}Entity> {
    try {
      return await this.port.create(data);
    } catch (error) {
      throw new ${capitalizedName}Error('CREATE_ERROR', 'Failed to create ${domainName} entity');
    }
  }

  /**
   * Update an existing ${domainName} entity
   */
  async update(id: string, data: ${capitalizedName}UpdateData): Promise<${capitalizedName}Entity> {
    try {
      return await this.port.update(id, data);
    } catch (error) {
      throw new ${capitalizedName}Error('UPDATE_ERROR', \`Failed to update ${domainName} entity with id \${id}\`);
    }
  }

  /**
   * Delete a ${domainName} entity
   */
  async delete(id: string): Promise<void> {
    try {
      await this.port.delete(id);
    } catch (error) {
      throw new ${capitalizedName}Error('DELETE_ERROR', \`Failed to delete ${domainName} entity with id \${id}\`);
    }
  }
}
`;
}; 