// TODO: merge the respective adjectives and genres arrays
import { ControlSliderKey } from '@/state/createV2Store';

const adjectives = [
  'acoustic',
  'aggressive',
  'anthemic',
  'atmospheric',
  'bouncy',
  'chill',
  'dark',
  'dreamy',
  'electronic',
  'emotional',
  'epic',
  'experimental',
  'futuristic',
  'groovy',
  'heartfelt',
  'infectious',
  'melodic',
  'mellow',
  'powerful',
  'psychedelic',
  'romantic',
  'smooth',
  'syncopated',
  'uplifting',
  '',
];

const genres = [
  'afrobeat',
  'anime',
  'ballad',
  'bedroom pop',
  'bluegrass',
  'blues',
  'classical',
  'country',
  'cumbia',
  'dance',
  'dancepop',
  'delta blues',
  'electropop',
  'disco',
  'dream pop',
  'drum and bass',
  'edm',
  'emo',
  'folk',
  'funk',
  'future bass',
  'gospel',
  'grunge',
  'grime',
  'hip hop',
  'house',
  'indie',
  'j-pop',
  'jazz',
  'k-pop',
  'kids music',
  'metal',
  'new jack swing',
  'new wave',
  'opera',
  'pop',
  'punk',
  'raga',
  'rap',
  'reggae',
  'reggaeton',
  'rock',
  'rumba',
  'salsa',
  'samba',
  'sertanejo',
  'soul',
  'synthpop',
  'swing',
  'synthwave',
  'techno',
  'trap',
  'uk garage',
];

const topics = [
  'a bad breakup',
  'finding love on a rainy day',
  'a cozy rainy day',
  'dancing all night long',
  'dancing with you for the last time',
  'not being able to wait to see you again',
  "how you're always there for me",
  "when you're not around",
  'a faded photo on the mantel',
  'a literal banana',
  'wanting to be with you',
  'writing a face-melting guitar solo',
  'the place where we used to go',
  'being trapped in an AI song factory, help!',
];

export const RECOMMEND_STYLES_NUM = 8;
export const COEXISTING_STYLES_NUM = 5;

export const preferredStyles: string[] = [
  'Pop',
  'Rock',
  'Hip Hop',
  'R&B',
  'Electronic',
  'Country',
  'Jazz',
  'Metal',
  'Classical',
  'Reggae',
];

export const curatedStyles: string[] = [
  'Doo-wop',
  'Cumbia',
  'Funk',
  'Synthpop',
  'Tango',
  'Chillwave',
  'Synthwave',
  'Chanson',
  'Lo-Fi',
  'Ska',
  'Shoegaze',
  'Samba',
  'Glitch Hop',
  'Afro-Rock',
  'Hip Hop',
  'Math Rock',
  'Disco',
  'Dream Pop',
  'Trance',
  'Breakbeat',
  'Soul',
  'Techno',
  'Dancehall',
  'Country',
  'Flamenco',
  'Boom bap',
  'Future bass',
  'Afrobeats',
  'Afro-Cuban jazz',
  'City pop',
  'Ambient techno',
  'Swing',
  'Symphonic metal',
  'Americana',
  'Grunge',
  'Brass band',
  'Organic house',
  'Tech house',
  'Electropop',
  'Drill',
  'Barbershop quartet',
  'Chicago Blues',
  'Afroswing',
  'Reggae',
  'Classical',
  'Mariachi',
  'Bachata',
  'Bedroom pop',
  'R&B',
  'Rockabilly',
  'Trap R&B',
  'Amapiano',
  'Surf Rock',
  'Dubstep',
];

export const AUDIO_UPLOAD_TOS_STORAGE_KEY = 'audio-upload-tos-acceptance';
function getRandomElement<T>(array: T[]): T {
  if (array.length === 0) {
    throw new Error('Array must contain at least one element.');
  }

  const randomIndex = Math.floor(Math.random() * array.length);
  return array[randomIndex];
}

export function randomOneBoxPrompt(): string {
  const adjective = getRandomElement(adjectives);
  const genre = getRandomElement(genres);
  const topic = getRandomElement(topics);
  const article = 'aeiou'.includes(adjective[0]) ? 'an' : 'a';
  return `${article} ${adjective} ${genre} song about ${topic}`;
}

export function randomModifiedGenre(): string {
  const adjective = getRandomElement(adjectives);
  const genre = getRandomElement(genres);
  return `${adjective} ${genre}`;
}

export function capitalizeFirstLetter(string: string) {
  return string.charAt(0).toUpperCase() + string.slice(1);
}

export const SECONDARY_GRAY = 'rgba(255, 255, 255, 0.7)';

export const TOOLTIP_BACKGROUND = 'rgba(255, 255, 255, 0.12)';
export const TOOLTIP_BACKGROUND_RESKIN = '#252020';

export const glassmorphicEffect: React.CSSProperties = {
  background: 'rgba(255, 255, 255, 0.005)',
  backdropFilter: 'blur(50px)',
  borderImage: '180deg linear-gradient(#383737, #A19F9D)',
  borderWidth: '0.01px',
  borderStyle: 'solid',
};

export const mobileActionsGlassmorphicEffect: React.CSSProperties = {
  background: 'rgba(0, 0, 0, 0.05)',
  backdropFilter: 'blur(25px)',
};

export const ITEM_HOVER_BACKGROUND = 'rgba(255, 255, 255, 0.08)';

export const MAX_TITLE_CHARS = 80;
export const MAX_IMAGE_PROMPT_CHARS = 200;
export const MAX_CUSTOM_PROMPT_CHARS = 1250;
export const MAX_CUSTOM_PROMPT_CHARS_LONG = 3000;
export const MAX_CUSTOM_PROMPT_CHARS_LONGEST = 5000;

export const MAX_STYLE_CHARS_LONG = 1000;
export const MAX_STYLE_CHARS = 200;
export const MAX_NEGATIVE_STYLE_CHARS = 1000;

export const MAX_GPT_DESCRIPTION_PROMPT_CHARS = 400;

export const CLIENT_STATSIG_SDK_KEY =
  process.env.NEXT_PUBLIC_STATSIG_SDK_KEY ||
  'client-13Ose1nX4Rh9RdJ2tAI3GzXvNIymLwWxQLVagIjSMra';

export const FALLBACK_IMAGE_URL = 'https://cdn1.suno.ai/sAura9.jpg';
export const FALLBACK_AURA_URL = 'https://cdn-o.suno.com/Aura-1-square.png';
export const LIKED_SONGS_PLAYLIST_COVER_URL =
  'https://cdn-o.suno.com/liked-songs-playlist-cover.png';
export const TRUSTED_CDN_HOSTNAME = 'cdn1.suno.ai';
export const ALL_AURA_IMAGE_URLS = [
  'https://cdn1.suno.ai/sAura1.jpg',
  'https://cdn1.suno.ai/sAura2.jpg',
  'https://cdn1.suno.ai/sAura3.jpg',
  'https://cdn1.suno.ai/sAura4.jpg',
  'https://cdn1.suno.ai/sAura5.jpg',
  'https://cdn1.suno.ai/sAura6.jpg',
  'https://cdn1.suno.ai/sAura7.jpg',
  'https://cdn1.suno.ai/sAura8.jpg',
  'https://cdn1.suno.ai/sAura9.jpg',
  'https://cdn1.suno.ai/sAura10.jpg',
  'https://cdn1.suno.ai/sAura11.jpg',
  'https://cdn1.suno.ai/sAura12.jpg',
  'https://cdn1.suno.ai/sAura13.jpg',
  'https://cdn1.suno.ai/sAura14.jpg',
  'https://cdn1.suno.ai/sAura15.jpg',
  'https://cdn1.suno.ai/sAura16.jpg',
  'https://cdn1.suno.ai/sAura17.jpg',
  'https://cdn1.suno.ai/sAura18.jpg',
  'https://cdn1.suno.ai/sAura19.jpg',
  'https://cdn1.suno.ai/sAura20.jpg',
  'https://cdn1.suno.ai/sAura21.jpg',
  'https://cdn1.suno.ai/sAura22.jpg',
];
export const DEFAULT_AURA_URL = 'https://cdn2.suno.ai/Aura-1-square.jpeg';
export const FALLBACK_LOGO_URL = 'https://cdn1.suno.ai/suno-square.jpg';
export const DESIGN_SYSTEM_LOGO_URL = 'https://cdn1.suno.ai/SystemLogo.svg';

export const TRENDING_PLAYLIST_ID = '07653cdf-8f72-430e-847f-9ab8ac05af40';

export const MORE_SONGS_TRENDING_TAB = 'trending';
export const MORE_SONGS_PROFILE_TAB = 'profile';
export const MORE_SONGS_SIMILAR_TAB = 'similar';
export const MORE_SONGS_REMIXES_TAB = 'remixes';

export const MAX_SEARCH_TERM_LEN = 256;
export const SEARCH_DEBOUNCE_DELAY = 500;
export const DEFAULT_PAGE_SIZE = 20;
export const DEFAULT_PLAYLIST_PAGE_SIZE = 12;

export const TRUE_MAX_UPLOAD_SECONDS = 480; // backend cannot represent songs longer than this.
export const PRO_MAX_UPLOAD_SECONDS = 480;
export const FREE_MAX_UPLOAD_SECONDS = 60;

export const MAX_TAG_LENGTH = 200;
// In edit mode, the mininum allowed infill is 10 seconds
export const MIN_INFILL_SECONDS = 10;

// note before you adding new image size please check the current supported image size in this lambda
// https://us-east-1.console.aws.amazon.com/lambda/home?region=us-east-1#/functions/image-resize-cloudfront?tab=code
export const ORIGINAL_IMAGE = 1024;
export const LARGE_IMAGE = 360;
export const SMALL_IMAGE = 100;

export const SIDEBAR_WIDTH = 245;
export const FONT_SIZE_MULTIPLIER = 14 / SIDEBAR_WIDTH;
export const FONT_SIZE_SCALER = 1;
export const MAX_FONT_SIZE = 16;
export const MIN_FONT_SIZE = 14;

export const TITLE_FONT_SIZE_SCALAR = 1.143;
export const TIME_FONT_SIZE_SCALAR = 0.856;

// Starting to build out a centralized z-index system
export const SUPER_MODAL_Z_INDEX = 100000;
export const MODAL_Z_INDEX = 50000;
export const TOP_MENUS_SUPER_Z_INDEX = 12000;
export const TOP_MENUS_Z_INDEX = 10000;
export const MENUS_Z_INDEX = 9999;
export const FOREFRONT_Z_INDEX = 1000;
export const PLAYBAR_Z_INDEX = 50;

export const APPLE_APP_STORE_URL =
  'https://apps.apple.com/us/app/suno-make-music/id6480136315';

// Tailwind breakpoints: use these in media queries to hook into which breakpoint the screen is at
export const TAILWIND_2XS_MIN_WIDTH = 320;
export const TAILWIND_XS_MIN_WIDTH = 480;
export const TAILWIND_SMALL_MIN_WIDTH = 640;
export const TAILWIND_MEDIUM_MIN_WIDTH = 768;
export const TAILWIND_LARGE_MIN_WIDTH = 1024;
export const TAILWIND_XL_MIN_WIDTH = 1280;
export const TAILWIND_XXL_MIN_WIDTH = 1536;

export const HOOT_ERROR_RATE_THRESHOLD = 0.8;
export const SUNO_IOS_INVITE_CLAIM_URL =
  process.env.NEXT_PUBLIC_SUNO_IOS_INVITE_CLAIM_URL ||
  'https://cdn1.suno.ai/suno-early-access-ticket-1.mp4';
export const SUNO_IOS_INVITE_CLAIM_POSTER_URL =
  process.env.NEXT_PUBLIC_SUNO_IOS_INVITE_CLAIM_POSTER_URL ||
  'https://cdn1.suno.ai/suno-early-access-ticket-1.jpg';

// Video covers promo
export const PROMO_VIDEO_COVERS_CARD =
  'https://cdn-o.suno.com/Suno_VideoSongArt_10Sec_LoopH.mp4';
export const PROMO_VIDEO_COVERS_MODAL =
  'https://cdn-o.suno.com/Suno_VideoSongArt_10Sec_LoopV.mp4';
export const PROMO_VIDEO_COVERS_MODAL_DESKTOP_1 =
  'https://cdn-o.suno.com/Suno_VideoSongArt_Desktop_01.gif';
export const PROMO_VIDEO_COVERS_MODAL_DESKTOP_2 =
  'https://cdn-o.suno.com/Suno_VideoSongArt_Desktop_02.gif';
export const PROMO_VIDEO_COVERS_MODAL_DESKTOP_3 =
  'https://cdn-o.suno.com/Suno_VideoSongArt_Desktop_03.gif';
export const PROMO_VIDEO_COVERS_MODAL_DESKTOP_4 =
  'https://cdn-o.suno.com/Suno_VideoSongArt_Desktop_04.gif';
export const PROMO_VIDEO_COVERS_MODAL_MOBILE_1A =
  'https://cdn-o.suno.com/Suno_VideoSongArt_Mobile_01a.gif';
export const PROMO_VIDEO_COVERS_MODAL_MOBILE_1B =
  'https://cdn-o.suno.com/Suno_VideoSongArt_Mobile_01b.gif';
export const PROMO_VIDEO_COVERS_MODAL_MOBILE_2 =
  'https://cdn-o.suno.com/Suno_VideoSongArt_Mobile_02.gif';
export const PROMO_VIDEO_COVERS_MODAL_MOBILE_3 =
  'https://cdn-o.suno.com/Suno_VideoSongArt_Mobile_03.gif';
export const PROMO_VIDEO_COVERS_MODAL_MOBILE_4 =
  'https://cdn-o.suno.com/Suno_VideoSongArt_Mobile_04.gif';
export const PROMO_VIDEO_COVERS_MODAL_MOBILE_5 =
  'https://cdn-o.suno.com/Suno_VideoSongArt_Mobile_05.gif';

export const NO_STYLE_FALLBACK = '(no style)';

export const REDIRECT_DISMISSED_KEY = 'mobile-web-redirect-dismissed';
export const CLOUDFLARE_TURNSTILE_SITE_KEY =
  process.env.NEXT_PUBLIC_CLOUDFLARE_TURNSTILE_SITE_KEY ||
  '0x4AAAAAABd64Cd9aq5C--VE';

export const CLOUDFLARE_TURNSTILE_SITE_KEY_AUTH =
  process.env.NEXT_PUBLIC_CLOUDFLARE_TURNSTILE_SITE_KEY_AUTH ||
  '0x4AAAAAABtnpJo7aKMs9JLQ';

export const PROMPTING_RADIO_SCENE_EXAMPLE_PROMPTS = [
  'Classical quartet at an evening gala in Vienna, Austria',
  'Live French Jazz Violin in a jazz bar in Paris, France',
  'Ambient music in a night bar in Tokyo, Japan',
  'Reminiscent piano music for rainy day in New York City',
  'Spanish guitar music in a cafe in Barcelona, Spain',
  "Deep House set for Tony's rooftop party in Miami, Florida",
  'Traditional Bulgarian folk music in a cozy pub for Nedi',
  'Experimental electronic music in an art gallery in Berlin, Germany',
  'Bossa nova live band at a beachside bar in Rio de Janeiro, Brazil',
  'Chill lo-fi beats in a cozy bookstore cafe in Portland, Oregon',
  'Classical Indian sitar music at a sunset garden in Jaipur, India',
  'Traditional flamenco performance in a courtyard in Seville, Spain',
  'Jazz trio for Alex’s graduation celebration',
  'Indian acoustic performance for Sarah and Jack’s engagement party',
  'Latin salsa band at Maria’s surprise 30th birthday',
  'String quartet for Emma and Liam’s wedding ceremony',
  'Folk music sing-along for Ben’s family reunion',
  'Electronic DJ set for Rachel’s bachelorette party',
  'A secret love song for my crush Elaine',
];

export const DEFAULT_PROJECT_ID = 'default';
export const DEFAULT_PROJECT_NAME = 'My Workspace';
export const UNTITLED_PROJECT_NAME = 'Untitled Workspace';
export const SONG_ROW_SPARKLE_ANIMATE_SECONDS = 5000;
export const MAX_UPSAMPLE_DURATION_SECONDS = 15 * 60;
export const UPSAMPLE_FREEDOM_MIN = 1;
export const UPSAMPLE_FREEDOM_MAX = 10;
export const DEFAULT_VARIATIONS_MODEL = 'chirp-carp';

export const DEFAULT_AUDIO_WEIGHT_VALUE = 25;
export const DEFAULT_CONSTRAINT_VALUE = 0;
export const DEFAULT_CREATE_CONTROL_VALUE = 50;

export const MIN_EXTEND_FROM_SECONDS = 1;

export const SEARCH_OPTION_TRENDING = 'trending';

export const ROUTES = {
  LIVING_RADIO: '/live-radio',
  CREATE: '/create',
  CHAT: '/chat',
};

export const RADIO_AURA_BACKGROUND_VIDEO_URL =
  'https://cdn1.suno.ai/aura_video_Radio.mp4';

export const MILLISECONDS_PER_DAY = 24 * 60 * 60 * 1000;
export const REDIRECTED_FROM_PARAM = 'redirected_from';
export const REDIRECTED_FROM_VALUES = {
  SIGNUP: 'signup',
  SIGNIN: 'signin',
};
export const SIGNUP_SOURCE_PARAM = 'signup_source';
export const SIGNUP_SOURCE_VALUES = {
  MOBILE_SONG_PAGE: 'songpagev2',
  SONG_PAGE: 'songpage',
  HOME_PAGE: 'homepage',
  SPLASH_PAGE: 'splashpage',
  CREATE_PAGE: 'createpage',
  LIBRARY_PAGE: 'librarypage',
  SEARCH_PAGE: 'searchpage',
  NOTIFICATIONS_PAGE: 'notificationspage',
  PROFILE_PAGE: 'profilepage',
};
export const REFERRER_PARAM = 'referrer';

export const RADIO_HOME_CIRCLE_CONFIGS = [
  {
    size: 250,
    opacity: 0.15,
  },
  {
    size: 155,
    opacity: 0.15,
  },
  {
    size: 100,
    opacity: 0.15,
  },
  {
    size: 45,
    opacity: 0.15,
  },
];

export const RADIO_PAGE_CIRCLE_CONFIGS = [
  {
    size: 250,
    opacity: 0.04,
  },
  {
    size: 130,
    opacity: 0.04,
  },
  {
    size: 75,
    opacity: 0.04,
  },
];

export const RADIO_LOADING_PAGE_CIRCLE_CONFIGS = [
  {
    size: 250,
    opacity: 0.15,
  },
  {
    size: 155,
    opacity: 0.15,
  },
  {
    size: 100,
    opacity: 0.15,
  },
  {
    size: 45,
    opacity: 0.15,
  },
];

export const STUDENT_PLAN_LEVEL = 5;

export const SILENT_AUDIO_URL = 'https://cdn1.suno.ai/sil-100.mp3';

export const MOBILE_BOTTOM_NAV_FONT_SIZE = '32px';

export const FEEDBACK_TESTER_APPLICATION_URL =
  'https://forms.gle/SxhCURa8FcQE2DGg6';

export const FEEDBACK_OPTIONS = {
  RESET: -1,
  BUG_REPORT: 0,
  IDEAS: 1,
  BILLING: 2,
  TESTER: 3,
};

export const FEEDBACK_FORM_RATINGS = [
  {
    label: 'Very Dissatisfied',
    value: 1,
  },
  {
    label: 'Dissatisfied',
    value: 2,
  },
  {
    label: 'Satisfied',
    value: 3,
  },
  {
    label: 'Very Satisfied',
    value: 4,
  },
];

export const LOADING_SHIMMER_ANIMATION =
  'relative overflow-hidden before:absolute before:inset-0 before:-translate-x-full before:animate-[shimmer_2s_infinite] before:bg-linear-to-r before:from-transparent before:via-white/5 before:to-transparent';

export const MAX_NAME_LENGTH = 300;
export const MAX_DESCRIPTION_LENGTH = 2000;

export const PERSONA_PAGE_SIZE = 20;

export const HERO_SPLASH_VIDEO_URL =
  'https://cdn1.suno.ai/suno_hero_header_aura_1.mp4';

export const ORANGE_AURA_URL =
  'https://cdn1.suno.ai/suno_hero_footer_aura_1.mp4';

export const ORANGE_AURA_URL_WEB =
  'https://cdn1.suno.ai/suno_hero_footer_aura_1_web.mp4';

export const BLUE_AURA_URL =
  'https://cdn1.suno.ai/video_upload_4196a0b7-02fb-48cf-aba0-69888561d5e0.mp4';

export const HERO_PLAYLIST_FALLBACK_URL =
  'https://studio-api.prod.suno.com/api/playlist/a58ca77d-354d-4d69-a1e7-205ab0a4c43b?page=0';

export const HAS_LOGGED_IN_BEFORE = 'has_logged_in_before';
export const CAROUSEL_ITEM_GAP_MULTIPLIER = 1.05;

export const REACT_ARIA_TABS_STYLE =
  'font-sans font-medium text-foreground-inactive hover:border-b-2 hover:text-foreground-tertiary ' +
  'aria-selected:text-foreground-primary aria-selected:border-b-2 aria-selected:border-foreground-primary aria-selected:pb-1 ' +
  'whitespace-nowrap overflow-visible hover:cursor-pointer';

export const BLENDED_CREATE_EXPERIMENT_NAME = 'blended_create_test';

export const DOWNLOAD_UPGRADE_EXPERIMENT_NAME = 'free_download_rights_popup';

export const CROW_WEB_UI = 'v5-web-ui';

export const CREATE_ONBOARDING_EXPERIMENT_NAME =
  'show_web_first_create_tooltips';

export const CREATE_VERSION = '1.5';
export const LEGACY_CREATE_VERSION = '1';

/**
 * "Common" typography styles
 *
 * These should be moved to the design system when nailed down a little better on the Figma side.
 */
export const TYPOGRAPHY_DISCOVER_CARD_TITLE_CLASSNAME =
  'font-serif font-light text-[28px] leading-[32px]';
export const TYPOGRAPHY_DISCOVER_CARD_SUBTITLE_CLASSNAME =
  'font-sans font-normal text-[14px] leading-[16px]';
export const TYPOGRAPHY_DISCOVER_SECTION_TITLE_CLASSNAME =
  'font-sans font-semibold text-[20px] leading-[24px]';
export const TYPOGRAPHY_DISCOVER_FEED_BODY_1_CLASSNAME =
  'font-sans font-medium text-[16px] leading-[16px]';
export const TYPOGRAPHY_DISCOVER_FEED_BODY_2_CLASSNAME =
  'font-sans font-normal text-[14px] leading-[16px]';

export enum GenerationPriotityLevel {
  Free = 0,
  Pro = 10,
}

export enum CreatorLabel {
  CHAMPION = 'champion',
  AMBASSADOR = 'ambassador',
}

export const OVERRIDE_MODEL_POST_SUBSCRIPTION_TTL = 1000 * 60 * 60 * 24 * 28; // 28 days

export const REMIX_OPTIONS_BUTTON_CLASSNAME =
  'bg-quaternary text-primary w-full h-[42px] flex items-center justify-center';

export const REMIX_OPTIONS_CLASSNAME = 'px-4 pb-4 pt-2';

export const UNPUBLISHABLE_UPLOAD_CLIP_MESSAGE =
  'Audio uploads with vocals (and related songs) cannot be made public at this time';

export const CONTROL_SLIDERS = {
  weirdness_constraint: 'Weirdness',
  style_weight: 'Style Strength',
  audio_weight: 'Audio Strength',
};

export const CREATE_SLIDER_DEFAULT_VALUES: {
  [key in ControlSliderKey]: number;
} = {
  weirdness_constraint: DEFAULT_CREATE_CONTROL_VALUE,
  style_weight: DEFAULT_CREATE_CONTROL_VALUE,
  audio_weight: DEFAULT_AUDIO_WEIGHT_VALUE,
};

export type SliderValueTooltipConfig = {
  min: number;
  max: number;
  text: string;
  valueClassName?: string;
};

export const SLIDER_VALUE_TOOLTIPS: {
  [key in ControlSliderKey]: SliderValueTooltipConfig[];
} = {
  weirdness_constraint: [
    { min: 0, max: 33, text: 'Safe zone' },
    { min: 34, max: 66, text: 'Expected results' },
    { min: 67, max: 80, text: 'Experimental results' },
    {
      min: 81,
      max: 100,
      text: 'Chaos mode',
      valueClassName: 'text-vermilion-500',
    },
  ],
  style_weight: [
    { min: 0, max: 33, text: 'Loose' },
    { min: 34, max: 66, text: 'Moderate' },
    { min: 67, max: 100, text: 'Strong' },
  ],
  audio_weight: [
    { min: 0, max: 33, text: 'Loose' },
    { min: 34, max: 66, text: 'Moderate' },
    { min: 67, max: 100, text: 'Strong' },
  ],
};

export const SLIDER_THRESHOLD_LABELS = {
  weirdness: {
    0: 'Safe zone',
    0.33: 'Expected results',
    0.66: 'Experimental results',
    0.8: 'Chaos mode',
  },
  styleInfluence: {
    0: 'Loose',
    0.33: 'Moderate',
    1: 'Strong',
  },
  audioInfluence: {
    0: 'Loose',
    0.33: 'Moderate',
    1: 'Strong',
  },
};

export const SLIDER_INFO_TOOLTIPS: { [key in ControlSliderKey]: string } = {
  weirdness_constraint: 'Turn it up for wild, unexpected results',
  style_weight: 'Turn it up to match your style description',
  audio_weight: 'Turn it up to resemble your original audio or Persona',
};

export const FOUR_MINUTES = 240;

export const MAX_PINNED_SONGS_ARTIST_PROFILE = 10;
export const MAX_PINNED_SONGS_PROFILE = 5;

export const MAX_INVITES_PER_USER = 20;
export const MAX_COLLABORATORS_PER_PROJECT = 4;

// Paths that are exempt from dark mode/light mode switch
// As of July 2025, keep /edit and /studio permanently dark because they use canvas rendering, which currently doesn't have a way to pull themed colors.
export const THEME_STORAGE_KEY = 'suno-theme-mode';
export const THEME_PATHS_EXEMPT_FROM_LIGHT_MODE_REGEX = /^\/edit.*|^\/studio.*/;

export const AUDIO_FILE_TYPES = [
  'audio/mp3',
  'audio/wav',
  'audio/aac',
  'audio/aiff',
  'audio/m4a',
  'audio/mp4',
  'audio/mpeg',
  'audio/x-m4a',
  'audio/ogg',
  'audio/opus',
  'audio/wma',
  'audio/flac',
  'audio/alac',
];
export const AUDIO_FILE_TYPES_STRING = AUDIO_FILE_TYPES.join(', ');

// Username/Handle validation and parsing constants

// Regex patterns for username/handle validation and mention parsing
export const USERNAME_VALIDATION_REGEX = /^[a-zA-Z0-9_]{3,40}$/;
export const MENTION_PARSING_REGEX = /@[a-zA-Z0-9_]+/g;

// Non-global regex for cleanup operations
export const MENTION_CLEANUP_REGEX = /[^@a-zA-Z0-9_]/g;

export const LIVING_RADIO_BANNER_SONG_LIST_FETCH_INTERVAL_MS = 120000;

export const LIVING_RADIO_BANNER_LISTENER_COUNT_FETCH_INTERVAL_MS = 30000;

export const LIVING_RADIO_BANNER_LISTENER_COUNT_DISPLAY_THRESHOLD = 10;

export const EMPTY_UUID = '00000000-0000-0000-0000-000000000000';
