-----------------------------------------------------------------------------
-- 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.Pattern.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.RuleId
import Recognize.Data.Diagnosis as S
import Recognize.Data.Step
import Recognize.Expr.Symbols
import Recognize.Model.Assess
import Recognize.Model.Connectives
import Recognize.Model.EvidenceBuilder
import Task.Network.Pattern

assess' :: Diagnosis -> Evidence
assess' sd =
  stringNode (apprtostring appr) ans1Strat <> --check which approach has been used
  answerCorrect 16 attrs ans1 <> --check if the answer is indeed 16
  generateEvidence buildStepsEvidence appr attrs
  where
    attrs = map (snd . getValue) $ steps sd
    appr  = approach sd
    apprtostring Generalizing = Just "Algebraic"
    apprtostring Numerical = Just "Numeric1"
    apprtostring (Other "Numerical2") = Just "Numeric2"
    apprtostring _         = Nothing


buildStepsEvidence :: Approach -> EvBuilder ()
buildStepsEvidence Generalizing = stepsAGBuilder
buildStepsEvidence Numerical = stepsN1Builder
buildStepsEvidence (Other "Numerical2") = stepsN2Builder
buildStepsEvidence _             = return ()

stepsAGBuilder :: EvBuilder ()
stepsAGBuilder = do
  giveNodeAndCollect ans1Strat1Step2 $ withoutFailure (exists1 (Label "definition"))


  stepsAG1Builder >> stepsAG2Builder

stepsAG1Builder :: EvBuilder ()
stepsAG1Builder = do
  giveNodeAndCollect ans1Strat1Step31 $ withoutFailure (exists1 (Label "equation"))

  giveNodeAndCollect ans1Strat1Step41 $ withoutFailure (exists1 (ARuleR Coverup_OneVar_Plus (wildcard .==. wildcard) (wildcard .==. wildcard)))

  giveNodeAndCollect ans1Strat1Step51 $ withoutFailure (exists1 (ARuleR Coverup_Times_Positive (wildcard .==. wildcard) (wildcard .==. wildcard)))

  giveNodeAndCollect ans1Strat1Step6 $ implication [ FinalAnswer wildcard ] [ FinalAnswer 16]

stepsAG2Builder :: EvBuilder ()
stepsAG2Builder = do
  giveNodeAndCollect ans1Strat1Step32 $ withoutFailure (exists1 (Label "inequation"))

  giveNodeAndCollect ans1Strat1Step42 $ withoutFailure (exists1 (ARuleR Coverup_OneVar_Plus (wildcard .>. wildcard) (wildcard .>. wildcard)))

  giveNodeAndCollect ans1Strat1Step52 $ withoutFailure (exists1 (ARuleR Coverup_Times_Positive (wildcard .>. wildcard) (wildcard .>. wildcard)))

  giveNodeAndCollect ans1Strat1Step6 $ implication [ FinalAnswer wildcard ] [ FinalAnswer 16]

stepsN1Builder :: EvBuilder ()
stepsN1Builder = do
  giveNodeAndCollectAllKnown ans1Strat2Step1 [exists1 (NExpr 7), exists1 (NExpr 10), exists1 (NExpr 13), exists1 (NExpr 16)]

  giveNodeAndCollect ans1Strat2Step2 $ exists1 (NExpr 52) ==> (failOnCommonMistake <?>> success)

  giveNodeAndCollect ans1Strat2Step3 $ implication [ FinalAnswer wildcard ] [ FinalAnswer 16 ]


stepsN2Builder :: EvBuilder ()
stepsN2Builder = do
  giveNodeAndCollect ans1Strat3Step2 $ withoutFailure (exists1 (Label "subtract"))

  giveNodeAndCollect ans1Strat3Step3 $ withoutFailure (exists1 (Label "divide"))

  giveNodeAndCollect ans1Strat3Step4 $ withoutFailure (exists1 (Label "increase"))

  giveNodeAndCollect ans1Strat3Step5 $ implication [ FinalAnswer wildcard ] [ FinalAnswer 16 ]