import { apiClient, withAuth } from "./client"; import { API_ENDPOINTS } from "../config/api"; export type MembershipType = "basic" | "premium" | "vip"; export interface MembershipFeatures { recommendationsPerMonth: number; hydrationTracking: boolean; nutritionTracking: boolean; advancedStatistics: boolean; } const MEMBERSHIP_FEATURES: Record = { basic: { recommendationsPerMonth: 1, hydrationTracking: false, nutritionTracking: false, advancedStatistics: false, }, premium: { recommendationsPerMonth: -1, hydrationTracking: true, nutritionTracking: true, advancedStatistics: true, }, vip: { recommendationsPerMonth: -1, hydrationTracking: true, nutritionTracking: true, advancedStatistics: true, }, }; interface UsersListResponse { success?: boolean; data?: { users?: Array<{ id: string; role: string; client?: { membershipType?: MembershipType; } | null; }>; }; users?: Array<{ id: string; role: string; client?: { membershipType?: MembershipType; } | null; }>; } interface MembershipFeaturesResponse { success: boolean; data: { membershipType: MembershipType; currentFeatures: MembershipFeatures; plans: Record; }; } function isMembershipType(value: unknown): value is MembershipType { return value === "basic" || value === "premium" || value === "vip"; } export async function getCurrentMembershipType( userId: string, token: string | null, ): Promise { if (!token || !userId) { return "basic"; } const response = await apiClient.get( API_ENDPOINTS.USERS.LIST, withAuth(token), ); const payload = response.data; const users = payload.data?.users ?? payload.users ?? []; const currentUser = users.find((user) => user.id === userId); if (!currentUser || currentUser.role !== "client") { return "vip"; } const membershipType = currentUser.client?.membershipType; return isMembershipType(membershipType) ? membershipType : "basic"; } export function getMembershipFeatures( membershipType: MembershipType, ): MembershipFeatures { return MEMBERSHIP_FEATURES[membershipType]; } export async function getCurrentMembershipFeaturesFromServer( token: string | null, ): Promise<{ membershipType: MembershipType; features: MembershipFeatures; }> { if (!token) { return { membershipType: "basic", features: MEMBERSHIP_FEATURES.basic, }; } const response = await apiClient.get( API_ENDPOINTS.MEMBERSHIP.FEATURES, withAuth(token), ); const data = response.data?.data; if (!data) { return { membershipType: "basic", features: MEMBERSHIP_FEATURES.basic, }; } return { membershipType: data.membershipType, features: data.currentFeatures, }; }