import { Injectable } from '@angular/core';
import { Spell } from 'src/interfaces/spell';
import { Subject } from 'rxjs';

@Injectable({
  providedIn: 'root',
})
export class SpellsService {
  // Functions

  private _closeSubject = new Subject<number>();

  public closeSubject$ = this._closeSubject.asObservable();

  public closeAllOthers(level: number): void {
    this._closeSubject.next(level);
  }

  // Spells
  private level0: string[] = [
    'Führung (Guidance)',
    'Totenläuten (Toll the Dead)',
    'Thaumaturgie (Thaumaturgy)',
  ];

  private level1: string[] = [
    'Wunden Heilen (Cure Wounds)',
    'Wunden hinzufügen (Inflict Wounds)',
    'Magie entdecken (Detect Magic)',
    'Gift und Krankheiten entdecken (Detect Poison and Disease)',
    'Segnen (Bless)',
    'Heilendes Wort (Healing Word)',
    'Lenkendes Geschoss (Guiding Bolt)',
    'Heldenmut (Heroism)',
    'Heiligtum (Sanctuary)',
  ];

  private level2: string[] = [];

  private level3: string[] = [];

  private level4: string[] = [];

  private level5: string[] = [];

  private level6: string[] = [];

  private level7: string[] = [];

  private level8: string[] = [];

  private level9: string[] = [];

  public getListOfSpells(level: number) {
    switch (level) {
      case 0:
        return this.level0;
      case 1:
        return this.level1;
      case 2:
        return this.level2;
      case 3:
        return this.level3;
      case 4:
        return this.level4;
      case 5:
        return this.level5;
      case 6:
        return this.level6;
      case 7:
        return this.level7;
      case 8:
        return this.level8;
      case 9:
        return this.level9;
      default:
        return this.level0;
    }
  }

  public getSpell(name: string): Spell {
    switch (name) {
      case 'Führung (Guidance)':
        return this.guidance;
      case 'Totenläuten (Toll the Dead)':
        return this.tollTheDead;
      case 'Thaumaturgie (Thaumaturgy)':
        return this.thaumaturgie;
      case 'Wunden Heilen (Cure Wounds)':
        return this.cureWounds;
      case 'Wunden hinzufügen (Inflict Wounds)':
        return this.inflictWounds;
      case 'Magie entdecken (Detect Magic)':
        return this.detectMagic;
      case 'Segnen (Bless)':
        return this.bless;
      case 'Heilendes Wort (Healing Word)':
        return this.healingWord;
      case 'Lenkendes Geschoss (Guiding Bolt)':
        return this.guidingBolt;
      case 'Gift und Krankheiten entdecken (Detect Poison and Disease)':
        return this.detectPoisonAndDisease;
      case 'Heldenmut (Heroism)':
        return this.heroism;
      case 'Heiligtum (Sanctuary)':
        return this.santcuary;
      default:
        return this.guidance;
    }
  }

  private inflictWounds: Spell = {
    name: 'Wunden hinzufügen',
    level: 1,
    cost: 'action',
    duration: 0,
    canRitual: false,
    needsVerbal: true,
    needsSomatic: true,
    needsMaterial: false,
    needsConcentration: false,
    needsAttackRoll: true,
    needsSavingThrow: false,
    doesDamage: true,
    damage: [{ diceNumber: '3', diceType: 'd10', damageType: 'necrotic' }],
    doesHeal: false,
    heal: { diceNumber: '', diceType: '', additionalHeal: 0 },
    description:
      'Mach einen Nahkampf-Zauberangriff gegen eine Kreatur deiner Wahl. Bei einem Erfolg erleidet das Ziel 3W10 Nekrotischen Schaden. Auf höheren Graden: Wirkst du diesen Zauber, indem du einen Zauberplatz des 2. Grades oder höher nutzt, steigt der Schaden für jeden Grad über dem 1. um 1W10.',
    school: 'necromancy',
    isRanged: false,
    range: 5,
    hasAreaOfEffect: false,
    areaOfEffectType: '',
    radius: 0,
  };

  private guidance: Spell = {
    name: 'Göttliche Führung',
    level: 0,
    cost: 'action',
    duration: 10,
    canRitual: false,
    needsVerbal: true,
    needsSomatic: true,
    needsMaterial: false,
    needsConcentration: true,
    needsAttackRoll: false,
    needsSavingThrow: false,
    doesDamage: false,
    damage: [{ diceNumber: '', diceType: '', damageType: '' }],
    doesHeal: false,
    heal: { diceNumber: '', diceType: '', additionalHeal: 0 },
    description:
      'Du berührst eine bereitwillige Kreatur. Einmal vor dem Ende des Zaubers kann das Ziel mit einem W4 würfeln und das Ergebnis zu einem Attributswurf seiner Wahl addieren. Es kann mit dem W4 vor oder nach dem Attributswurf würfeln. Dann endet der Zauber.',
    school: 'divination',
    isRanged: false,
    range: 5,
    hasAreaOfEffect: false,
    areaOfEffectType: '',
    radius: 0,
  };

  private tollTheDead: Spell = {
    name: 'Totenläuten',
    level: 0,
    cost: 'action',
    duration: 0,
    canRitual: false,
    needsVerbal: true,
    needsSomatic: true,
    needsMaterial: false,
    needsConcentration: false,
    needsAttackRoll: false,
    needsSavingThrow: true,
    savingThrowAttribute: 'wisdom',
    doesDamage: true,
    damage: [{ diceNumber: '1', diceType: 'd8', damageType: 'necrotic' }],
    doesHeal: false,
    heal: { diceNumber: '', diceType: '', additionalHeal: 0 },
    description:
      'Du zeigst auf eine Kreatur innehalb von 18 Meter, die du sehen kannst und der Klang schmerzhafter Glocken füllt die Luft um sie herum für einen Moment. Das Ziel muss einen Weisheitsrettungswurf machen oder 1W8 Nekrotischen Schaden erleiden. Wenn das Ziel bereits Schaden erlitten hat, erhöht sich der Schaden auf 1W12.',
    school: 'necromancy',
    isRanged: true,
    range: 60,
    hasAreaOfEffect: false,
    areaOfEffectType: '',
    radius: 0,
  };

  private thaumaturgie: Spell = {
    name: 'Thaumaturgie',
    level: 0,
    cost: 'action',
    duration: 10,
    canRitual: false,
    needsVerbal: true,
    needsSomatic: false,
    needsMaterial: false,
    needsConcentration: false,
    needsAttackRoll: false,
    needsSavingThrow: false,
    doesDamage: false,
    damage: [{ diceNumber: '', diceType: '', damageType: '' }],
    doesHeal: false,
    heal: { diceNumber: '', diceType: '', additionalHeal: 0 },
    description:
      'Du erzeugst einen der folgenden magischen Effekte innerhalb von 9 Metern: \b\b • Deine Stimme wird dreimal lauter.\b • Du lässt einen unverschlossenen Tür oder ein Fenster aufspringen. \b• Du lässt eine Flamme aufleuchten, erlöschen oder ihre Farbe ändern. \b• Du lässt den Boden für eine Minute beben.\b • Du erzeugst Geräusche, die von dir ausgehen, wie das Flüstern einer Stimme, das Brüllen eines Löwen, das Knurren von Donner oder das Klappern von Metall. \b• Du lässt eine Tür oder ein Fenster, das du berührst, für eine Minute verriegeln oder entriegeln.',
    school: 'transmutation',
    isRanged: true,
    range: 30,
    hasAreaOfEffect: false,
    areaOfEffectType: '',
    radius: 0,
  };

  private cureWounds: Spell = {
    name: 'Heilende Berührung',
    level: 1,
    cost: 'action',
    duration: 0,
    canRitual: false,
    needsVerbal: true,
    needsSomatic: true,
    needsMaterial: false,
    needsConcentration: false,
    needsAttackRoll: false,
    needsSavingThrow: false,
    doesDamage: false,
    damage: [{ diceNumber: '', diceType: '', damageType: '' }],
    doesHeal: true,
    heal: { diceNumber: '1', diceType: 'd8', additionalHeal: 4 },
    description:
      'Eine Kreatur, die du berührst, gewinnt Trefferpunkte in Höhe von 1W8 + deinem Attributsmodifikator im Zauberwirken zurück. Dieser Zauber wirkt nicht auf Untote oder Konstrukte. Auf höheren Graden: Wirkst du diesen Zauber, indem du einen Zauberplatz des 2. Grades oder höher nutzt, steigt die Heilung für jeden Grad über dem 1. um 1W8.',
    school: 'evocation',
    isRanged: false,
    range: 5,
    hasAreaOfEffect: false,
    areaOfEffectType: '',
    radius: 0,
  };

  private detectMagic: Spell = {
    name: 'Magie entdecken',
    level: 1,
    cost: 'action',
    duration: 100,
    canRitual: true,
    needsVerbal: true,
    needsSomatic: true,
    needsMaterial: false,
    needsConcentration: false,
    needsAttackRoll: false,
    needsSavingThrow: false,
    doesDamage: false,
    damage: [{ diceNumber: '', diceType: '', damageType: '' }],
    doesHeal: false,
    heal: { diceNumber: '', diceType: '', additionalHeal: 0 },
    description:
      'Während der Wirkungsdauer nimmst du die Gegenwart von Magie im Abstand von bis zu neun Metern von dir wahr. Wenn du auf diese Weise Magie wahrnimmst, kannst du deine Aktion verwenden, um schwache Auren um sichtbare magische Kreaturen oder Objekte sowie ihre magische Schule zu erkennen, falls vorhanden. Dieser Zauber durchdringt die meisten Barrieren, wird aber von 30 Zentimetern Stein, 2,5 Zentimetern gewöhnlichem Metall, dünnem Bleiblech sowie von einem Meter Holz oder Erde blockiert.',
    school: 'divination',
    isRanged: true,
    range: 30,
    hasAreaOfEffect: false,
    areaOfEffectType: '',
    radius: 0,
  };

  private bless: Spell = {
    name: 'Segnen',
    level: 1,
    cost: 'action',
    duration: 10,
    canRitual: false,
    needsVerbal: true,
    needsSomatic: true,
    needsMaterial: true,
    needsConcentration: true,
    needsAttackRoll: false,
    needsSavingThrow: false,
    doesDamage: false,
    damage: [{ diceNumber: '', diceType: '', damageType: '' }],
    doesHeal: false,
    heal: { diceNumber: '', diceType: '', additionalHeal: 0 },
    description:
      'Du segnest bis zu drei Kreaturen deiner Wahl in Reichweite. Wenn ein Ziel während der Wirkungsdauer einen Angriffs- oder Rettungswurf ausführt, darf es mit einem W4 würfeln und das Würfelergebnis zu seinem Angriffs- oder Rettungswurf addieren. Auf höheren Graden: Wirkst du diesen Zauber, indem du einen Zauberplatz des 2. Grades oder höher nutzt, kannst du für jeden Grad über dem 1. eine zusätzliche Kreatur als Ziel wählen.',
    school: 'enchantment',
    isRanged: true,
    range: 60,
    hasAreaOfEffect: false,
    areaOfEffectType: '',
    radius: 0,
  };

  private healingWord: Spell = {
    name: 'Heilendes Wort',
    level: 1,
    cost: 'bonus action',
    duration: 0,
    canRitual: false,
    needsVerbal: true,
    needsSomatic: false,
    needsMaterial: false,
    needsConcentration: false,
    needsAttackRoll: false,
    needsSavingThrow: false,
    doesDamage: false,
    damage: [{ diceNumber: '', diceType: '', damageType: '' }],
    doesHeal: true,
    heal: { diceNumber: '1', diceType: 'd4', additionalHeal: 4 },
    description:
      'Eine Kreatur deiner Wahl in Reichweite, die du sehen kannst, gewinnt Trefferpunkte in Höhe von 1W4 + deinem Zauberwirken-Attributsmodifikator zurück. Dieser Zauber wirkt nicht auf Untote oder Konstrukte. Auf höheren Graden: Wirkst du diesen Zauber, indem du einen Zauberplatz des 2. Grades oder höher nutzt, steigt die Heilung für jeden Grad über dem 1. um 1W4.',
    school: 'evocation',
    isRanged: true,
    range: 60,
    hasAreaOfEffect: false,
    areaOfEffectType: '',
    radius: 0,
  };

  private guidingBolt: Spell = {
    name: 'Lenkendes Geschoss',
    level: 1,
    cost: 'action',
    duration: 0,
    canRitual: false,
    needsVerbal: true,
    needsSomatic: true,
    needsMaterial: false,
    needsConcentration: false,
    needsAttackRoll: true,
    needsSavingThrow: false,
    doesDamage: true,
    damage: [{ diceNumber: '4', diceType: 'd6', damageType: 'radiant' }],
    doesHeal: false,
    heal: { diceNumber: '', diceType: '', additionalHeal: 0 },
    description:
      'Ein Lichtblitz schießt auf eine Kreatur deiner Wahl in Reichweite zu. Führe einen Fernkampf-Zauberangriff gegen das Ziel aus. Bei einem Erfolg erleidet das Ziel 4W6 gleißenden Schaden. Dank des mystischen dämmrigen Lichts, das auf dem Ziel glitzert, ist der nächste Angriffswurf gegen das Ziel vor Ende deines nächsten Zugs im Vorteil. Auf höheren Graden: Wirkst du diesen Zauber, indem du einen Zauberplatz des 2. Grades oder höher nutzt, steigt der Schaden für jeden Grad über dem 1. um 1W6.',
    school: 'evocation',
    isRanged: true,
    range: 120,
    hasAreaOfEffect: false,
    areaOfEffectType: '',
    radius: 0,
  };

  private detectPoisonAndDisease: Spell = {
    name: 'Gift und Krankheiten entdecken',
    level: 1,
    cost: 'action',
    duration: 100,
    canRitual: true,
    needsVerbal: true,
    needsSomatic: true,
    needsMaterial: true,
    needsConcentration: true,
    needsAttackRoll: false,
    needsSavingThrow: false,
    doesDamage: false,
    damage: [{ diceNumber: '', diceType: '', damageType: '' }],
    doesHeal: false,
    heal: { diceNumber: '', diceType: '', additionalHeal: 0 },
    description:
      'Während der Wirkungsdauer nimmst du die Gegenwart und die Position von Giften, giftigen Kreaturen und Krankheiten im Abstand von bis zu neun Metern von dir wahr. Du kannst auch die Art des Gifts, der giftigen Kreatur oder der Krankheit bestimmen. Dieser Zauber durchdringt die meisten Barrieren, wird aber von 30 Zentimetern Stein, 2,5 Zentimetern gewöhnlichem Metall, dünnem Bleiblech sowie von einem Meter Holz oder Erde blockiert.',
    school: 'divination',
    isRanged: true,
    range: 30,
    hasAreaOfEffect: false,
    areaOfEffectType: '',
    radius: 0,
  };

  private heroism: Spell = {
    name: 'Heldenmut',
    level: 1,
    cost: 'action',
    duration: 10,
    canRitual: false,
    needsVerbal: true,
    needsSomatic: true,
    needsMaterial: false,
    needsConcentration: true,
    needsAttackRoll: false,
    needsSavingThrow: false,
    doesDamage: false,
    damage: [{ diceNumber: '', diceType: '', damageType: '' }],
    doesHeal: false,
    heal: { diceNumber: '', diceType: '', additionalHeal: 0 },
    description:
      'Du berührst eine bereitwillige Kreatur und erfüllst sie mit Tapferkeit. Bis der Zauber endet, kann die Kreatur nicht verängstigt werden, und sie erhält zu Beginn jedes ihrer Züge temporäre Trefferpunkte in Höhe deines Zauberwirken-Attributsmodifikators. Wenn der Zauber endet, verliert das Ziel alle verbleibenden temporären Trefferpunkte dieses Zaubers. Auf höheren Graden: Wirkst du diesen Zauber, indem du einen Zauberplatz des 2. Grades oder höher nutzt, kannst du für jeden Grad über dem 1. eine zusätzliche Kreatur als Ziel wählen.',
    school: 'enchantment',
    isRanged: false,
    range: 5,
    hasAreaOfEffect: false,
    areaOfEffectType: '',
    radius: 0,
  };

  private santcuary: Spell = {
    name: 'Heiligtum',
    level: 1,
    cost: 'bonus action',
    duration: 10,
    canRitual: false,
    needsVerbal: true,
    needsSomatic: true,
    needsMaterial: true,
    needsConcentration: true,
    needsAttackRoll: false,
    needsSavingThrow: false,
    doesDamage: false,
    damage: [{ diceNumber: '', diceType: '', damageType: '' }],
    doesHeal: false,
    heal: { diceNumber: '', diceType: '', additionalHeal: 0 },
    description:
      'Du schützt eine Kreatur in Reichweite vor Angriffen. Während der Wirkungsdauer muss jede Kreatur, die bei einem Angriff oder schädlichen Zauber die geschützte Kreatur als Ziel hat, zuerst einen Weisheitsrettungswurf bestehen. Scheitert der Wurf, muss die Kreatur ein neues Ziel wählen, oder sie verliert den Angriff oder Zauber. Dieser Zauber schützt die entsprechende Kreatur nicht vor Flächeneffekten wie der Explosion eines Feuerballs. Greift die geschützte Kreatur an oder wirkt sie einen Zauber auf eine feindliche Kreatur, endet der Effekt dieses Zaubers.',
    school: 'abjuration',
    isRanged: true,
    range: 60,
    hasAreaOfEffect: false,
    areaOfEffectType: '',
    radius: 0,
  };
}
