Luckify

Phone Number Analysis

import 'package:intl/intl.dart'; // Add intl package to your pubspec.yaml

// --- Helper Functions ---

// Reduces a number to a single digit (1-9)
int _reduceToSingleDigit(int number) {
  while (number > 9) {
    int sum = 0;
    String numStr = number.toString();
    for (int i = 0; i < numStr.length; i++) {
      sum += int.parse(numStr[i]);
    }
    number = sum;
  }
  return number;
}

// Reduces a number to a single digit OR keeps Master Numbers (11, 22, 33)
int _reduceToSingleDigitOrMaster(int number) {
  if (number == 11 || number == 22 || number == 33) {
    return number;
  }
  while (number > 9) {
    int sum = 0;
    String numStr = number.toString();
    for (int i = 0; i < numStr.length; i++) {
      sum += int.parse(numStr[i]);
    }
    number = sum;
    // Check again if the reduced sum is a master number
    if (number == 11 || number == 22 || number == 33) {
      return number;
    }
  }
  return number;
}

// Calculates the sum of digits in a numeric string
int _calculateNumberStringSum(String numberString) {
  int sum = 0;
  String digitsOnly = numberString.replaceAll(RegExp(r'\D'), ''); // Remove non-digits
  if (digitsOnly.isEmpty) return 0;

  for (int i = 0; i < digitsOnly.length; i++) {
    sum += int.parse(digitsOnly[i]);
  }
  return sum;
}

// Gets the Pythagorean numerology value for a letter
int _getLetterValue(String letter) {
  letter = letter.toUpperCase();
  switch (letter) {
    case 'A': case 'J': case 'S':
      return 1;
    case 'B': case 'K': case 'T':
      return 2;
    case 'C': case 'L': case 'U':
      return 3;
    case 'D': case 'M': case 'V':
      return 4;
    case 'E': case 'N': case 'W':
      return 5;
    case 'F': case 'O': case 'X':
      return 6;
    case 'G': case 'P': case 'Y':
      return 7;
    case 'H': case 'Q': case 'Z':
      return 8;
    case 'I': case 'R':
      return 9;
    default:
      return 0; // Ignore non-alphabetic characters
  }
}

// Calculates Life Path Number from Date of Birth
int calculateLifePathNumber(DateTime dob) {
  int daySum = _reduceToSingleDigitOrMaster(dob.day);
  int monthSum = _reduceToSingleDigitOrMaster(dob.month);

  int yearSum = 0;
  String yearStr = dob.year.toString();
  for (int i = 0; i < yearStr.length; i++) {
    yearSum += int.parse(yearStr[i]);
  }
  yearSum = _reduceToSingleDigitOrMaster(yearSum);

  int totalSum = daySum + monthSum + yearSum;
  return _reduceToSingleDigitOrMaster(totalSum);
}

// Calculates Expression Number (Destiny Number) from Full Name
int calculateExpressionNumber(String fullName) {
  int totalSum = 0;
  String nameUpper = fullName.toUpperCase();

  for (int i = 0; i < nameUpper.length; i++) {
    totalSum += _getLetterValue(nameUpper[i]);
  }
  return _reduceToSingleDigitOrMaster(totalSum);
}

// Provides a list of generally compatible numbers for a given Life Path Number
// Note: Compatibility rules can vary between numerologists. This is a common set.
// Master numbers often share traits with their single-digit sum (11->2, 22->4, 33->6) for compatibility.
List<int> _getFriendlyNumbers(int lifePathNumber) {
   // Treat master numbers like their single digit sum for compatibility checking
   int compatibilityBase = switch (lifePathNumber) {
     11 => 2,
     22 => 4,
     33 => 6,
     _ => lifePathNumber,
   };

  switch (compatibilityBase) {
    case 1: return [1, 2, 3, 5, 9]; // Ambitious, good with adaptable/creative/freedom-loving/humanitarian
    case 2: return [1, 2, 3, 4, 6, 8, 9]; // Diplomatic, compatible with many
    case 3: return [1, 2, 3, 5, 6, 9]; // Creative, good with ambitious/diplomatic/freedom-loving/nurturing/humanitarian
    case 4: return [2, 4, 6, 7, 8]; // Practical, good with diplomatic/stable/nurturing/introspective/materialistic
    case 5: return [1, 3, 5, 6, 7]; // Freedom-loving, good with ambitious/creative/nurturing/introspective
    case 6: return [2, 3, 4, 5, 6, 8, 9]; // Nurturing, compatible with many
    case 7: return [4, 5, 7]; // Introspective, good with practical/freedom-loving
    case 8: return [2, 4, 6, 8]; // Materialistic/powerful, good with diplomatic/practical/nurturing
    case 9: return [1, 2, 3, 6, 9]; // Humanitarian, good with ambitious/diplomatic/creative/nurturing
    default: return []; // Should not happen for 1-9
  }
}


// --- Main Suggestion Function ---

/// Provides numerological analysis and mobile number suggestions.
///
/// Args:
///   fullName: The person's full birth name.
///   dob: The person's date of birth.
///   currentMobileNumber: The person's current mobile number as a string.
///
/// Returns:
///   A Map containing the analysis and suggestions.
Map<String, dynamic> getNumerologyMobileSuggestion({
  required String fullName,
  required DateTime dob,
  required String currentMobileNumber,
}) {
  if (fullName.trim().isEmpty) {
    return {'error': 'Full name cannot be empty.'};
  }
  if (currentMobileNumber.replaceAll(RegExp(r'\D'), '').isEmpty) {
     return {'error': 'Mobile number does not contain any digits.'};
  }


  // 1. Calculate Core Numbers
  int lifePathNumber = calculateLifePathNumber(dob);
  int expressionNumber = calculateExpressionNumber(fullName);

  // 2. Calculate Current Mobile Number Sum
  int mobileSum = _calculateNumberStringSum(currentMobileNumber);
  int reducedMobileSum = _reduceToSingleDigit(mobileSum); // Mobile sums are typically reduced to single digits

  // 3. Determine Recommended Sums (Based primarily on Life Path Number)
  List<int> recommendedSums = _getFriendlyNumbers(lifePathNumber);

  // 4. Generate Suggestion Message
  String suggestion;
  bool isCurrentNumberCompatible = recommendedSums.contains(reducedMobileSum);

  if (isCurrentNumberCompatible) {
    suggestion = "Your current mobile number's sum ($reducedMobileSum) is considered compatible and harmonious with your Life Path number ($lifePathNumber).";
  } else {
    suggestion = "Your current mobile number's sum ($reducedMobileSum) is not typically considered the most harmonious with your Life Path number ($lifePathNumber). "
                 "According to numerology, numbers that sum and reduce to ${recommendedSums.join(', ')} might be more supportive for you. "
                 "Consider looking for a mobile number where the digits add up to one of these recommended numbers if you wish to align with this principle.";
  }

  // 5. Format Output
  String dobFormatted = DateFormat('yyyy-MM-dd').format(dob); // For display

  return {
    'disclaimer': 'Numerology suggestions are based on belief systems and are not scientifically verified. Practical availability of specific number sums may be limited.',
    'fullName': fullName,
    'dateOfBirth': dobFormatted,
    'lifePathNumber': lifePathNumber,
    'expressionNumber': expressionNumber,
    'currentMobileNumber': currentMobileNumber,
    'currentMobileNumberSum': mobileSum,
    'currentMobileNumberReducedSum': reducedMobileSum,
    'recommendedMobileNumberSums': recommendedSums,
    'isCurrentSumCompatible': isCurrentNumberCompatible,
    'suggestion': suggestion,
  };
}

// --- Example Usage ---
void main() {
  // Example 1: John Doe, born Aug 15, 1990
  DateTime johnsDob = DateTime(2009, 8, 29);
  String johnsName = "Bhaskar Acharya";
  String johnsMobile = "98153292228"; // Sum = 45 => Reduced = 9

  Map<String, dynamic> johnsResult = getNumerologyMobileSuggestion(
    fullName: johnsName,
    dob: johnsDob,
    currentMobileNumber: johnsMobile,
  );

  print("--- Analysis for ${johnsResult['fullName']} ---");
  print("Date of Birth: ${johnsResult['dateOfBirth']}");
  print("Life Path Number: ${johnsResult['lifePathNumber']}");   // Should be 33 (Master)
  print("Expression Number: ${johnsResult['expressionNumber']}"); // J=1 O=6 H=8 N=5 (20) + D=4 O=6 E=5 (15) = 35 => 8
  print("Current Mobile Number: ${johnsResult['currentMobileNumber']}");
  print("Mobile Number Sum: ${johnsResult['currentMobileNumberSum']} (Reduced: ${johnsResult['currentMobileNumberReducedSum']})"); // 45 -> 9
  print("Recommended Mobile Sums (based on Life Path 33 -> 6): ${johnsResult['recommendedMobileNumberSums']}"); // [2, 3, 4, 5, 6, 8, 9]
  print("Is Current Number Compatible?: ${johnsResult['isCurrentSumCompatible']}"); // true (9 is in the list for 6)
  print("Suggestion: ${johnsResult['suggestion']}");
  print("Disclaimer: ${johnsResult['disclaimer']}");
  print("\n" + "="*40 + "\n");


  // Example 2: Jane Smith, born Feb 29, 2000 (Leap Year)
   DateTime janesDob = DateTime(2000, 2, 29);
   String janesName = "Jane Smith";
   String janesMobile = "1111111111"; // Sum = 10 => Reduced = 1

   Map<String, dynamic> janesResult = getNumerologyMobileSuggestion(
    fullName: janesName,
    dob: janesDob,
    currentMobileNumber: janesMobile,
  );

   print("--- Analysis for ${janesResult['fullName']} ---");
   print("Date of Birth: ${janesResult['dateOfBirth']}");
   print("Life Path Number: ${janesResult['lifePathNumber']}"); // 29->11, 2, 2+0+0+0=2 => 11+2+2 = 15 => 6
   print("Expression Number: ${janesResult['expressionNumber']}"); // J=1 A=1 N=5 E=5 (12) + S=1 M=4 I=9 T=2 H=8 (24) = 36 => 9
   print("Current Mobile Number: ${janesResult['currentMobileNumber']}");
   print("Mobile Number Sum: ${janesResult['currentMobileNumberSum']} (Reduced: ${janesResult['currentMobileNumberReducedSum']})"); // 10 -> 1
   print("Recommended Mobile Sums (based on Life Path 6): ${janesResult['recommendedMobileNumberSums']}"); // [2, 3, 4, 5, 6, 8, 9]
   print("Is Current Number Compatible?: ${janesResult['isCurrentSumCompatible']}"); // false (1 is not in the list for 6)
   print("Suggestion: ${janesResult['suggestion']}");
   print("Disclaimer: ${janesResult['disclaimer']}");

}
Updated on