import { PlanFeature, SessionStore } from '@/state/sessionStore';

import { BLENDED_CREATE_EXPERIMENT_NAME } from './constants';

// Copied rom billing/utils.py
export enum SubscriptionPeriod {
  Monthly = 'month',
  Annual = 'year',
}

// Copied rom billing/utils.py
export enum SubscriptionLevel {
  Basic = 0,
  Student = 5,
  Pro = 10,
  Pro20250501 = 13, // we ran an experiment which didn't take.
  Premier = 30,
}

export const UNDERLYING_PLAN_KEY = {
  premier: 'premier',
  pro: 'pro',
  pro_20250501: 'pro',
  student: 'pro',
  basic: 'basic',
  free: 'free',
} as const;

export function isProOrPremier(session: SessionStore | null) {
  return (
    session?.flags?.['skip-paywall'] ||
    [
      SubscriptionLevel.Premier,
      SubscriptionLevel.Pro,
      SubscriptionLevel.Pro20250501,
      SubscriptionLevel.Student,
    ].includes(session?.subscriptionLevel as any)
  );
}

export const CREDITS_PER_GENERATION = 10;

export const isStaff = (session: SessionStore | null) => {
  return session?.isStaff;
};

export const isSubscriber = (session: SessionStore | null) => {
  if (isStaff(session) || session?.flags?.['skip-paywall']) {
    return true;
  }
  return session?.isSubscriber;
};

export const isFeatureEnabledForPlan = (
  session: SessionStore | null,
  feature: PlanFeature
) => {
  if (isStaff(session) || session?.flags?.['skip-paywall']) {
    return true;
  }
  const usagePlanFeatures = session?.usagePlanFeatures;
  return usagePlanFeatures?.some((f) => f.name === feature);
};

export const isCoverFeatureEnabled = (session: SessionStore | null) =>
  isFeatureEnabledForPlan(session, PlanFeature.Cover) ||
  session?.flags?.['remix'];

export const isPersonaFeatureEnabled = (session: SessionStore | null) =>
  isFeatureEnabledForPlan(session, PlanFeature.Persona);

export const isMyStreamFeatureEnabled = (session: SessionStore | null) => {
  return session?.flags?.['my-stream'];
};

// TODO: Change to accept the statsig client instead of SessionStore
export const isProjectsFeatureEnabled = (session: SessionStore | null) => {
  return session?.flags?.['create-projects'];
};

export const isNegativeTagsFeatureEnabled = (session: SessionStore | null) => {
  return isFeatureEnabledForPlan(session, PlanFeature.NegativeTags);
};

export const getOutOfCreditsMessage = (session: SessionStore | null) => {
  return !session?.roles['pro']
    ? "You're out of free songs for today, but you'll get 50 more every day. Click here to upgrade your plan and keep making music."
    : "You're out of credits for today. Click here to upgrade your plan or purchase more credits.";
};

export const canGenerateSong = (session: SessionStore | null) => {
  return session?.credits ? session.credits >= CREDITS_PER_GENERATION : false;
};

export const isHybridModelAvailable = (session: SessionStore | null) => {
  const models = session?.getViewableModels();
  return models?.some((model) => model.major_version === 4) ?? false;
};

export const isVideoGenerationFeatureEnabled = (
  session: SessionStore | null
) => {
  return session?.flags?.['video-generation'];
};

export const isBlendedCreateExperimentEnabled = (
  session: SessionStore | null
) => {
  return !!session?.experiments?.[BLENDED_CREATE_EXPERIMENT_NAME];
};
