//
//  String+Extensions.swift
//  AppClientBaseSwift
//
//  String utility extensions
//  Các extension tiện ích cho String
//

import Foundation

// MARK: - Localization
// Đa ngôn ngữ

extension String {

    /// Get localized string
    /// Lấy chuỗi đã bản địa hóa
    var localized: String {
        NSLocalizedString(self, comment: "")
    }

    /// Get localized string with arguments
    /// Lấy chuỗi đã bản địa hóa với tham số
    /// - Parameter arguments: Format arguments / Các tham số format
    /// - Returns: Localized formatted string / Chuỗi đã format và bản địa hóa
    func localized(with arguments: CVarArg...) -> String {
        String(format: localized, arguments: arguments)
    }
}

// MARK: - Validation
// Kiểm tra hợp lệ

extension String {

    /// Check if string is valid email
    /// Kiểm tra chuỗi có phải email hợp lệ
    var isValidEmail: Bool {
        let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
        let emailPredicate = NSPredicate(format: "SELF MATCHES %@", emailRegex)
        return emailPredicate.evaluate(with: self)
    }

    /// Check if string is valid phone number (Vietnam)
    /// Kiểm tra chuỗi có phải số điện thoại hợp lệ (Việt Nam)
    var isValidVietnamesePhone: Bool {
        let phoneRegex = "^(0|\\+84)(3|5|7|8|9)[0-9]{8}$"
        let phonePredicate = NSPredicate(format: "SELF MATCHES %@", phoneRegex)
        return phonePredicate.evaluate(with: self)
    }

    /// Check if string is valid password (min 8 chars, 1 uppercase, 1 lowercase, 1 number)
    /// Kiểm tra mật khẩu hợp lệ (tối thiểu 8 ký tự, 1 chữ hoa, 1 chữ thường, 1 số)
    var isValidPassword: Bool {
        let passwordRegex = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)[a-zA-Z\\d@$!%*?&]{8,}$"
        let passwordPredicate = NSPredicate(format: "SELF MATCHES %@", passwordRegex)
        return passwordPredicate.evaluate(with: self)
    }

    /// Trimmed string (no leading/trailing whitespace)
    /// Chuỗi đã loại bỏ khoảng trắng đầu/cuối
    var trimmed: String {
        trimmingCharacters(in: .whitespacesAndNewlines)
    }

    /// Check if string is empty or whitespace only
    /// Kiểm tra chuỗi rỗng hoặc chỉ có khoảng trắng
    var isBlank: Bool {
        trimmed.isEmpty
    }
}

// MARK: - Formatting
// Định dạng

extension String {

    /// Mask email for privacy (e.g., "j***@example.com")
    /// Ẩn email cho bảo mật (vd: "j***@example.com")
    var maskedEmail: String {
        guard isValidEmail else { return self }

        let components = split(separator: "@")
        guard components.count == 2 else { return self }

        let localPart = String(components[0])
        let domain = String(components[1])

        if localPart.count <= 2 {
            return "\(localPart.prefix(1))***@\(domain)"
        }

        return "\(localPart.prefix(1))***\(localPart.suffix(1))@\(domain)"
    }

    /// Mask phone number for privacy (e.g., "****1234")
    /// Ẩn số điện thoại cho bảo mật (vd: "****1234")
    var maskedPhone: String {
        guard count >= 4 else { return self }
        let lastFour = suffix(4)
        let masked = String(repeating: "*", count: count - 4)
        return masked + lastFour
    }

    /// Format as currency (Vietnamese Dong)
    /// Định dạng tiền tệ (Đồng Việt Nam)
    /// - Parameter amount: Amount to format / Số tiền cần định dạng
    /// - Returns: Formatted currency string / Chuỗi tiền tệ đã định dạng
    static func formatVND(_ amount: Double) -> String {
        let formatter = NumberFormatter()
        formatter.numberStyle = .currency
        formatter.currencyCode = "VND"
        formatter.currencySymbol = "₫"
        formatter.maximumFractionDigits = 0
        return formatter.string(from: NSNumber(value: amount)) ?? "\(Int(amount))₫"
    }
}

// MARK: - URL Helpers
// Các helper URL

extension String {

    /// Convert to URL if valid
    /// Chuyển đổi thành URL nếu hợp lệ
    var asURL: URL? {
        URL(string: self)
    }

    /// URL encoded string
    /// Chuỗi đã mã hóa URL
    var urlEncoded: String {
        addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? self
    }
}

// MARK: - Subscript
// Truy cập ký tự

extension String {

    /// Safe subscript access by index
    /// Truy cập an toàn theo index
    /// - Parameter index: Character index / Index ký tự
    subscript(safe index: Int) -> Character? {
        guard index >= 0, index < count else { return nil }
        return self[self.index(startIndex, offsetBy: index)]
    }

    /// Subscript access by range
    /// Truy cập theo range
    /// - Parameter range: Range of characters / Range các ký tự
    subscript(range: Range<Int>) -> String {
        let startIndex = self.index(self.startIndex, offsetBy: max(0, range.lowerBound))
        let endIndex = self.index(self.startIndex, offsetBy: min(count, range.upperBound))
        return String(self[startIndex..<endIndex])
    }
}
