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']}");
}