/**
 * {{featureName}} Feature Service - Business logic with AppKit integration
 * @module {{projectName}}/{{featureName}}-service
 * @file src/api/features/{{featureName}}/{{featureName}}.service.ts
 *
 * @llm-rule WHEN: Need business logic layer with validation, logging, and config
 * @llm-rule AVOID: Direct database calls from routes - always use service layer
 * @llm-rule NOTE: Demonstrates AppKit logger, config, and error patterns for FBCA
 */

import { loggerClass } from '@voilajsx/appkit/logger';
import { configClass } from '@voilajsx/appkit/config';
import { errorClass } from '@voilajsx/appkit/error';
import type { {{featureName}}Response, {{featureName}}CreateRequest } from './{{featureName}}.types.js';

// Initialize AppKit modules following the pattern
const logger = loggerClass.get('{{featureName}}');
const config = configClass.get();
const error = errorClass.get();

export const {{featureName}}Service = {
  /**
   * Get all {{featureName}} items
   */
  async getAll(): Promise<{{featureName}}Response[]> {
    try {
      logger.info('Processing get all {{featureName}} request');

      // Example implementation - replace with your business logic
      const items = [
        {
          id: '1',
          name: 'Sample {{featureName}}',
          timestamp: new Date().toISOString()
        }
      ];

      logger.info('Get all {{featureName}} request completed', { count: items.length });
      return items;

    } catch (err) {
      logger.error('Failed to get all {{featureName}} items', { error: err });
      throw error.serverError('Failed to retrieve {{featureName}} items');
    }
  },

  /**
   * Get {{featureName}} by ID
   */
  async getById(id: string): Promise<{{featureName}}Response> {
    try {
      logger.info('Processing get {{featureName}} by ID request', { id });

      // Validate input
      if (!id || typeof id !== 'string') {
        logger.warn('Invalid ID provided', { id });
        throw error.badRequest('ID must be a valid string');
      }

      // Example implementation - replace with your business logic
      const item = {
        id,
        name: `Sample {{featureName}} ${id}`,
        timestamp: new Date().toISOString()
      };

      logger.info('Get {{featureName}} by ID request completed', { id, result: item });
      return item;

    } catch (err: any) {
      // Re-throw AppKit errors as-is
      if (err.statusCode) {
        throw err;
      }

      // Convert other errors to server errors
      logger.error('Failed to get {{featureName}} by ID', { id, error: err });
      throw error.serverError('Failed to retrieve {{featureName}} item');
    }
  }
};