/**
 * FRONTEND INTERNATIONALIZATION
 *
 * Architecture: English source keys -> locale-specific translation maps.
 *
 * HOW IT WORKS:
 * - All widget UI strings use t('English text')
 * - hebrewTranslations provides Hebrew for he/he_IL locales
 * - English is the source language, so there is no en_US map
 * - Missing translations fall back to the English source key
 *
 * ADDING A NEW LANGUAGE (for example, French):
 * 1. Create a frenchTranslations object with the same keys as hebrewTranslations
 * 2. In initTranslations(), add locale handling for fr locales
 * 3. Future t() calls will automatically use the new language
 *
 * ADDING A NEW STRING:
 * 1. Use t('Clear English text') in the component
 * 2. Add 'Clear English text': ['Hebrew translation'] to hebrewTranslations
 * 3. Future languages can add the same key to their translation maps
 *
 * @package BoostBot
 * @since 1.7.0
 */
import { __, _n, _x, sprintf as wpSprintf, setLocaleData } from '@wordpress/i18n';

// Text domain constant
const DOMAIN = 'boostbot';

// Hebrew translations for frontend widget
const hebrewTranslations = {
  '': {
    domain: 'boostbot',
    lang: 'he_IL',
    'plural-forms': 'nplurals=2; plural=(n != 1);',
  },
  'BoostBot': ['בוסטבוט'],
  'Typing...': ['מקליד...'],
  'Typing': ['מקליד'],
  'Online': ['מחובר'],
  'Clear conversation?': ['לנקות שיחה?'],
  'Clear the conversation?': ['לנקות את השיחה?'],
  'Clear conversation': ['נקה שיחה'],
  'Clear chat': ['נקה צ\'אט'],
  'Minimize': ['מזער'],
  'Close chat': ['סגור צ\'אט'],
  'Close': ['סגור'],
  'Write a message...': ['כתיבת הודעה...'],
  'Write a message': ['כתיבת הודעה'],
  'Send message': ['שלח הודעה'],
  'seconds': ['שניות'],
  'Enter to send • Shift+Enter for new line': ['Enter לשליחה • Shift+Enter לשורה חדשה'],
  'Frequently Asked Questions:': ['שאלות נפוצות:'],
  'Useful Information:': ['מידע שימושי:'],
  'Our Contacts:': ['אנשי הקשר שלנו:'],
  'Preparing content...': ['מכין תוכן...'],
  'What are you interested in knowing?': ['במה אתה מעוניין לדעת?'],
  'Price': ['מחיר'],
  'Could not book appointment': ['לא ניתן לקבוע פגישה'],
  'Full Name': ['שם מלא'],
  'Your full name': ['השם המלא שלך'],
  'Email Address': ['כתובת אימייל'],
  'Phone Number': ['מספר טלפון'],
  'Message': ['הודעה'],
  'How can we help you?': ['איך נוכל לעזור לך?'],
  'Send': ['שלח'],
  'Please fill in all required fields': ['אנא מלא את כל השדות הנדרשים'],
  'Thank you! We received your message.': ['תודה! קיבלנו את הודעתך.'],
  'An error occurred. Please try again.': ['אירעה שגיאה. אנא נסה שוב.'],
  'Too many requests. Please wait a moment and try again.': ['יותר מדי בקשות. אנא המתינו רגע ונסו שוב.'],
  'Select Date': ['בחר תאריך'],
  'Select Time': ['בחר שעה'],
  'Your Details': ['הפרטים שלך'],
  'Book Appointment': ['קבע פגישה'],
  'Sunday': ['ראשון'],
  'Monday': ['שני'],
  'Tuesday': ['שלישי'],
  'Wednesday': ['רביעי'],
  'Thursday': ['חמישי'],
  'Friday': ['שישי'],
  'Saturday': ['שבת'],
  'Morning': ['בוקר'],
  'Afternoon': ['אחה"צ'],
  'Evening': ['ערב'],
  'Available': ['זמין'],
  'Not Available': ['לא זמין'],
  'Selected': ['נבחר'],
  'Very Satisfied': ['מרוצה מאוד'],
  'Satisfied': ['מרוצה'],
  'Neutral': ['ניטרלי'],
  'Unsatisfied': ['לא מרוצה'],
  'Very Unsatisfied': ['מאוד לא מרוצה'],
  'Submit Feedback': ['שלח משוב'],
  'Thank you for your feedback!': ['תודה על המשוב!'],
  'Add to Cart': ['הוסף לעגלה'],
  'In Stock': ['במלאי'],
  'Out of Stock': ['אזל מהמלאי'],
  'Sale': ['מבצע'],
  'View Product': ['צפה במוצר'],
  'Call Now': ['התקשר עכשיו'],
  'WhatsApp': ['וואטסאפ'],
  'Send Email': ['שלח אימייל'],
  'Learn More': ['למידע נוסף'],
  'Get Started': ['התחל'],
  'Bundle': ['חבילה'],
  'Save': ['חסוך'],
  'Total': ['סה"כ'],
  'Add Bundle to Cart': ['הוסף חבילה לעגלה'],
  'Products in this bundle:': ['מוצרים בחבילה זו:'],
  'Special Offer': ['הצעה מיוחדת'],
  'Limited Time': ['זמן מוגבל'],
  'items': ['פריטים'],
  'item': ['פריט'],
  'Loading...': ['טוען...'],
  'Error': ['שגיאה'],
  'Retry': ['נסה שוב'],
  'Back': ['חזרה'],
  'Next': ['הבא'],
  'Previous': ['הקודם'],
  'Step': ['שלב'],
  'of': ['מתוך'],
  'Required': ['חובה'],
  'Optional': ['אופציונלי'],
  'This field is required': ['שדה זה הוא חובה'],
  'Invalid email address': ['כתובת אימייל לא תקינה'],
  'Invalid phone number': ['מספר טלפון לא תקין'],
  'Submission error, please try again': ['שגיאה בשליחה, אנא נסה שוב'],
  'Submit': ['שלח'],
  'Cancel': ['ביטול'],
  'Sending...': ['שולח...'],
  'Success!': ['הצלחה!'],
  'Type a message...': ['כתיבת הודעה...'],
  'Thinking...': ['חושב...'],
  'Schedule a Call': ['קבע שיחה'],
  'Schedule a Meeting': ['קבע פגישה'],
  'Added to cart!': ['נוסף לעגלה!'],
  'View Details': ['צפה בפרטים'],
  'Call': ['התקשר'],
  'Watch Now': ['צפה עכשיו'],
  'Open in YouTube': ['פתח ב-YouTube'],
  'Select an agent to chat:': ['בחר נציג לשיחה:'],
  'Start chat with': ['התחל שיחה עם'],
  'No contacts configured': ['לא הוגדרו אנשי קשר'],
  'Click to enlarge': ['לחץ להגדלה'],
  'Building your bundle...': ['בונה את החבילה שלך...'],
  'One moment...': ['רגע אחד...'],
  'The perfect bundle for you!': ['החבילה המושלמת עבורך!'],
  'Original Price': ['מחיר מקורי'],
  'Bundle Price': ['מחיר חבילה'],
  'Savings of': ['חיסכון של'],
  'Try Again': ['נסה שוב'],
  'To Cart': ['לעגלה'],
  'Continue Browsing': ['המשך גלישה'],
  'Request Different Bundle': ['בקש חבילה אחרת'],
  'FAQ': ['שאלות נפוצות'],
  'Useful Information': ['מידע שימושי'],
  'Our Contacts': ['אנשי הקשר שלנו'],
  "What interests you?": ['מה מעניין אותך?'],
  'Tell us more...': ['ספר לנו עוד...'],
  'Meeting scheduled successfully!': ['הפגישה נקבעה בהצלחה!'],
  'Confirmation sent to:': ['אישור נשלח ל:'],
  'Error scheduling meeting': ['שגיאה בקביעת הפגישה'],
  'Sorry, an error occurred. Please try again later.': ['מצטערים, אירעה שגיאה. אנא נסו שוב מאוחר יותר.'],
  'Leave your details': ['השאירו פרטים'],
  'We will get back to you shortly': ['נחזור אליכם בהקדם'],
  'Name': ['שם'],
  'Email': ['אימייל'],
  'Phone': ['טלפון'],
  'Contact Us': ['צרו קשר'],
  'Book an Appointment': ['קביעת פגישה'],
  'Hello, I would like to receive more information': ['שלום, אשמח לקבל מידע נוסף'],
  'Send WhatsApp Message': ['שלח הודעה בוואטסאפ'],
  'Gallery': ['גלריה'],
  'Watch Video': ['צפו בסרטון'],
  'We would love to hear from you': ['נשמח לשמוע מכם'],
  'Chat is currently unavailable': ['הצ\'אט לא זמין כרגע'],
  'Try refreshing the page or come back later': ['נסו לרענן את הדף או לחזור מאוחר יותר'],
  'Refresh': ['רענן'],
  'Chat with bot': ['צ\'אט עם הבוט'],
  'Test mode': ['מצב בדיקה'],
  'Open chat': ['פתח צ\'אט'],
  'Hello! How can I help you?': ['שלום! איך אפשר לעזור לך?'],
  'Form submitted successfully!': ['הטופס נשלח בהצלחה!'],
  'Send feedback': ['שלח משוב'],
  'Leave details': ['להשארת פרטים'],
  'Send WhatsApp': ['שלחו וואטסאפ'],
  'Book appointment': ['קבעו פגישה'],
  'Get coupon': ['קבלו קופון'],
  'Copy code': ['העתק קוד'],
  'View gallery': ['לגלריה'],
  'Watch video': ['לסרטון'],
  '{count} products selected just for you': ['{count} מוצרים נבחרו במיוחד בשבילך'],
  'Original price:': ['מחיר מקורי:'],
  'Bundle price:': ['מחיר חבילה:'],
  'Coupon "{code}" applied automatically!': ['קופון "{code}" יוחל אוטומטית!'],
  'extra discount': ['הנחה נוספת'],
  'Adding...': ['מוסיף...'],
  'Add to cart': ['הוסף לסל'],
  'Request another bundle': ['בקש חבילה אחרת'],
  'Another bundle': ['חבילה אחרת'],
  'Open in store': ['פתח בחנות'],
  'Error building bundle': ['שגיאה בבניית החבילה'],
  'Bundle added to cart!': ['החבילה נוספה לסל!'],
  'Error adding to cart': ['שגיאה בהוספה לסל'],
  'Preparing your bundle...': ['מכין את החבילה שלך...'],
  'Just a moment': ['רגע קטן'],
  'No matching products found. Try broadening your criteria.': ['לא מצאנו מוצרים מתאימים. נסה להרחיב את הקריטריונים.'],
  'Updating bundle...': ['מעדכן את החבילה...'],
  'Updating...': ['מעדכן...'],
  'Swap': ['החלף'],
  'Swap item': ['החלף פריט'],
  'Remove': ['הסר'],
  'Refreshing...': ['מרענן...'],
  'Could not swap bundle item': ['לא ניתן היה להחליף את פריט החבילה'],
  'Something went wrong. Please try again.': ['משהו השתבש. נסה שוב.'],
  'Try again': ['נסה שוב'],
  'Excellent!': ['מעולה!'],
  'Go to cart': ['לסל הקניות'],
  'Continue browsing': ['המשך לגלוש'],
  'discount': ['הנחה'],
  'Until': ['עד'],
  'Over': ['מעל'],
  'Copied!': ['הועתק!'],
  'Code copied!': ['הקוד הועתק!'],
  'Apply to Cart': ['החל לעגלה'],
  'Applying...': ['מחיל...'],
  'Coupon applied!': ['הקופון הופעל!'],
  'Failed to apply coupon': ['הפעלת הקופון נכשלה'],
  'Failed to remove coupon': ['הסרת הקופון נכשלה'],
  'Coupon removed': ['הקופון הוסר'],
  'Applied via bundle': ['הוחל דרך החבילה'],
  'Already applied': ['כבר הופעל'],
  'Ready to apply': ['מוכן להפעלה'],
  'Spend {amount} more': ['הוסף עוד {amount}'],
  'Expires soon': ['פג בקרוב'],
  'Free shipping': ['משלוח חינם'],
  'Up to': ['עד'],
  'Eligible products': ['מוצרים זכאים'],
  'Eligible categories': ['קטגוריות זכאיות'],
  '{count} uses left': ['נותרו {count} שימושים'],
  'Removing...': ['מסיר...'],
  'Expired': ['פג תוקף'],
  'Cart is empty': ['העגלה ריקה'],
  'Add products to continue': ['הוסיפו מוצרים כדי להמשיך'],
  'in cart': ['בסל'],
  'Total:': ['סה"כ:'],
  'more items': ['פריטים נוספים'],
  'Checkout': ['לתשלום'],
  'View cart': ['צפה בעגלה'],
  'Your cart': ['העגלה שלך'],
  'Open cart': ['פתח עגלה'],
  'Close cart': ['סגור עגלה'],
  'Continue chat': ['המשך בצ\'אט'],
  'Updating cart...': ['מעדכן עגלה...'],
  'Remove item': ['הסר פריט'],
  'Decrease quantity': ['הפחת כמות'],
  'Increase quantity': ['הגדל כמות'],
  'Failed to load cart': ['טעינת העגלה נכשלה'],
  'Failed to add item to cart': ['הוספת הפריט לעגלה נכשלה'],
  'Failed to update cart': ['עדכון העגלה נכשל'],
  'Failed to remove item from cart': ['הסרת הפריט מהעגלה נכשלה'],
  'Cart is unavailable': ['העגלה אינה זמינה כרגע'],
  'Received': ['התקבלה'],
  'Processing': ['בטיפול'],
  'Shipped': ['נשלחה'],
  'Delivered': ['נמסרה'],
  'Order': ['הזמנה'],
  'Shipping details': ['פרטי משלוח'],
  'Track shipment': ['עקוב אחרי המשלוח'],
  'View order': ['צפה בהזמנה'],
  'Sold out': ['אזל'],
  'Add': ['הוסף'],
  'View': ['צפה'],
  'Wait! Before you leave... I have a special offer for you': ['רגע! לפני שאתה עוזב... יש לי הצעה מיוחדת בשבילך'],
  "I see you're interested! I have something that can help you": ['רואה שאתה מתעניין! יש לי משהו שיכול לעזור לך'],
  "Hi! I'd love to help you find what you're looking for": ['היי! אשמח לעזור לך למצוא את מה שאתה מחפש'],
  'Great to see you again!': ['שמח לראות אותך שוב!'],
  'How can I help today?': ['במה אוכל לעזור היום?'],
  'I noticed you have items in your cart': ['שמתי לב שיש לך מוצרים בעגלה'],
  'Can I help complete your purchase?': ['אפשר לעזור להשלים את הרכישה?'],
  'Oops! Something went wrong': ['אופס! משהו השתבש'],
  'We apologize for the inconvenience': ['אנחנו מתנצלים על אי הנוחות'],
  'Do you have more questions? Happy to help': ['יש לך שאלות נוספות? אשמח לעזור'],
  'Would you like me to connect you with a representative?': ['אם תרצה, אשמח לחבר אותך לנציג שלנו'],
  'Was this information helpful?': ['האם המידע עזר לך?'],
  'Form submission failed (HTTP %s)': ['שליחת הטופס נכשלה (HTTP %s)'],
};

// Initialize translations based on locale
function initTranslations() {
  // Check both boostbot_config and boostbotConfig for locale
  const config = (window as unknown as { 
    boostbot_config?: { locale?: string };
    boostbotConfig?: { locale?: string };
  });
  const locale = config.boostbot_config?.locale || config.boostbotConfig?.locale || 'en_US';
  
  // Only load Hebrew translations if locale is Hebrew
  if (locale.startsWith('he')) {
    setLocaleData(hebrewTranslations, DOMAIN);
  }
}

// Initialize on module load
initTranslations();

/**
 * Reload the translation map after a runtime language change (SPA navigation /
 * Polylang AJAX). initTranslations() only runs once at module load, so without
 * this the t() map is frozen to the first-seen locale. setLocaleData replaces the
 * domain's data, so switching to a non-Hebrew locale resets to the English source
 * keys (which t() falls back to when a key is absent).
 *
 * @param locale - Locale code, e.g. 'he', 'he_IL', 'en', 'en_US'
 */
export function reloadTranslations(locale: string): void {
  if (locale.startsWith('he')) {
    setLocaleData(hebrewTranslations, DOMAIN);
  } else {
    // Reset prior (e.g. Hebrew) data to an empty map so t() uses the source keys.
    setLocaleData({ '': { domain: DOMAIN, 'plural-forms': 'nplurals=2; plural=(n != 1);' } }, DOMAIN);
  }
}

/**
 * Translate a string
 * @param text - String to translate (English source)
 * @returns Translated string
 */
export function t(text: string): string {
  return __(text, DOMAIN);
}

/**
 * Translate a string with context
 * @param text - String to translate
 * @param context - Context for translators
 * @returns Translated string
 */
export function tx(text: string, context: string): string {
  return _x(text, context, DOMAIN);
}

/**
 * Translate singular/plural form
 * @param single - Singular form (English)
 * @param plural - Plural form (English)
 * @param count - Number for determining form
 * @returns Translated string
 */
export function tn(single: string, plural: string, count: number): string {
  return _n(single, plural, count, DOMAIN);
}

/**
 * Format a translated string with variables
 * @param format - Format string (use %s for strings, %d for numbers)
 * @param args - Values to insert
 * @returns Formatted string
 */
export function sprintf(format: string, ...args: (string | number)[]): string {
  // @ts-expect-error - wpSprintf's type definition is not compatible with rest parameters
  return wpSprintf(format, ...args);
}

/**
 * Translate and format plural string
 * @param single - Singular form with %d placeholder
 * @param plural - Plural form with %d placeholder
 * @param count - Number
 * @returns Translated and formatted string
 */
export function tPlural(single: string, plural: string, count: number): string {
  return sprintf(tn(single, plural, count), count);
}

/**
 * Get direction-aware class name
 * @param ltrClass - Class for LTR
 * @param rtlClass - Class for RTL
 * @returns Appropriate class based on current direction
 */
export function dirClass(ltrClass: string, rtlClass: string): string {
  const config = (window as unknown as { boostbotConfig?: { isRtl?: boolean } }).boostbotConfig;
  const isRtl = config?.isRtl ?? false;
  return isRtl ? rtlClass : ltrClass;
}

/**
 * Check if current locale is RTL
 */
export function isRtl(): boolean {
  const config = (window as unknown as { boostbotConfig?: { isRtl?: boolean } }).boostbotConfig;
  return config?.isRtl ?? false;
}

/**
 * Get current direction
 */
export function getDirection(): 'ltr' | 'rtl' {
  return isRtl() ? 'rtl' : 'ltr';
}

/**
 * Common translated strings for widgets
 */
export const widgetStrings = {
  // Form validation
  get required() { return t('This field is required'); },
  get invalidEmail() { return t('Invalid email address'); },
  get invalidPhone() { return t('Invalid phone number'); },
  get submissionError() { return t('Submission error, please try again'); },
  
  // Form actions
  get send() { return t('Send'); },
  get submit() { return t('Submit'); },
  get cancel() { return t('Cancel'); },
  get close() { return t('Close'); },
  
  // Status
  get loading() { return t('Loading...'); },
  get sending() { return t('Sending...'); },
  get success() { return t('Success!'); },
  get error() { return t('Error'); },
  
  // Chat
  get typeMessage() { return t('Type a message...'); },
  get thinking() { return t('Thinking...'); },
  
  // Widgets
  get scheduleCall() { return t('Schedule a Call'); },
  get scheduleMeeting() { return t('Schedule a Meeting'); },
  get addToCart() { return t('Add to Cart'); },
  get addedToCart() { return t('Added to cart!'); },
  get viewDetails() { return t('View Details'); },
  get call() { return t('Call'); },
  get message() { return t('Message'); },
  get watchNow() { return t('Watch Now'); },
  get openInYouTube() { return t('Open in YouTube'); },
  get selectAgent() { return t('Select an agent to chat:'); },
  get startChat() { return t('Start chat with'); },
  get noContactsConfigured() { return t('No contacts configured'); },
  get clickToEnlarge() { return t('Click to enlarge'); },
  
  // Bundle
  get buildingBundle() { return t('Building your bundle...'); },
  get oneMoreMoment() { return t('One moment...'); },
  get perfectBundle() { return t('The perfect bundle for you!'); },
  get originalPrice() { return t('Original Price'); },
  get bundlePrice() { return t('Bundle Price'); },
  get savingsOf() { return t('Savings of'); },
  get tryAgain() { return t('Try Again'); },
  get toCart() { return t('To Cart'); },
  get continueBrowsing() { return t('Continue Browsing'); },
  get requestDifferentBundle() { return t('Request Different Bundle'); },
  
  // Opening screen
  get faq() { return t('FAQ'); },
  get usefulInfo() { return t('Useful Information'); },
  get ourContacts() { return t('Our Contacts'); },
  get whatInterestsYou() { return t("What interests you?"); },
  get preparingContent() { return t('Preparing content...'); },
  
  // Survey
  get submitFeedback() { return t('Submit Feedback'); },
  get thankYouFeedback() { return t('Thank you for your feedback!'); },
  get tellUsMore() { return t('Tell us more...'); },
  
  // Calendar
  get meetingScheduled() { return t('Meeting scheduled successfully!'); },
  get confirmationSent() { return t('Confirmation sent to:'); },
  get schedulingError() { return t('Error scheduling meeting'); },
};

