-----------------------------------------------------------------------------
-- Copyright 2019, Advise-Me project team. This file is distributed under 
-- the terms of the Apache License 2.0. For more information, see the files
-- "LICENSE.txt" and "NOTICE.txt", which are included in the distribution.
-----------------------------------------------------------------------------
-- |
-- Maintainer  :  bastiaan.heeren@ou.nl
-- Stability   :  provisional
-- Portability :  portable (depends on ghc)
--
-----------------------------------------------------------------------------

module Task.TheatreRate.Assess where

  import Data.Monoid
  import Domain.Math.Data.Relation
  import Recognize.Data.Approach
  import Bayes.Evidence
  import Recognize.Data.Attribute hiding (Other)
  import Recognize.Data.Diagnosis as S
  import Recognize.Data.RuleId
  import Recognize.Data.Step
  import Recognize.Expr.Symbols
  import Recognize.SubExpr.Symbols
  import Recognize.Model.Assess
  import Recognize.Model.Connectives
  import Recognize.Model.EvidenceBuilder
  import Task.Network.TheatreRate

  assess' :: Diagnosis -> Evidence
  assess' sd =
    stringNode (apprtostring appr) ans2Strat <> --check which approach has been used
    answerCorrect 8 attrs ans2 <> --check if the answer is indeed 8
    generateEvidence buildStepsEvidence appr attrs
    where attrs = map (snd . getValue) $ steps sd
          appr  = approach sd
          apprtostring Algebraic = Just "Algebraic"
          apprtostring Numerical = Just "Numeric"
          apprtostring _         = Nothing

  buildStepsEvidence :: Approach -> EvBuilder ()
  buildStepsEvidence Algebraic = stepsABuilder
  buildStepsEvidence Numerical = stepsNBuilder
  buildStepsEvidence _             = return ()

  stepsABuilder :: EvBuilder ()
  stepsABuilder = do
    giveNodeAndCollect ans2Strat1Step21 $ withoutFailure (exists1 (Label "R1"))
    giveNodeAndCollect ans2Strat1Step22 $ withoutFailure (exists1 (Label "R2"))
    giveNodeAndCollect ans2Strat1Step3 $ withoutFailure ((exists1 (Label "setup equation")) <?>> (exists1 (Label "setup inequation")))
    --The equality path:
    giveNodeAndCollect ans2Strat1Step41 $ withoutFailure (exists1 (Label "setup equation"))
    giveNodeAndCollect ans2Strat1Step51 $ withoutFailure (exists1 (ARuleR Coverup_OneVar_Plus (wildcard .==. wildcard) (wildcard .==. wildcard)))
    giveNodeAndCollect ans2Strat1Step61 $ withoutFailure (exists1 (ARuleR Coverup_Times_Positive (wildcard .==. wildcard) (wildcard .==. wildcard)))
    --The inequality path:
    --We have to think about all options regarding the symbols < and >
    giveNodeAndCollect ans2Strat1Step42 $ withoutFailure (exists1 (Label "setup inequation"))
    giveNodeAndCollect ans2Strat1Step52 $ withoutFailure ((exists1 (ARuleR Coverup_OneVar_Plus (wildcard .<. wildcard) (wildcard .>. wildcard))) <?>> (exists1 (ARuleR Coverup_OneVar_Plus (wildcard .>. wildcard) (wildcard .<. wildcard)))
      <?>> (exists1 (ARuleR Coverup_OneVar_Plus (wildcard .>. wildcard) (wildcard .>. wildcard))) <?>> (exists1 (ARuleR Coverup_OneVar_Plus (wildcard .<. wildcard) (wildcard .<. wildcard))))
    giveNodeAndCollect ans2Strat1Step62 $ withoutFailure ((exists1 (ARuleR Coverup_Times_Positive (wildcard .<. wildcard) (wildcard .>. wildcard))) <?>> (exists1 (ARuleR Coverup_Times_Positive (wildcard .>. wildcard) (wildcard .<. wildcard)))
      <?>> (exists1 (ARuleR Coverup_Times_Positive (wildcard .>. wildcard) (wildcard .>. wildcard))) <?>> (exists1 (ARuleR Coverup_Times_Positive (wildcard .<. wildcard) (wildcard .<. wildcard))))

    giveNodeAndCollect ans2Strat1Step7 (exists1 (FinalAnswer 8))

  stepsNBuilder :: EvBuilder ()
  stepsNBuilder = do
    giveNodeAndCollect ans2Strat2Step1 $ withoutFailure (exists1 (LabelE "Try" newMagicNat))
    giveNodeAndCollect ans2Strat2Step2 $ withoutFailure (exists1 (LabelE "Try" 8))
    giveNodeAndCollect ans2Strat2Step3 (exists1 (FinalAnswer 8))