#!/bin/sh
set -euC

# usage: distro-url [test] [<distro> [<variant> [<arch> [<mirror>]]]]

[ "${1-}" = 'test' ] && shift && test=y || test=
distro="${1-*}"
variant="${2-*}"
arch="${3-*}"
mirror="${4-}"

filter()
{
  for d in $1; do case "$d" in $distro)
  for v in $2; do case "$v" in $variant)
  for a in $3; do case "$a" in $arch)
    echo "$d" "$v" "$a"
  esac; done
  esac; done
  esac; done
}

main()
{
  {
    filter 'debian'         'netinst inst                                   ' 'amd64 arm64 armhf ppc64el riscv64 s390x'
    filter 'debian'         'standard gnome kde lxqt xfce cinnamon mate lxde' 'amd64                                  '
    filter 'debian'         'raspi                                          ' '      arm64                            '
    filter 'raspios'        'default full lite                              ' '      arm64                            '
    filter 'ubuntu'         'desktop       server                           ' 'amd64                                  '
    filter 'ubuntu'         'desktop-raspi server-raspi                     ' '      arm64                            '
    filter 'edubuntu'       'desktop                                        ' 'amd64                                  '
    filter 'edubuntu'       'desktop-raspi                                  ' '      arm64                            '
    filter 'kubuntu'        'desktop                                        ' 'amd64                                  '
    filter 'lubuntu'        'desktop                                        ' 'amd64                                  '
    filter 'xubuntu'        'desktop                                        ' 'amd64                                  '
    filter 'ubuntucinnamon' 'desktop                                        ' 'amd64                                  '
    filter 'ubuntu-mate'    'desktop                                        ' 'amd64                                  '
    filter 'ubuntu-budgie'  'desktop                                        ' 'amd64                                  '
    filter 'ubuntu-unity'   'desktop                                        ' 'amd64                                  '
    filter 'ubuntustudio'   'desktop                                        ' 'amd64                                  '
    filter 'ubuntukylin'    'desktop                                        ' 'amd64                                  '
    filter 'linuxmint'      'cinnamon mate xfce                             ' 'amd64                                  '
    filter 'opensuse'       'netinst inst                                   ' 'amd64                                  '
    filter 'opensuse'       'gnome kde xfce                                 ' 'amd64                                  '
  } |
  while read d v a
  do
    url="$(url "$d" "$v" "$a")"
    printf '%s %s %s %s' "$d" "$v" "$a" "$url"
    [ "$test" ] && printf ' %s' "$(curl -sfI "$url" > '/dev/null' \
      && echo 'OK' \
      || echo 'Failed'
    )"
    printf '\n'
  done |
  {
    [ "$test" ] && cat || column -t
  }
}

url()
(
  distro="$1"
  variant="$2"
  arch="$3"
  case "$distro/$variant" in
    *raspi*) : ${arch:='arm64'}; ext='img.xz'; ;;
    *)       : ${arch:='amd64'}; ext='iso';    ;;
  esac
  case "$distro" in
    debian)
      codename='trixie'
      version='13.4.0'
      : ${variant:='gnome'}
      case "$variant" in
        netinst|inst|\
        standard|gnome|kde|lxqt|xfce|cinnamon|mate|lxde)
          # : ${mirror:="https://get.debian.org/images/release"}
          # : ${mirror:="https://cdimage.debian.org/images/release"}
          # : ${mirror:="https://cloud.debian.org/images/release"}
          : ${mirror:="https://cdimage.debian.org/debian-cd"}
          case "$variant" in
            netinst) media='iso-cd';     suffix='';                       ;;
            inst)    media='iso-dvd';    suffix='';      variant='DVD-1'; ;;
            *)       media='iso-hybrid'; suffix='-live';                  ;;
          esac
          dir="$version$suffix/$arch/$media"
          echo "$mirror/$dir/$distro$suffix-$version-$arch-$variant.$ext"
          ;;
        raspi)
          # : ${mirror:="https://get.debian.org/images/cloud"}
          # : ${mirror:="https://cdimage.debian.org/images/cloud"}
          : ${mirror:="https://cloud.debian.org/images/cloud"}
          major="${version%%.*}"
          ext='tar.xz'
          # dir="$codename/latest"
          # echo "$mirror/$dir/$distro-$major-$variant-$arch.$ext"
          dir="$codename/daily/latest"
          echo "$mirror/$dir/$distro-$major-$variant-$arch-daily.$ext"
          ;;
      esac
      ;;
    raspios)
      codename='trixie'
      version='2026-04-21'
      : ${variant:='default'}
      : ${mirror:="https://downloads.raspberrypi.com"}
      case "$variant" in
        default)   name="${distro}_${arch}";            suffix='';          ;;
        full|lite) name="${distro}_${variant}_${arch}"; suffix="-$variant"; ;;
      esac
      dir="$name/images/$name-$version"
      echo "$mirror/$dir/$version-$distro-$codename-$arch$suffix.$ext"
      ;;
    ubuntu|\
    edubuntu|\
    kubuntu|lubuntu|xubuntu|\
    ubuntucinnamon|ubuntu-mate|ubuntu-budgie|ubuntu-unity|\
    ubuntustudio|ubuntukylin)
      codename='resolute'
      version='26.04'
      : ${variant:='desktop'}
      if [ "$distro/$arch" = 'ubuntu/amd64' ]
      then : ${mirror:="https://releases.ubuntu.com"};                 dir="$codename";
      else : ${mirror:="https://cdimage.ubuntu.com/$distro/releases"}; dir="$codename/release";
      fi
      case "$variant" in
        desktop) suffix=''; ;;
        server)  suffix='-live'; ;;
        *-raspi) suffix='-preinstalled'; variant="${variant%%-raspi}"; arch="$arch+raspi"; ;;
      esac
      echo "$mirror/$dir/$distro-$version$suffix-$variant-$arch.$ext"
      ;;
    linuxmint)
      codename='zena'
      version='22.3'
      : ${variant:='cinnamon'}
      : ${mirror:='https://pub.linuxmint.io'}
      case "$arch" in
        amd64) arch='64bit' ;;
      esac
      dir="stable/$version"
      echo "$mirror/$dir/$distro-$version-$variant-$arch.$ext"
      ;;
    opensuse)
      distro='openSUSE'
      codename='Tumbleweed'
      : ${variant:='gnome'}
      : ${mirror:='https://download.opensuse.org'}
      case "$variant" in
        inst)    suffix='';      variant='DVD';                                 ;;
        netinst) suffix='';      variant='NET';                                 ;;
        *)       suffix='-Live'; variant="$(echo "$variant" | tr 'a-z' 'A-Z')"; ;;
      esac
      case "$arch" in
        amd64) arch='x86_64'
      esac
      dir="$codename/iso"; dir="$(echo "$dir" | tr 'A-Z' 'a-z')"
      echo "$mirror/$dir/$distro-$codename-$variant$suffix-$arch-Current.$ext"
      ;;
  esac
)

main
