"use strict";

/**
 * Karma Methods Mixin
 * 
 * Provides methods for karma system management
 */

import { CACHE_TIMES } from './mixinHelpers';
export function OxyServicesKarmaMixin(Base) {
  return class extends Base {
    constructor(...args) {
      super(...args);
    }
    /**
     * Get user karma
     */
    async getUserKarma(userId) {
      try {
        return await this.makeRequest('GET', `/api/karma/${userId}`, undefined, {
          cache: true,
          cacheTTL: 2 * 60 * 1000 // 2 minutes cache
        });
      } catch (error) {
        throw this.handleError(error);
      }
    }

    /**
     * Give karma to user
     */
    async giveKarma(userId, amount, reason) {
      try {
        return await this.makeRequest('POST', `/api/karma/${userId}/give`, {
          amount,
          reason
        }, {
          cache: false
        });
      } catch (error) {
        throw this.handleError(error);
      }
    }

    /**
     * Get user karma total
     * @param userId - The user ID
     * @returns User karma total
     */
    async getUserKarmaTotal(userId) {
      try {
        return await this.makeRequest('GET', `/api/karma/${userId}/total`, undefined, {
          cache: true,
          cacheTTL: CACHE_TIMES.MEDIUM
        });
      } catch (error) {
        throw this.handleError(error);
      }
    }

    /**
     * Get user karma history
     * @param userId - The user ID
     * @param limit - Optional limit for results
     * @param offset - Optional offset for pagination
     * @returns User karma history
     */
    async getUserKarmaHistory(userId, limit, offset) {
      try {
        const params = {};
        if (limit) params.limit = limit;
        if (offset) params.offset = offset;
        return await this.makeRequest('GET', `/api/karma/${userId}/history`, params, {
          cache: true,
          cacheTTL: CACHE_TIMES.MEDIUM
        });
      } catch (error) {
        throw this.handleError(error);
      }
    }

    /**
     * Get karma leaderboard
     * @returns Karma leaderboard
     */
    async getKarmaLeaderboard() {
      try {
        return await this.makeRequest('GET', '/api/karma/leaderboard', undefined, {
          cache: true,
          cacheTTL: CACHE_TIMES.LONG
        });
      } catch (error) {
        throw this.handleError(error);
      }
    }

    /**
     * Get karma rules
     * @returns Karma rules
     */
    async getKarmaRules() {
      try {
        return await this.makeRequest('GET', '/api/karma/rules', undefined, {
          cache: true,
          cacheTTL: CACHE_TIMES.EXTRA_LONG // Rules don't change often
        });
      } catch (error) {
        throw this.handleError(error);
      }
    }
  };
}
//# sourceMappingURL=OxyServices.karma.js.map