// Package i18n provides internationalization for the CLI.
package i18n

// String returns the string representation of the Formality.
func (f Formality) String() string {
	switch f {
	case FormalityInformal:
		return "informal"
	case FormalityFormal:
		return "formal"
	default:
		return "neutral"
	}
}

// String returns the string representation of the TextDirection.
func (d TextDirection) String() string {
	if d == DirRTL {
		return "rtl"
	}
	return "ltr"
}

// String returns the string representation of the PluralCategory.
func (p PluralCategory) String() string {
	switch p {
	case PluralZero:
		return "zero"
	case PluralOne:
		return "one"
	case PluralTwo:
		return "two"
	case PluralFew:
		return "few"
	case PluralMany:
		return "many"
	default:
		return "other"
	}
}

// String returns the string representation of the GrammaticalGender.
func (g GrammaticalGender) String() string {
	switch g {
	case GenderMasculine:
		return "masculine"
	case GenderFeminine:
		return "feminine"
	case GenderCommon:
		return "common"
	default:
		return "neuter"
	}
}

// IsRTLLanguage returns true if the language code uses right-to-left text.
func IsRTLLanguage(lang string) bool {
	// Check exact match first
	if rtlLanguages[lang] {
		return true
	}
	// Check base language (e.g., "ar" for "ar-SA")
	if len(lang) > 2 {
		base := lang[:2]
		return rtlLanguages[base]
	}
	return false
}

// pluralRuleEnglish returns the plural category for English.
// Categories: one (n=1), other.
func pluralRuleEnglish(n int) PluralCategory {
	if n == 1 {
		return PluralOne
	}
	return PluralOther
}

// pluralRuleGerman returns the plural category for German.
// Categories: same as English.
func pluralRuleGerman(n int) PluralCategory {
	return pluralRuleEnglish(n)
}

// pluralRuleFrench returns the plural category for French.
// Categories: one (n=0,1), other.
func pluralRuleFrench(n int) PluralCategory {
	if n == 0 || n == 1 {
		return PluralOne
	}
	return PluralOther
}

// pluralRuleSpanish returns the plural category for Spanish.
// Categories: one (n=1), other.
func pluralRuleSpanish(n int) PluralCategory {
	if n == 1 {
		return PluralOne
	}
	return PluralOther
}

// pluralRuleRussian returns the plural category for Russian.
// Categories: one (n%10=1, n%100!=11), few (n%10=2-4, n%100!=12-14), many (others).
func pluralRuleRussian(n int) PluralCategory {
	mod10 := n % 10
	mod100 := n % 100

	if mod10 == 1 && mod100 != 11 {
		return PluralOne
	}
	if mod10 >= 2 && mod10 <= 4 && (mod100 < 12 || mod100 > 14) {
		return PluralFew
	}
	return PluralMany
}

// pluralRulePolish returns the plural category for Polish.
// Categories: one (n=1), few (n%10=2-4, n%100!=12-14), many (others).
func pluralRulePolish(n int) PluralCategory {
	if n == 1 {
		return PluralOne
	}
	mod10 := n % 10
	mod100 := n % 100
	if mod10 >= 2 && mod10 <= 4 && (mod100 < 12 || mod100 > 14) {
		return PluralFew
	}
	return PluralMany
}

// pluralRuleArabic returns the plural category for Arabic.
// Categories: zero (n=0), one (n=1), two (n=2), few (n%100=3-10), many (n%100=11-99), other.
func pluralRuleArabic(n int) PluralCategory {
	if n == 0 {
		return PluralZero
	}
	if n == 1 {
		return PluralOne
	}
	if n == 2 {
		return PluralTwo
	}
	mod100 := n % 100
	if mod100 >= 3 && mod100 <= 10 {
		return PluralFew
	}
	if mod100 >= 11 && mod100 <= 99 {
		return PluralMany
	}
	return PluralOther
}

// pluralRuleChinese returns the plural category for Chinese.
// Categories: other (no plural distinction).
func pluralRuleChinese(n int) PluralCategory {
	return PluralOther
}

// pluralRuleJapanese returns the plural category for Japanese.
// Categories: other (no plural distinction).
func pluralRuleJapanese(n int) PluralCategory {
	return PluralOther
}

// pluralRuleKorean returns the plural category for Korean.
// Categories: other (no plural distinction).
func pluralRuleKorean(n int) PluralCategory {
	return PluralOther
}

// GetPluralRule returns the plural rule for a language code.
// Falls back to English rules if the language is not found.
func GetPluralRule(lang string) PluralRule {
	if rule, ok := pluralRules[lang]; ok {
		return rule
	}
	// Try base language
	if len(lang) > 2 {
		base := lang[:2]
		if rule, ok := pluralRules[base]; ok {
			return rule
		}
	}
	// Default to English
	return pluralRuleEnglish
}

// GetPluralCategory returns the plural category for a count in the given language.
func GetPluralCategory(lang string, n int) PluralCategory {
	return GetPluralRule(lang)(n)
}
