$newline never
$maybe Entity _ ExamResult{examResultResult} <- result
  $if gradingShown
    <section>
      <h2>
        _{MsgTableExamResult}
        $if gradingShown && not gradingVisible
          \ ^{isVisible False}
      <p .result>
        $case examResultResult
          $of ExamAttended grade
            _{grade}
          $of ExamNoShow
            _{MsgExamNoShow}
          $of ExamVoided
            _{MsgExamVoided}

$maybe desc <- examDescription
  <section>
    #{desc}

<section>
  $maybe warn <- notificationDiscouragedExamMode
    ^{warn}
  
  <dl .deflist>
    $if not examVisible
      <dt .deflist__dt>_{MsgExamVisibleFrom}
      <dd .deflist__dd>
        $maybe from <- examVisibleFrom
          ^{formatTimeW SelFormatDateTime from}
        $nothing
          _{MsgExamNever}
        \ ^{isVisible False}
    $maybe regFrom <- examRegisterFrom
      <dt .deflist__dt>_{MsgTableExamRegisterFrom}
      <dd .deflist__dd>^{formatTimeW SelFormatDateTime regFrom}
    $maybe regTo <- examRegisterTo
      <dt .deflist__dt>_{MsgTableExamRegisterTo}
      <dd .deflist__dd>^{formatTimeW SelFormatDateTime regTo}
    $maybe deregUntil <- examDeregisterUntil
      <dt .deflist__dt>_{MsgExamDeregisterUntil}
      <dd .deflist__dd>^{formatTimeW SelFormatDateTime deregUntil}
    $maybe publishAssignments <- examPublishOccurrenceAssignments
      <dt .deflist__dt>_{MsgExamPublishOccurrenceAssignmentsParticipant}
      <dd .deflist__dd>^{formatTimeW SelFormatDateTime publishAssignments}
    $maybe online <- examOnline examExamMode
      <dt .deflist__dt>_{MsgExamShowOnline}
      <dd .deflist__dd>
        $case online
          $of ExamOnlinePreset p 
            ^{examOnlinePresetWidget p}
          $of ExamOnlineCustom c
            #{c}
    $maybe synchronicity <- examSynchronicity examExamMode
      <dt .deflist__dt>_{MsgExamShowSynchronicity}
      <dd .deflist__dd>
        $case synchronicity
          $of ExamSynchronicityPreset p 
            ^{examSynchronicityPresetWidget p}
          $of ExamSynchronicityCustom c
            #{c}
    $maybe aids <- examAids examExamMode
      <dt .deflist__dt>_{MsgExamShowAids}
      <dd .deflist__dd>
        $case aids
          $of ExamAidsPreset p 
            ^{examAidsPresetWidget p}
          $of ExamAidsCustom c
            #{c}
    $maybe requiredEquipment <- examRequiredEquipment examExamMode
      <dt .deflist__dt>_{MsgExamShowRequiredEquipment}
      <dd .deflist__dd>
        <p>
          $case requiredEquipment
            $of ExamRequiredEquipmentPreset p 
              ^{examRequiredEquipmentPresetWidget p}
            $of ExamRequiredEquipmentCustom c
              #{c}

        ^{notificationPersonalIdentification}
    $maybe room <- examRoom
      <dt .deflist__dt>_{MsgExamRoom}
      <dd .deflist__dd>^{roomReferenceWidget room}
    $if examTimes
      <dt .deflist__dt>_{MsgTableExamTime}
      <dd .deflist__dd>
        $maybe start <- examStart
          ^{formatTimeRangeW SelFormatDateTime start examEnd}
    $maybe finished <- examFinished
      <dt .deflist__dt>_{examFinishedMsg}
      <dd .deflist__dd>^{formatTimeW SelFormatDateTime finished}
    $if examClosedShown
      $maybe closed <- examClosed
        <dt .deflist__dt>_{MsgExamClosed} ^{isVisible False}
        <dd .deflist__dd>^{formatTimeW SelFormatDateTime closed}
    $maybe staff <- examStaff
      $if staffInfoShown
        <dd .deflist__dt>_{MsgExamStaff} ^{isVisible False}
        <dt .deflist__dd>#{staff}
    $if staffInfoShown && not (onull extraSchools)
      <dd .deflist__dt>_{MsgExamExamOfficeSchools} ^{isVisible False}
      <dt .deflist__dd>
        <ul>
          $forall Entity _ School{schoolName} <- extraSchools
            <li>#{schoolName}
    $if gradingShown
      $maybe gradingRule <- examGradingRule
        <dt .deflist__dt>
          _{MsgExamGradingRule}
          $if not gradingVisible
            \ ^{isVisible False}
        <dd .deflist__dd>
          $case gradingRule
            $of ExamGradingKey{..}
              ^{gradingKeyW examGradingKey}
      $maybe bonusRule <- examBonusRule
        <dt .deflist__dt>
          _{MsgExamBonusRule}
          $if not gradingVisible
            \ ^{isVisible False}
        <dd .deflist__dd>
          ^{examBonusW bonusRule}
    $if examOccurrenceRule /= ExamRoomManual
      $if occurrenceAssignmentsShown
        <dt .deflist__dt>
          _{MsgExamOccurrenceRuleParticipant}
          $if not occurrenceAssignmentsVisible
            \ ^{isVisible False}
        <dd .deflist__dd>
          _{classifyExamOccurrenceRule examOccurrenceRule}
    $if showRegisteredCount
      <dt .deflist__dt>_{MsgExamRegisteredCount}
      <dd .deflist__dd>#{registeredCount}
    $maybe registerWdgt <- registerWidget Nothing
      <dt .deflist__dt>
        _{MsgTableExamRegistration}
      <dd .deflist__dd>
        ^{registerWdgt}
  $if is _Nothing (examRequiredEquipment examExamMode)
    ^{notificationPersonalIdentification}

$if (showCloseWidget && is _Nothing examClosed) && (showFinishWidget && is _Nothing examFinished)
  <div .two-column-sections>
    <section>
      <h2>
        _{MsgExamCloseHeading}
        \ ^{isVisible False}
      ^{closeWgt}
    <section>
      <h2>
        _{MsgExamFinishHeading}
        \ ^{isVisible False}
      ^{finishWgt}
$else
  $if showCloseWidget && is _Nothing examClosed
    <section>
      <h2>
        _{MsgExamCloseHeading}
        \ ^{isVisible False}
      ^{closeWgt}
  $if showFinishWidget && is _Nothing examFinished
    <section>
      <h2>
        _{MsgExamFinishHeading}
        \ ^{isVisible False}
      ^{finishWgt}
$if examOccurrenceRuleAutomatic examOccurrenceRule && showAutoOccurrenceCalculateWidget
  <section>
    <h2>
      _{MsgExamAutoOccurrenceHeading}
      \ ^{isVisible False}
    ^{examAutoOccurrenceCalculateWidget tid ssh csh examn}
  

$if not (null occurrences)
  <section>
    <h2>
      $if examTimes
        _{MsgExamRooms}
      $elseif is _Just examRoom
        _{MsgExamTimes}
      $else
        _{MsgExamOccurrences}
    <table .table .table--striped .table--hover>
      <thead>
        <tr .table__row .table__row--head>
          $if occurrenceNamesShown
            <th .table__th>
              _{MsgExamRoomName}
              \ ^{isVisible False}
          $if is _Nothing examRoom
            <th .table__th>_{MsgExamRoom}
          $if not examTimes
            <th .table__th>_{MsgExamRoomTime}
          $if showOccurrenceRegisterColumn
            <th .table__th>
              $if examOccurrenceRule == ExamRoomFifo
                _{MsgExamRoomRegistered}
              $else
                _{MsgExamRoomAssigned}
              $if not occurrenceAssignmentsVisible
                \ ^{isVisible False}
          $if showOccurrenceMappingColumn
            $case fmap examOccurrenceMappingRule examExamOccurrenceMapping
              $of Just ExamRoomSurname
                <th .table__th>
                  _{MsgExamRoomMappingSurname}
                  $if not occurrenceAssignmentsVisible
                    \ ^{isVisible False}
              $of Just ExamRoomMatriculation
                <th .table__th>
                  _{MsgExamRoomMappingMatriculation}
                  $if not occurrenceAssignmentsVisible
                    \ ^{isVisible False}
              $of Just ExamRoomRandom
                <th .table__th>
                  _{MsgExamRoomMappingRandom}
                  $if not occurrenceAssignmentsVisible
                    \ ^{isVisible False}
              $of _
                <th .table__td>
                  $if not occurrenceAssignmentsVisible
                    ^{isVisible False}
          $if showRegisteredCount
            <th .table__th>
              _{MsgExamRegisteredCount}
              \ ^{isVisible False}
          <th .table__th>_{MsgExamRoomDescription}
      <tbody>
        $forall (occurrence, registered, rCount, showRoom) <- occurrences
          $with Entity _occId ExamOccurrence{examOccurrenceName, examOccurrenceRoom, examOccurrenceStart, examOccurrenceEnd, examOccurrenceDescription} <- occurrence
            $with registerWdgt <- registerWidget (Just occurrence)
              <tr .table__row :markUnregisteredOccurrences (Just occurrence) && not registered:.occurrence--not-registered>
                $if occurrenceNamesShown
                  <td .table__td #exam-occurrence__#{examOccurrenceName}>#{examOccurrenceName}
                $if is _Nothing examRoom
                  $if showRoom
                    <td .table__td>
                      $maybe room <- examOccurrenceRoom
                        ^{roomReferenceWidget room}
                      $nothing
                        _{MsgExamOccurrenceRoomIsUnset}
                  $else
                    <td .table__td .explanation>
                      _{MsgExamOccurrenceRoomIsHidden}
                $if not examTimes
                  <td .table__td>
                    ^{formatTimeRangeW SelFormatDateTime examOccurrenceStart examOccurrenceEnd}
                $if showOccurrenceRegisterColumn
                  <td .table__td>
                    $maybe registerWdgt' <- registerWdgt
                      ^{registerWdgt'}
                    $nothing
                      $if registered
                        #{iconOK}
                $if showOccurrenceMappingColumn
                  <td .table__td>
                    $maybe mappingWgt <- occurrenceMapping examOccurrenceName
                      ^{mappingWgt}
                $if showRegisteredCount
                  <td .table__td>#{rCount}
                <td .table__td>
                  $maybe desc <- examOccurrenceDescription
                    #{desc}
      <tfoot>
        <tr .table__row .table__row--sum>
          $if occurrenceNamesShown
            <td>
          $if is _Nothing examRoom
            <td>
          $if not examTimes
            <td>
          $if showOccurrenceRegisterColumn
            <td>
          $if showOccurrenceMappingColumn
            <td>
          $if showRegisteredCount
            <td .table__td>
              $if sumRegisteredCount == registeredCount
                #{sumRegisteredCount}
              $else
                _{MsgExamRegisteredCountOf sumRegisteredCount registeredCount}
          <td>


$if (gradingShown || partsShown) && not (null examParts)
  <section>
    <h2>
      _{MsgExamParts}
      $if (gradingShown && not gradingVisible) || (partsShown && not partsVisible)
        \ ^{isVisible False}
    <table .table .table--striped .table--hover >
      <thead>
        <tr .table__row .table__row--head>
          $if partNumbersShown
            <th .table__th>
              _{MsgExamPartNumber} ^{isVisible False}
          <th .table__th>_{MsgExamPartName}
          $if showPartSheets
            <th .table__th>_{MsgExamPartSheets}
          $if showMaxPoints
            <th .table__th>_{MsgExamPartMaxPoints}
          $if showAchievedPoints
            <th .table__th>_{MsgExamPartResultPoints}
      <tbody>
        $forall (Entity partId ExamPart{examPartNumber, examPartName, examPartWeight, examPartMaxPoints}, cID, partSheets) <- examParts
          <tr .table__row ##{toPathPiece cID}>
            $if partNumbersShown
              <td .table__td>#{examPartNumber}
            <td .table__td>
              $maybe pName <- examPartName
                #{pName}
              $nothing
                _{MsgExamPartNumbered examPartNumber}
            $if showPartSheets
              <td .table__td>
                $if not (null partSheets)
                  <ul .list--inline .list--comma-separated>
                    $forall Entity _ Sheet{sheetName} <- partSheets
                      <li>
                        <a href=@{CSheetR tid ssh csh sheetName SShowR}>
                          #{sheetName}
            $if showMaxPoints
              <td .table__td>
                $maybe mPoints <- examPartMaxPoints
                  #{showFixed True (fromRational examPartWeight * mPoints)}
            $if showAchievedPoints
              <td .table__td>
                $case fmap (examPartResultResult . entityVal) (results !? partId)
                  $of Nothing
                  $of Just (ExamAttended ps)
                    #{showFixed True ps}
                  $of Just ExamNoShow
                    _{MsgExamNoShow}
                  $of Just ExamVoided
                    _{MsgExamVoided}
      <tfoot>
        $maybe mPoints <- fmap (examBonusBonus . entityVal) bonus
          $if showMaxPoints
            <tr .table__row .table__row--sum>
              $if partNumbersShown
                <td>
              <td>
              $if showPartSheets
                <td>
              <td .table__td>
                #{showFixed True sumMaxPoints}
              <td>
          <tr .table__row>
            $if partNumbersShown
              <td .table__td>
            <td .table__td>
              <a href=@{CourseR tid ssh csh SheetListR}>
                _{MsgExamBonusAchieved}
            $if showPartSheets
              <td>
            $if showMaxPoints
              <td .table__td>
            $if showAchievedPoints
              <td .table__td :noBonus:.no-bonus>
                #{showFixed True mPoints}
          <tr .table__row .table__row--sum>
            $if partNumbersShown
              <td>
            <td>
            $if showPartSheets
              <td>
            $if showMaxPoints
              <td>
            $if showAchievedPoints
              <td .table__td>
                $case sumPoints
                  $of ExamAttended ps
                    #{showFixed True ps}
                  $of _
        $nothing
            <tr .table__row .table__row--sum>
              $if partNumbersShown
                <td>
              <td>
              $if showPartSheets
                <td>
              $if showMaxPoints
                <td .table__td>
                  #{showFixed True sumMaxPoints}
              $if showAchievedPoints
                <td .table__td>
                  $case sumPoints
                    $of ExamAttended ps
                      #{showFixed True ps}
                    $of _
            
          

$# TODO: Statistics
