{-# LANGUAGE OverloadedStrings #-}

module Cmd.Owner (
  ownerCmd
  )
where

import Network.HTTP.Query (lookupKey)

import Common
import Common.System
import Package
import Pagure

-- FIXME option for email
-- FIXME option to output owner's packages on separate lines
ownerCmd :: [String] -> IO ()
ownerCmd pkgs = do
  if null pkgs
    then void $ ownerPkg "."
    else do
    pkgowners <- mapM ownerPkg pkgs
    when (length pkgs > 1) $ do
      putNewLn
      let maintain = groupSort pkgowners
      forM_ maintain $ \(o,ps) ->
        putStrLn $ o ++ ":" +-+ unwords (map unPackage ps)
  where
    ownerPkg :: String -> IO (String,Package)
    ownerPkg path = do
      pkg <- getPackageName path
      when (length pkgs > 1) $
        putStr $ unPackage pkg ++ " "
      epkginfo <- pagureProjectInfo srcfpo ("rpms" </> unPackage pkg)
      case epkginfo of
        Left err -> error' err
        Right pkginfo -> do
          case lookupKey "user" pkginfo of
            Nothing -> error' "user not found"
            Just user ->
              case userName user of
                Nothing -> error' "user name not found"
                Just (name,full) -> do
                  putStr $ name +-+ "(" ++ full ++ ")"
                  whenJust (lookupKey "access_users" pkginfo >>= lookupKey "admin") $ putStrLn . formatAdmins
                  return (name,pkg)

    userName user = do
      name <- lookupKey "name" user
      full <- lookupKey "fullname" user
      return (name,full)

    formatAdmins :: [String] -> String
    formatAdmins [] = ""
    formatAdmins as = ' ' : unwords as