<!--
Allgemeine Notentabelle für Berufskollegs, die z.B. die etwas langtextigen
Lernfeldfächer unterstützt oder verschiedene Abschlussnoten.

Folgende Attribute werden unterstützt:
lernfeld: Sorgt dafür, dass die Klasse `fach-bezeichnung` nicht gesetzt wird und
          Fächer dementsprechend nicht eingerückt werden (nur Lernfeldfächer)
          true|false Standardwert false
noten:    Hier können Abschnittsnoten oder Abschlussnoten gesetzt werden, z.B.
          hj.noten oder s.bk_abschluss_faecher oder s.fhr_abschluss_faecher
          Muss gesetzt werden
fachGliederungen: sollten mitgegeben werden, wenn die für verschiedene Bildungsgänge
          geänderten Werte berücksichtigt werden sollen, z.B. andere Bezeichnungen
          in den verschiedenen Bildungsgängen
ger:      Wenn ein Referenzniveau für die Fremdsprachen angegeben werden soll
          true|false, Standardwert false,
fachklasse: muss mitgegeben werden, wenn aus der Fachklassen.json Datei der Standard-
          Wert gelesen werden soll. Ansonsten über Lernentw festlegen, was eigetragen wird
faechergruppenIds: legt fest, welche Fächergruppen gezogen werden sollen. Standartwert ist
          ein leerer Array, d.h. alle Fächergruppen werden gezogen. Ansonsten können
          nur bestimmte festgelegt werden z.B. [10, 20, 30]
fhrSternchen: Legt fest, ob die für die FHR relevanten Fächer ein Sternchen
          bekommen. Standardwert ist false
gruppenbezeichnungNeu: Legt für eine GruppenID eine neue Gruppenbezeichnung fest
          Es wird ein Objekt erwartet, z.B. {40: 'Fachpraktische Prüfung'}
berufsbezogenZuerst: Diese Einstellung legt fest, dass die gen. Fächer zuerst auf
          dem Zeugnis als Fächergruppe erscheinen wie in der BASS vorgegeben.
-->

<table class="table-noten">
  {#each faechergruppen as [gruppen_id, gruppenFaecher]}
    <tr>
      <td class="fachgruppe-margin">
        <b>{gruppenbezeichnung(gruppen_id)}</b>
      </td>
    </tr>
    {#each lernbereicheUndFaecher(gruppenFaecher) as [lernbereich, faecher]}
      {#if lernbereich != faecher[0].fach.Zeugnisbez}
        <tr><td colspan="2" class="{lernfeld ? '' : 'fach-bezeichnung'}">{lernbereich}</td></tr>
      {/if}
      {#each faecher as f (f.ID)}
        {#if f.fach.AufZeugnis === '+'}
          <tr>
            <td class="{lernfeld ? '' : 'fach-bezeichnung'} {lernbereich != faecher[0].fach.Zeugnisbez ? 'lernfeld-lernbereich' : ''}">
              {#if f.fach.Zeugnisbez.includes("Projekt")}
                <!-- Funktioniert nicht mit Abschlussnoten, da diese keine Spalte `Lernentw` haben -->
                {f.Lernentw}
              {:else}
                <!-- Die Zeugnisbezeichnung hat bei gesetzten fachGliederungen einen anderen Namen... -->
                {f.fach.ZeugnisBez || f.fach.Zeugnisbez}
                <!-- Ist ger gesetzt, unter Lernentw nach Eintrag schauen. Wenn dort nichts steht,
                in der Fachklassen.json nach Einträgen für Fremdsprache und Fach_ID suchen
                Mit der Fussnote 1 muss natürlich auch tatsächlich eine Fussnote zum GER existieren … -->
                {#if ger && f.fach.IstSprache === '+'}
                  {fremdsprache(f, fachklasse)}<sup>1</sup>
                {/if}
                <!-- Die für die FHR Durchschnittsnote einbezogenen Noten bekommen in
                den FS-Zeugnissen ein Sternchen -->
                {#if fhrSternchen && f.fach.GewichtungFHR > 0}
                  <sup>*</sup>
                {/if}
              {/if}
            </td>
            <!-- Entweder Abschlussnote, wenn gesetzt oder Abschnittsnote oder nix -->
            <!-- Wenn als Note eines der 'Teilgenommen' steht, dann ohne graue Hinterlegung.
            Außer es ist eine Sprache, dann wird es wohl ein 'teilgenommen' sein,
            das auf eine Fremdsprachenprüfung hinweist und nicht mit den anderen
            Fächern im Diff-Bereich steht. Optisch besser. -->
            {#if (f.fach.IstSprache==='-') && (f.NoteAbschluss?.toUpperCase().startsWith('E') || f.NotenKrz?.toUpperCase().startsWith('E'))}
              <td class="td-fach-note"><span class="e-note">{note(f.NoteAbschluss) || note(f.NotenKrz)}</span></td>
            {:else}
              <td class="td-fach-note"><span>{note(f.NoteAbschluss) || note(f.NotenKrz) || '–––––'}</span></td>
            {/if}
          </tr>
        {/if}
      {/each}
    {/each}
    <tr>
    </tr>
  {/each}
</table>

<script>
  import { gruppenIds } from './gruppenIDs'
  import { note, fremdsprache, groupBy } from '../helfer'

  export let lernfeld
  export let ger = false
  export let faechergruppenIds = []
  export let noten, fachGliederungen, fachklasse
  export let fhrSternchen, gruppenbezeichnungNeu
  export let berufsbezogenZuerst = true

  let faechergruppen

  // Berechne die Noten neu, wenn sich die Notenquelle ändert
  $: noten && faechergruppen_calc()

  Object.assign(gruppenIds, gruppenbezeichnungNeu)

  const faechergruppen_calc = () => {
    // noten werden im jeweiligen Dokument über das *noten*-Attribut mitgegeben.
    // z.B. die Abschnittsnote oder die Noten aus *s.bk_abschluss_faecher* und co.
    // Nutzer über Konsole auf Änderungen in den Fächern hinweisen
    if (fachGliederungen && fachGliederungen.length > 0) console.log('Es wurden Fachgliederungswerte gesetzt: ', fachGliederungen)
    // suche in den fachGliederungen, ob für die jeweilige Fachklasse was besonderes festgelegt wurde
    // vorausgesetzt, fachGliederungen wurde mitgegeben
    const faecher = fachGliederungen
      ? noten.map(f => {return {...f, fach: Object.assign(f.fach, fachGliederungen.find(fg => fg.Fach_ID === f.Fach_ID))}})
      : noten
    // nun alle Fächer rauswerfen, die nicht in den FaechergruppenIds zugeordnet sind, z.B. Abschlussarbeiten, Projekte etc.
    const faecherBereinigt = faechergruppenIds.length === 0
      ? faecher
      : faecher.filter(f => faechergruppenIds.find(id => f.fach.Fachgruppe_ID === id))
    // erstmal alle Fächer sortieren in der passenden Reihenfolge,
    // dann nach Fachgruppe gruppieren
    const sortiert = faecherBereinigt.sort((a, b) => a.fach.SortierungS2 < b.fach.SortierungS2 ? 1 : -1)
    let gruppiert = groupBy(sortiert, 'fach.Fachgruppe_ID')
    // Die BK-Zeugnisse führen zuerst die berufsbezogenen Fächer auf.
    // D.h. Gruppen_ID 20 muss auf 0 gesetzt werden, damit es an den Anfang kommt
    if (berufsbezogenZuerst && gruppiert.get(20)) {
      gruppiert.set(0, gruppiert.get(20))
      gruppiert.delete(20)
      gruppenIds[0] = gruppenIds[20]
    }
    faechergruppen = [...gruppiert.entries()].sort((a,b) => a[0] - b[0])
  }
  const gruppenbezeichnung = gruppe => gruppenIds[gruppe]
  const lernbereicheUndFaecher = gruppenFaecher => [...groupBy(gruppenFaecher, 'fach.Bezeichnung').entries()].reverse()
</script>

<style>
.table-noten {
  width: 100%;
  border: none;
  border-collapse: collapse;
  margin-bottom: 1rem;
}
.fach-bezeichnung {
  padding-left: 10mm;
}
.td-fach-note {
  padding-bottom: .2rem;
  padding-top: .2rem;
  width: 12rem;
}
.td-fach-note span {
  background-color: #dcdcdc !important;
  text-align: center;
  width: 10rem;
  display: block;
  margin: 0 auto;
}
.td-fach-note span.e-note {
  background-color: white !important;
  width: 17em;
  margin: 0;
  padding: 0;
}
.fachgruppe-margin {
  padding-top: 0.3rem;
}
.lernfeld-lernbereich {
  padding-left: 2rem;
  padding-bottom: 0;
}
</style>
