import Foundation

final class TrialBackendTranslateService {
    static let shared = TrialBackendTranslateService()

    private init() {}

    private let baseURL = "https://yourdomain.com/lingosnap-api"
    private let appSecret = "CHANGE_THIS_TO_A_LONG_RANDOM_SECRET"

    enum BackendError: LocalizedError {
        case invalidURL
        case trialEnded(String)
        case apiError(String)

        var errorDescription: String? {
            switch self {
            case .invalidURL:
                return "Invalid backend URL."
            case .trialEnded(let message):
                return message
            case .apiError(let message):
                return message
            }
        }
    }

    func translateTrial(
        text: String,
        target: String = "vi",
        source: String = "auto",
        deviceId: String
    ) async throws -> TrialTranslateResponse {
        guard let url = URL(string: "\(baseURL)/translate_trial.php") else {
            throw BackendError.invalidURL
        }

        let payload: [String: Any] = [
            "device_id": deviceId,
            "text": text,
            "target": target,
            "source": source
        ]

        var request = URLRequest(url: url)
        request.httpMethod = "POST"
        request.timeoutInterval = 20
        request.setValue("application/json", forHTTPHeaderField: "Content-Type")
        request.setValue(appSecret, forHTTPHeaderField: "X-App-Secret")
        request.httpBody = try JSONSerialization.data(withJSONObject: payload)

        let (data, _) = try await URLSession.shared.data(for: request)
        let decoded = try JSONDecoder().decode(TrialTranslateResponse.self, from: data)

        if decoded.success {
            return decoded
        }

        if decoded.code == "TRIAL_LIMIT_REACHED" || decoded.code == "TRIAL_CHAR_LIMIT_REACHED" || decoded.code == "GLOBAL_TRIAL_LIMIT_REACHED" {
            throw BackendError.trialEnded(decoded.message ?? "Free trial ended.")
        }

        throw BackendError.apiError(decoded.message ?? "Translation failed.")
    }
}

struct TrialTranslateResponse: Codable {
    let success: Bool
    let translated: String?
    let engine: String?
    let usedChars: Int?
    let remainingRequests: Int?
    let remainingChars: Int?
    let code: String?
    let message: String?
}
