content: {-# LANGUAGE NoImplicitPrelude #-}
  module Handler.StackageSdist
      ( getStackageSdistR
      , pnvToSnapshotPackageInfo
      ) where
  
  import Import
  import Stackage.Database
  import Handler.Package (packagePage)
  
  handlePNVTarball :: PackageNameP -> VersionP -> Handler TypedContent
  handlePNVTarball name version =
      redirect $
      concat -- TODO: Should this be switched to HTTPS by now?
                  -- unfortunately using insecure HTTP for cabal's sake
          [ "http://hackage.fpcomplete.com/package/"
          , toPathPiece name
          , "-"
          , toPathPiece version
          , ".tar.gz"
          ]
  
  
  getStackageSdistR
    :: SnapName -> PackageNameVersion -> HandlerFor App TypedContent
  getStackageSdistR sname pnv =
      track "Handler.StackageSdist.getStackageSdistR" $
      pnvToSnapshotPackageInfo sname pnv handlePNVTarball $ \isSameVersion spi ->
          if isSameVersion
              then packagePage (Just spi) (spiPackageName spi) >>= sendResponse
              else redirect $
                   SnapshotR sname $
                   StackageSdistR $ PNVNameVersion (spiPackageName spi) (spiVersion spi)
  
  
  pnvToSnapshotPackageInfo ::
         SnapName
      -> PackageNameVersion
      -> (PackageNameP -> VersionP -> HandlerFor App b)
      -> (Bool -> SnapshotPackageInfo -> HandlerFor App b)
      -> HandlerFor App b
  pnvToSnapshotPackageInfo sname pnv tarballHandler spiHandler =
      case pnv of
          PNVName pname -> spiHelper sname pname >>= spiHandler False
          PNVNameVersion pname version ->
              spiHelper sname pname >>= \spi -> spiHandler (version == spiVersion spi) spi
          PNVTarball name version -> tarballHandler name version
  
  
  spiHelper :: SnapName -> PackageNameP -> Handler SnapshotPackageInfo
  spiHelper sname pname = getSnapshotPackageInfo sname pname >>= maybe notFound return
  
  