/**
 * URL parsing helpers.
 */

import type { ParsedRepo } from './types.js';

const SSH_OR_HTTPS_RE = /^(?:https?:\/\/github\.com\/|git@github\.com:)?(?<owner>[A-Za-z0-9_.-]+)\/(?<name>[A-Za-z0-9_.-]+?)(?:\.git)?\/?$/i;

const SHORT_RE = /^(?<owner>[A-Za-z0-9_.-]+)\/(?<name>[A-Za-z0-9_.-]+)$/;

export function parseRepoUrl(input: string): ParsedRepo {
  const trimmed = input.trim();
  let m = trimmed.match(SSH_OR_HTTPS_RE);
  if (!m || !m.groups) m = trimmed.match(SHORT_RE);
  if (!m || !m.groups) {
    throw new Error(`Could not parse "${input}" as a GitHub owner/repo. Try "owner/repo" or a full URL.`);
  }
  return normalizeRepo({ owner: m.groups.owner!, name: m.groups.name! });
}

export function normalizeRepo(repo: ParsedRepo): ParsedRepo {
  return {
    owner: repo.owner.toLowerCase(),
    name: repo.name.replace(/\.git$/i, '').toLowerCase(),
  };
}
