// lib/services/calculator.dart
import '../models/norms.dart';

class Calculator {
  static List<int> calculateSums(List<int> items) {
    final sums = List.filled(7, 0);
    
    for (int i = 0; i < 10; i++) sums[1] += items[i];
    for (int i = 10; i < 20; i++) sums[2] += items[i];
    for (int i = 20; i < 28; i++) sums[3] += items[i];
    sums[3] += items[8] + items[9];
    for (int i = 28; i < 36; i++) sums[4] += items[i];
    
    sums[5] = items[0] + items[1] + items[5] + items[6] + items[7] +
              items[8] + items[9] + items[11] + items[12] + items[13] + items[14];
    
    sums[6] = items[2] + items[3] + items[4] + items[8] + items[9] +
              items[10] + items[16] + items[17];
    
    return sums;
  }

  static List<int> calculateProfileValues(List<int> sums, List<List<double>> norm) {
    final values = <int>[];
    
    for (int k = 1; k <= 6; k++) {
      int value = 5;
      for (int p = 0; p < 5; p++) {
        if (sums[k] < norm[k - 1][p]) {
          value = p + 1;
          break;
        }
      }
      values.add(value);
    }
    return values;
  }

  static double calculateCorrelation(List<int> seValues, List<int> feValues) {
    final n = seValues.length;
    double sumSE = 0, sumFE = 0, sumSEFE = 0, sumSE2 = 0, sumFE2 = 0;
    
    for (int i = 0; i < n; i++) {
      sumSE += seValues[i];
      sumFE += feValues[i];
      sumSEFE += seValues[i] * feValues[i];
      sumSE2 += seValues[i] * seValues[i];
      sumFE2 += feValues[i] * feValues[i];
    }
    
    final numerator = n * sumSEFE - sumSE * sumFE;
    final denominator = sqrt((n * sumSE2 - sumSE * sumSE) * (n * sumFE2 - sumFE * sumFE));
    
    return denominator == 0 ? 0 : numerator / denominator;
  }

  static double calculateAgreement(List<int> seItems, List<int> feItems) {
    int matches = 0;
    for (int i = 0; i < 36; i++) {
      if (seItems[i] == feItems[i]) matches++;
    }
    return matches * 100 / 36;
  }

  static String getRating(int value) {
    switch (value) {
      case 1: return 'weit unterdurchschnittlich';
      case 2: return 'unterdurchschnittlich';
      case 3: return 'durchschnittlich';
      case 4: return 'überdurchschnittlich';
      case 5: return 'weit überdurchschnittlich';
      default: return 'unbekannt';
    }
  }

  static String getInterpretation(
    double correlation,
    double agreement,
    List<int> seValues,
    List<int> feValues,
  ) {
    String text = '';
    
    if (correlation >= 0.8) {
      text += 'Sehr gute Übereinstimmung zwischen Selbst- und Fremdeinschätzung '
              '(r = ${correlation.toStringAsFixed(2)}).\n\n';
    } else if (correlation >= 0.6) {
      text += 'Gute Übereinstimmung zwischen Selbst- und Fremdeinschätzung '
              '(r = ${correlation.toStringAsFixed(2)}).\n\n';
    } else if (correlation >= 0.4) {
      text += 'Mäßige Übereinstimmung zwischen Selbst- und Fremdeinschätzung '
              '(r = ${correlation.toStringAsFixed(2)}).\n\n';
    } else if (correlation >= 0.2) {
      text += 'Schwache Übereinstimmung zwischen Selbst- und Fremdeinschätzung '
              '(r = ${correlation.toStringAsFixed(2)}).\n\n';
    } else {
      text += 'Keine signifikante Übereinstimmung zwischen Selbst- und '
              'Fremdeinschätzung (r = ${correlation.toStringAsFixed(2)}).\n\n';
    }
    
    text += 'Die inhaltliche Übereinstimmung beträgt ${agreement.toStringAsFixed(1)}%.\n\n';
    
    text += 'Auswertung der Kompetenzen:\n';
    text += '━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n';
    text += 'Selbsteinschätzung:\n';
    for (int i = 0; i < 6; i++) {
      text += '  • ${Norms.kompetenzen[i]}: ${getRating(seValues[i])} (${seValues[i]}/5)\n';
    }
    text += '\nFremdeinschätzung:\n';
    for (int i = 0; i < 6; i++) {
      text += '  • ${Norms.kompetenzen[i]}: ${getRating(feValues[i])} (${feValues[i]}/5)\n';
    }
    
    return text;
  }
}