{"version":3,"file":"global.helper.cjs","names":[],"sources":["../../src/helpers/global.helper.ts"],"sourcesContent":["import { CSFDColorRating, CSFDFilmTypes } from '../dto/global';\nimport { CSFDColors } from '../dto/user-ratings';\n\nconst LANG_PREFIX_REGEX = /^[a-z]{2,3}$/;\nconst ISO8601_DURATION_REGEX =\n  /(-)?P(?:([.,\\d]+)Y)?(?:([.,\\d]+)M)?(?:([.,\\d]+)W)?(?:([.,\\d]+)D)?T(?:([.,\\d]+)H)?(?:([.,\\d]+)M)?(?:([.,\\d]+)S)?/;\n\nexport const parseIdFromUrl = (url: string): number => {\n  if (!url) return null;\n\n  const parts = url.split('/');\n\n  // Reverse loop to find the ID slug efficiently without allocating intermediate arrays\n  for (let i = parts.length - 1; i >= 0; i--) {\n    const p = parts[i];\n    if (/^\\d+-/.test(p)) {\n      return +p.split('-')[0] || null;\n    }\n  }\n\n  // Fallback\n  const hasLangPrefix = LANG_PREFIX_REGEX.test(parts[1]);\n  const idSlug = parts[hasLangPrefix ? 3 : 2];\n  const id = idSlug?.split('-')[0];\n  return +id || null;\n};\n\n/**\n * Extracts a numeric ID from a number, string, slug, or full URL.\n * Designed for Developer Experience (DX) to allow flexible inputs.\n */\nexport const extractId = (idOrUrl: number | string): number | null => {\n  if (typeof idOrUrl === 'number') {\n    return isNaN(idOrUrl) ? null : idOrUrl;\n  }\n\n  if (typeof idOrUrl === 'string') {\n    // Pure number string\n    if (/^\\d+$/.test(idOrUrl)) {\n      return Number(idOrUrl);\n    }\n    // Direct slug with ID prefix (e.g. \"228329-avatar\")\n    if (/^\\d+-/.test(idOrUrl)) {\n      return +idOrUrl.split('-')[0] || null;\n    }\n    // Fallback to URL parsing\n    return parseIdFromUrl(idOrUrl);\n  }\n\n  return null;\n};\n\nexport const parseLastIdFromUrl = (url: string): number => {\n  if (url) {\n    const idSlug = url?.split('/')[3];\n    const id = idSlug?.split('-')[0];\n    return +id || null;\n  } else {\n    return null;\n  }\n};\n\nconst PAGE_COLORS: Record<string, CSFDColorRating> = {\n  'page-lightgrey': 'unknown',\n  'page-red': 'good',\n  'page-blue': 'average',\n  'page-grey': 'bad'\n};\n\nexport const getColor = (cls: string): CSFDColorRating => {\n  return PAGE_COLORS[cls] || 'unknown';\n};\n\nconst RATING_COLORS: Record<CSFDColors, CSFDColorRating> = {\n  lightgrey: 'unknown',\n  red: 'good',\n  blue: 'average',\n  grey: 'bad'\n};\n\nexport const parseColor = (quality: CSFDColors): CSFDColorRating => {\n  return RATING_COLORS[quality] || 'unknown';\n};\n\nconst FILM_TYPES: Record<string, CSFDFilmTypes> = {\n  'TV film': 'tv-film',\n  pořad: 'tv-show',\n  seriál: 'series',\n  'divadelní záznam': 'theatrical',\n  koncert: 'concert',\n  série: 'season',\n  'studentský film': 'student-film',\n  'amatérský film': 'amateur-film',\n  'hudební videoklip': 'music-video',\n  epizoda: 'episode',\n  'video kompilace': 'video-compilation',\n  film: 'film'\n};\n\nexport const parseFilmType = (type: string): CSFDFilmTypes => {\n  return FILM_TYPES[type] || 'film';\n};\n\nexport const addProtocol = (url: string): string => {\n  return url.startsWith('//') ? 'https:' + url : url;\n};\n\nexport const getDuration = (matches: RegExpMatchArray) => {\n  return {\n    sign: matches[1] === undefined ? '+' : '-',\n    years: matches[2] === undefined ? 0 : matches[2],\n    months: matches[3] === undefined ? 0 : matches[3],\n    weeks: matches[4] === undefined ? 0 : matches[4],\n    days: matches[5] === undefined ? 0 : matches[5],\n    hours: matches[6] === undefined ? 0 : matches[6],\n    minutes: matches[7] === undefined ? 0 : matches[7],\n    seconds: matches[8] === undefined ? 0 : matches[8]\n  };\n};\n\nexport const parseISO8601Duration = (iso: string): number => {\n  const matches = iso.match(ISO8601_DURATION_REGEX);\n\n  const duration = getDuration(matches);\n\n  return +duration.hours * 60 + +duration.minutes;\n};\n\n/**\n * Parses a date string into a standardized YYYY-MM-DD format.\n * Supports:\n * - D.M.YYYY\n * - DD.MM.YYYY\n * - D. M. YYYY\n * - MM/DD/YYYY\n * - YYYY\n */\nexport const parseDate = (date: string): string | null => {\n  if (!date) return null;\n\n  // Clean the input\n  const cleanDate = date.trim();\n\n  // Try parsing DD.MM.YYYY or D.M.YYYY with optional spaces\n  const dateMatch = cleanDate.match(/^(\\d{1,2})\\.\\s*(\\d{1,2})\\.\\s*(\\d{4})$/);\n  if (dateMatch) {\n    const day = dateMatch[1].padStart(2, '0');\n    const month = dateMatch[2].padStart(2, '0');\n    const year = dateMatch[3];\n    return `${year}-${month}-${day}`;\n  }\n\n  // Try parsing MM/DD/YYYY\n  const slashMatch = cleanDate.match(/^(\\d{1,2})\\/(\\d{1,2})\\/(\\d{4})$/);\n  if (slashMatch) {\n    const month = slashMatch[1].padStart(2, '0');\n    const day = slashMatch[2].padStart(2, '0');\n    const year = slashMatch[3];\n    return `${year}-${month}-${day}`;\n  }\n\n  // Try parsing YYYY\n  const yearMatch = cleanDate.match(/^(\\d{4})$/);\n  if (yearMatch) {\n    return `${yearMatch[1]}-01-01`;\n  }\n\n  return null;\n};\n\n// Sleep in loop\nexport const sleep = (ms: number) => new Promise((res) => setTimeout(res, ms));\n"],"mappings":"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"}