module Discokitty.Examples.LesJustesMain where
import           Data.Semigroup
import           Discokitty
import           Discokitty.Examples.LesJustesUniverse
import           Discokitty.Models.Rel
import qualified Discokitty.Multiwords                 as M
type RelU = Rel Universe
yanek :: Words RelU
yanek = Words yanekRel [ N ] "Yanek"
  where
    yanekRel :: RelU
    yanekRel = fromList
      [ [ Yanek ]
      , [ Poet ]
      , [ Alive ]
      , [ Revolutionary ]
      , [ Innocent ]
      ]
attacks :: Words RelU
attacks = Words (fromList
  [ [ Yanek , IsTrue , Duke ]
  , [ Yanek , IsPlot , Duke ]
  ]) [ L N , S , R N ] "attacks"
duke :: Words RelU
duke = Words dukeRel [ N ] "duke"
  where
    dukeRel :: RelU
    dukeRel = fromList
      [ [ Duke ]
      , [ Alive ]
      , [ Tsarist ]
      ]
example2 :: [Words RelU]
example2 = sentence [yanek , kills , duke] @@@ [ S ]
lnot :: Universe -> Words RelU
lnot adjective = Words
  (fromList $ (\x -> [x , x]) <$> filter (/= adjective) universe)
  [L N , N] ""
rnot :: Universe -> Words RelU
rnot adjective = Words
  (fromList $ (\x -> [x , x]) <$> filter (/= adjective) universe)
  [N , R N] ""
cnst :: Universe -> Words RelU
cnst _ = Words (fromList [[ IsTrue ]]) [ S ] ""
kills :: Words RelU
kills =
  head $
  sentence [lnot Innocent, cnst IsTrue, rnot Alive]
  @@@ [L N, N, S, N, R N]
example3 :: [Words RelU]
example3 = sentence [ yanek , kills , duke ] @@@ [N , S , N]
nephew :: Words RelU
nephew = Words nephewRel [ N ] "nephew"
  where
    nephewRel :: RelU
    nephewRel = fromList
      [ [ Nephew ]
      , [ Alive ]
      , [ Tsarist ]
      , [ Innocent ]
      ]
bomb :: Words RelU
bomb = Words
  (fromList [ [Bomb] ])
  [ N ] "bomb"
and' :: Words RelU
and' = Words
  (fromList $
    [ [ a , a , b ] | a <- universe , b <- universe ] ++
    [ [ a , b , b ] | a <- universe , b <- universe ])
  [L N , N , R N] "and"
example4a :: [Words RelU]
example4a = sentence [ yanek , attacks , duke , and' , nephew ] @@@ [ S ]
using :: Words RelU
using = Words
  (fromList $
    [ [ IsPlot , IsPlot , Bomb ]
    , [ IsTrue , IsTrue , Bomb ]
    ]
  )
  [L S , S , R N] "using"
with :: M.Multiword RelU
with = M.fromList $
  [ (using , 0.7)
  , (and' , 0.3)
  ]
yanek'   = M.singleton yanek
duke'    = M.singleton duke
nephew'  = M.singleton nephew
bomb'    = M.singleton bomb
using'   = M.singleton using
and''    = M.singleton and'
attacks' = M.singleton attacks
example5a :: M.Multiword RelU
example5a = (yanek' <> attacks' <> duke' <> with <> nephew')  M.@@ [S]
example5b :: M.Multiword RelU
example5b = M.sentence [yanek' , attacks' , duke' , with , bomb' ] M.@@ [S]
becomes :: Words RelU
becomes = Words
  (fromList $
     [ [ a ,     a , b ] | a <- universe , b <- universe ] ++
     [ [ Alive , b , b ] | b <- universe ])
  [L N , N , R N] "becomes"
becomes' :: M.Multiword RelU
becomes' = M.singleton becomes
revolutionary :: M.Multiword RelU
revolutionary = M.fromList $
  [ ( revSaviour , 0.5 )
  , ( revTerrorist , 0.5 )
  ]
  where
    revSaviour = Words (fromList [[Revolutionary] , [Saviour]]) [ N ] "saviour"
    revTerrorist = Words (fromList [[Revolutionary] , [Terrorist]]) [ N ] "terrorist"
kills''' :: M.Multiword RelU
kills''' =
  M.singleton $ Words
  (fromList $
    [ [ Alive , Terrorist , Innocent , Innocent ] ]
    ++
    [ [ a , a , b , b  ]
       | a <- universe
       , a /= Innocent
       , b <- universe
       , b /= Alive
       , a /= Saviour
       ]
    ++
    [  ])
  [L N, N, N, R N] "kills"
discarding' :: M.Multiword RelU
discarding' =
  M.singleton $ Words
  (fromList
    [ [ a ] | a <- universe ])
  [ L N ] ""
he = M.singleton $ Words (fromList [[a,a] | a <- universe]) [L N , N] "he"
saviour = M.singleton $ Words (fromList [[Saviour]]) [N] "saviour"
terrorist = M.singleton $ Words (fromList [[Terrorist]]) [N] "terrorist"
alive = M.singleton $ Words (fromList [[Alive]]) [N] "alive"
is' = M.singleton $ Words (fromList [[a,a] | a <- universe]) [L N , N] "is"
(?) = M.singleton $ Words (fromList [[a,a] | a <- universe]) [L N , L N] "?"
example6 :: M.Multiword RelU
example6 = (sentence1 <> sentence2 <> sentence3) M.@@ []
  where
    sentence1 = (yanek' <> becomes' <> revolutionary) M.@@ [N]
    sentence2 = (he <> kills''' <> duke' <> discarding') M.@@ [L N , N]
    sentence3 = (is' <> he <> terrorist <> (?)) M.@@ [L N]
example7 :: M.Multiword RelU
example7 = (sentence1 <> sentence2 <> sentence3) M.@@ []
  where
    sentence1 = (yanek' <> becomes' <> revolutionary) M.@@ [N]
    both      = (duke' <> and'' <> nephew') M.@@ [N]
    sentence2 = (he <> kills''' <> both <> discarding') M.@@ [L N , N]
    sentence3 = (is' <> he <> terrorist <> (?)) M.@@ [L N]
people :: M.Multiword RelU
people = M.singleton $ Words
  (fromList
    [ [Yanek]
    , [Dora]
    , [Stepan]
    , [Duke]
    , [Skouratov]
    , [Boris]
    , [Nephew]
    ]
  )
  [N] "people"
combat :: M.Multiword RelU
combat = M.singleton $ Words
  (fromList $
     [ [r         , IsTrue , Duke]      | r <- revolutionaries] ++
     [ [r         , IsTrue , Skouratov] | r <- revolutionaries] ++
     [ [Skouratov , IsTrue , r]         | r <- revolutionaries] ++
     [ [Stepan    , IsTrue , Nephew] ])
  [L N , S , R N] "combat"
    where
      revolutionaries = [Yanek, Dora, Stepan]
enjoy :: M.Multiword RelU
enjoy = M.singleton $ Words
  (fromList
    [ [Yanek  , IsTrue , Poetry]
    , [Yanek  , IsTrue , Life]
    , [Dora   , IsTrue , Poetry]
    , [Dora   , IsTrue , Chemistry]
    , [Dora   , IsTrue , Life]
    , [Stepan , IsTrue , Propaganda]
    , [Boris  , IsTrue , Propaganda]
    , [Yanek , IsTrue , Dora]
    , [Dora , IsTrue , Yanek]
    , [Stepan , IsTrue , Dora]
    ])
  [L N , S , R N] "enjoy"
is_ :: M.Multiword RelU
is_ = M.singleton $ Words
  (fromList
    [ [Yanek , IsTrue , Revolutionary]
    , [Yanek , IsTrue , Poet]
    , [Dora , IsTrue , Revolutionary]
    , [Stepan , IsTrue , Revolutionary]
    , [Stepan , IsTrue , Terrorist]
    , [Boris , IsTrue , Revolutionary]
    , [Duke  , IsTrue , Tsarist]
    , [Skouratov  , IsTrue , Tsarist]
    , [Nephew  , IsTrue , Innocent]
    ])
  [L N , S , R N] "is"
who :: M.Multiword RelU
who = M.singleton $ Words
  (fromList [ [a , a , b , a ] | a <- universe , b <- universe ])
  [ L N , N , R S , N ] "who"
tsarist :: M.Multiword RelU
tsarist = M.singleton $ Words (fromList [[Tsarist]]) [N] "tsarist"
tsarists :: M.Multiword RelU
tsarists = (people <> who <> is_ <> tsarist) M.@@ [N]
revolutionaries :: M.Multiword RelU
revolutionaries = (people <> who <> is_ <> revolutionary) M.@@ [N]
example8 :: M.Multiword RelU
example8 = (people <> who <> combat <> tsarists) M.@@ [N]
example9 :: M.Multiword RelU
example9 = (people <> who <> combat <> people <> who <> combat <> tsarists) M.@@ [N]
life :: M.Multiword RelU
life = M.singleton $ Words (fromList [[Life]]) [N] "life"
propaganda :: M.Multiword RelU
propaganda = M.singleton $ Words (fromList [[Propaganda]]) [N] "propaganda"
innocent :: M.Multiword RelU
innocent = M.singleton $ Words (fromList [[Innocent]]) [N] "innocent"
poetry :: M.Multiword RelU
poetry = M.singleton $ Words (fromList [[Poetry]]) [N] "poetry"
chemistry :: M.Multiword RelU
chemistry = M.singleton $ Words (fromList [[Chemistry]]) [N] "chemistry"
example10 :: M.Multiword RelU
example10 = (revolutionaries <> who <> enjoy <> life <> enjoy <> propaganda) M.@@ [S]
example11 :: M.Multiword RelU
example11 = (yanek' <> likes <> revolutionaries <> who <> enjoy <> poetry <> or <> chemistry) M.@@ [S]
  where
    likes = enjoy
    or = and''