module MSAzureAPI.MachineLearning.Jobs where

import Control.Applicative (Alternative(..))
import Control.Monad.IO.Class (MonadIO(..))
import Data.Foldable (asum)
import Data.Functor (void)
-- import Data.Maybe (listToMaybe)
import GHC.Generics (Generic(..))

-- aeson
import qualified Data.Aeson as A (ToJSON(..), genericToEncoding, FromJSON(..), genericParseJSON, defaultOptions, Options(..), withObject, withText, (.:), (.:?), object, (.=), Key, Value, camelTo2)
-- bytestring
import qualified Data.ByteString as BS (ByteString)
import qualified Data.ByteString.Char8 as BS8 (pack, unpack)
import qualified Data.ByteString.Lazy as LBS (ByteString)
-- hoauth2
-- import Network.OAuth.OAuth2 (OAuth2Token(..))
import Network.OAuth.OAuth2.Internal (AccessToken(..))
-- req
import Network.HTTP.Req (Req, Url, Option, Scheme(..), header, (=:))
-- text
import Data.Text (Text, pack, unpack)
import qualified Data.Text.Lazy as TL (Text, pack, unpack, toStrict)
-- -- time
-- import Data.Time (UTCTime, getCurrentTime)
-- import Data.Time.Format (FormatTime, formatTime, defaultTimeLocale)
-- import Data.Time.LocalTime (getZonedTime)
-- -- xeno
-- import qualified Xeno.DOM.Robust as X (Node, Content(..), name, contents, children)
-- -- xmlbf-xeno
-- import qualified Xmlbf.Xeno as XB (fromRawXml)
-- xmlbf
-- import qualified Xmlbf as XB (Parser, runParser, pElement, pText)

import qualified MSAzureAPI.Internal.Common as MSA (APIPlane(..), (==:), put, get, getBs, post, getLbs, aesonOptions)



-- | create a job
--
-- docs: <https://learn.microsoft.com/en-us/rest/api/azureml/2023-04-01/jobs/create-or-update?tabs=HTTP>
--
-- @PUT https:\/\/management.azure.com\/subscriptions\/{subscriptionId}\/resourceGroups\/{resourceGroupName}\/providers\/Microsoft.MachineLearningServices\/workspaces\/{workspaceName}\/jobs\/{id}?api-version=2023-04-01@
createJob :: (A.FromJSON b) =>
             Text -- ^ subscription id
          -> Text -- ^ res group id
          -> Text -- ^ ML workspace id
          -> Text -- ^ job id
          -> JobBase
          -> AccessToken -> Req b
createJob :: forall b.
FromJSON b =>
Text -> Text -> Text -> Text -> JobBase -> AccessToken -> Req b
createJob Text
sid Text
rgid Text
wsid Text
jid =
  forall b a.
(FromJSON b, ToJSON a) =>
APIPlane -> [Text] -> Option 'Https -> a -> AccessToken -> Req b
MSA.put APIPlane
MSA.APManagement [Text
"subscriptions", Text
sid,
                    Text
"resourceGroups", Text
rgid,
                    Text
"providers", Text
"Microsoft.MachineLearningServices",
                    Text
"workspaces", Text
wsid,
                    Text
"jobs", Text
jid] (Text
"api-version" Text -> Text -> Option 'Https
MSA.==: Text
"2023-04-JobBase")

-- | 01 type
--
-- https://learn.microsoft.com/en-us/rest/api/azureml/2023-04-01/jobs/create-or-update?tabs=HTTP
data JobBase = JBAutoMLJob -- ^ https://learn.microsoft.com/en-us/rest/api/azureml/2023-04-01/jobs/list?tabs=HTTP#automljob
             | JBCommandJob
             | JBPipelineJob
             | JBSweepJob
             deriving (JobBase -> JobBase -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: JobBase -> JobBase -> Bool
$c/= :: JobBase -> JobBase -> Bool
== :: JobBase -> JobBase -> Bool
$c== :: JobBase -> JobBase -> Bool
Eq, Int -> JobBase -> ShowS
[JobBase] -> ShowS
JobBase -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [JobBase] -> ShowS
$cshowList :: [JobBase] -> ShowS
show :: JobBase -> String
$cshow :: JobBase -> String
showsPrec :: Int -> JobBase -> ShowS
$cshowsPrec :: Int -> JobBase -> ShowS
Show, forall x. Rep JobBase x -> JobBase
forall x. JobBase -> Rep JobBase x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep JobBase x -> JobBase
$cfrom :: forall x. JobBase -> Rep JobBase x
Generic)
instance A.ToJSON JobBase where
  toEncoding :: JobBase -> Encoding
toEncoding = forall a.
(Generic a, GToJSON' Encoding Zero (Rep a)) =>
Options -> a -> Encoding
A.genericToEncoding (String -> Options
MSA.aesonOptions String
"jb")