import 'dart:io';
import 'dart:math';
import 'package:backend/extensions/request_context.dart';
import 'package:backend/store.dart';
import 'package:dart_frog/dart_frog.dart';
import 'package:shared_models/models/translation_request.dart';
import 'package:shared_models/models/translation_response.dart';
import 'package:uuid/uuid.dart';

Future<Response> onRequest(RequestContext context) async {
  if (context.request.method != HttpMethod.post) {
    return Response(statusCode: HttpStatus.methodNotAllowed);
  }

  try {
    final userId = context.userId;

    final body = await context.request.json() as Map<String, dynamic>;
    final inputText = body['text'] as String?;
    if (inputText == null) {
      return Response.json(
        statusCode: HttpStatus.badRequest,
        body: {'error': 'text field is required'},
      );
    }

    final id = const Uuid().v4();

    final translation = TranslationRequest(
      id: id,
      inputText: inputText,
      timestamp: DateTime.now(),
      result: generateBabyTalk(inputText),
      userId: userId, // Replace with actual translation logic
    );

    MemoryStore.addHumanTranslation(translation);

    return Response.json(
      body: TranslationResponse(
        id: id,
        translatedText: translation.result!,
      ).toJson(),
    );
  } catch (e) {
    return Response.json(
      statusCode: HttpStatus.internalServerError,
      body: {'error': e.toString()},
    );
  }
}

String generateBabyTalk(String input) {
  final random = Random(input.hashCode);
  final syllables = ['goo', 'ga', 'bah', 'ma', 'da', 'ba'];
  final sounds = ['ah', 'oh', 'eh'];

  // Roughly calculate how many syllables we want based on input length
  final targetLength = (input.length / 2).round();

  // Add some randomness to the target length (±30%)
  final variance = (targetLength * 0.3).round();
  final finalLength = targetLength + random.nextInt(variance * 2) - variance;

  final List<String> result = [];

  // Sometimes start with a sound
  if (random.nextBool()) {
    result.add(sounds[random.nextInt(sounds.length)]);
  }

  while (result.join(' ').length < input.length) {
    // Randomly decide to repeat the last syllable
    if (result.isNotEmpty && random.nextDouble() < 0.3) {
      result.add(result.last);
      continue;
    }

    // Randomly combine syllables
    if (random.nextDouble() < 0.4) {
      final syl1 = syllables[random.nextInt(syllables.length)];
      final syl2 = syllables[random.nextInt(syllables.length)];
      result.add('$syl1 $syl2');
    } else {
      result.add(syllables[random.nextInt(syllables.length)]);
    }

    // Sometimes add a sound between syllables
    if (random.nextDouble() < 0.2) {
      result.add(sounds[random.nextInt(sounds.length)]);
    }
  }

  return result.join(' ');
}