module Sudoku.Loader(loadSudoku) where
import Data.ByteString.Lazy.Char8 (unpack)
import Data.List (elemIndex, transpose)
import Data.Maybe (fromMaybe)
import Network.HTTP.Client
import Network.HTTP.Client.TLS
import Sudoku.Type
import Text.HandsomeSoup
import Text.Printf (printf)
import Text.XML.HXT.Core
import Util
toNumber :: Difficulty -> Int
toNumber Easy = 40
toNumber Medium = 33
toNumber Hard = 26
toNumber Evil = 17
url :: Difficulty -> String
url d = "https://kjell.haxx.se/sudoku/?visade=" ++ (show $ toNumber d) ++ "&seed=%28random+seed%29&action=Create+a+field&hardchange=0"
loadSudoku :: Difficulty -> IO (Maybe Sudoku)
loadSudoku d = do
manager <- newManager tlsManagerSettings
request <- parseRequest (url d)
response <- httpLbs request manager
let doc = parseHtml $ unpack $ responseBody response
values <- runX $ doc >>> css "input.sgrid" ! "value"
let transposedValues = ungroup . ungroup . transpose . groupBy 3 . groupBy 9
. ungroup . ungroup . transpose . groupBy 3 . groupBy 3 $ values
let sudokuString = concat $ map (\v -> if v == "" then blankval:"" else v) transposedValues
pure (fromString sudokuString)