import { Component } from '@angular/core';
import { DataService } from 'src/services/data/data.service';
import { Router } from '@angular/router';

interface characterData {
  view: string;
  value: string;
}

@Component({
  selector: 'app-character-creator',
  templateUrl: './character-creator.component.html',
  styleUrls: ['./character-creator.component.scss'],
})
export class CharacterCreatorComponent {
  selectedValue: string = '';

  // TODO: Implement the species
  public species: characterData[] = [
    { view: 'Mensch', value: 'Human' },
    { view: 'Zwerg', value: 'Dwarf' },
    { view: 'Elf', value: 'Elf' },
    { view: 'Halbelf', value: 'HalfElf' },
    { view: 'Halbelf (Mal des Entdeckens)', value: 'HalfElfDetection' },
    { view: 'Halbling', value: 'Halfling' },
    { view: 'Gnom', value: 'Gnome' },
    { view: 'Halbork', value: 'HalfOrc' },
    { view: 'Tiefling', value: 'Tiefling' },
  ];

  // TODO: Implement the classes
  public classes: characterData[] = [
    { view: 'Barbar', value: 'Barbarian' },
    { view: 'Barde', value: 'Bard' },
    { view: 'Druide', value: 'Druid' },
    { view: 'Hexenmeister', value: 'Warlock' },
    { view: 'Kämpfer', value: 'Fighter' },
    { view: 'Kleriker', value: 'Cleric' },
    { view: 'Magier', value: 'Wizard' },
    { view: 'Mönch', value: 'Monk' },
    { view: 'Paladin', value: 'Paladin' },
    { view: 'Schurke', value: 'Rogue' },
    { view: 'Waldläufer', value: 'Ranger' },
    { view: 'Zauberer', value: 'Sorcerer' },
  ];

  public backgrounds: characterData[] = [
    { view: 'Akolyth', value: 'acolyte' },
    { view: 'Scharlatan', value: 'charlatan' },
    { view: 'Edelmann', value: 'noble' },
    { view: 'Entertainer', value: 'entertainer' },
    { view: 'Folk Held', value: 'folkHero' },
    { view: 'Gelehrter', value: 'sage' },
    { view: 'Gladiator', value: 'gladiator' },
    { view: 'Gildenhändler', value: 'guildArtisan' },
    { view: 'Gildehandwerker', value: 'guildMerchant' },
    { view: 'Herumtreiber', value: 'outlander' },
    { view: 'Krimineller', value: 'criminal' },
    { view: 'Künstler', value: 'artist' },
    { view: 'Marine', value: 'sailor' },
    { view: 'Scharlatan', value: 'charlatan' },
    { view: 'Soldat', value: 'soldier' },
    { view: 'Stadtwache', value: 'cityWatch' },
    { view: 'Urchin', value: 'urchin' },
  ];

  public genders: characterData[] = [
    { view: 'Weiblich', value: 'Female' },
    { view: 'Männlich', value: 'Male' },
    { view: 'Divers', value: 'Diverse' },
  ];

  public spellcastingAttributes: any = {
    Barbarian: null,
    Bard: 'Charisma',
    Cleric: 'Wisdom',
    Druid: 'Wisdom',
    Fighter: null,
    Monk: 'Wisdom',
    Paladin: 'Charisma',
    Ranger: 'Wisdom',
    Rogue: 'Intelligence',
    Sorcerer: 'Charisma',
    Warlock: 'Charisma',
    Wizard: 'Intelligence',
  };

  public characterName: string = '';
  public characterClass: string = '';
  public characterSpecies: string = '';
  public characterBackground: string = '';
  public characterGender: string = '';

  public constructor(
    public dataAccessor: DataService,
    private Router: Router
  ) {}

  public async createCharacter(): Promise<void> {
    console.log(this.characterName);

    // Creates a new entry in the character collection
    this.dataAccessor.addData('characters', { name: this.characterName });
    // Creates a new collection with the character name
    this.createNewCharacterInDatabase().then(() => {
      // Die Funktion muss ertstmal durchlaufen, bevor der Character ausgewählt werden kann
      sessionStorage.setItem('characterName', this.characterName);
      this.dataAccessor.dataLoaded = false;
      this.Router.navigate(['journal']);
    });
  }

  public async createNewCharacterInDatabase(): Promise<void> {
    // TODO: Für alle Daten einen eigenen Key/Value Eintrag anlegen addData(collection: string, data: any, key?: string): void
    return Promise.all([
      // Character Data
      this.dataAccessor.addData(
        this.characterName,
        {
          class: this.characterClass,
          subclass: '',
          race: this.characterSpecies,
          background: this.characterBackground,
          level: 1,
          experience: 0,
          image: '',
          gender: this.characterGender,
          age: '',
          height: '',
          weight: '',
          eyes: '',
          skin: '',
          hair: '',
        },
        'characterData'
      ),
      // Character Image
      this.dataAccessor.addData(
        this.characterName,
        {
          value: undefined,
        },
        'image'
      ),
      // Character Attributes
      this.dataAccessor.addData(
        this.characterName,
        {
          strength: { name: 'strength', value: 10, proficiency: false },
          dexterity: { name: 'dexterity', value: 10, proficiency: false },
          constitution: { name: 'constitution', value: 10, proficiency: false },
          intelligence: { name: 'intelligence', value: 10, proficiency: false },
          wisdom: { name: 'wisdom', value: 10, proficiency: false },
          charisma: { name: 'charisma', value: 10, proficiency: false },
        },
        'attributes'
      ),
      // Character Skills
      this.dataAccessor.addData(
        this.characterName,
        {
          acrobatics: { name: 'acrobatics', proficiency: false },
          animalHandling: { name: 'animalHandling', proficiency: false },
          arcana: { name: 'arcana', proficiency: false },
          athletics: { name: 'athletics', proficiency: false },
          deception: { name: 'deception', proficiency: false },
          history: { name: 'history', proficiency: false },
          insight: { name: 'insight', proficiency: false },
          intimidation: { name: 'intimidation', proficiency: false },
          investigation: { name: 'investigation', proficiency: false },
          medicine: { name: 'medicine', proficiency: false },
          nature: { name: 'nature', proficiency: false },
          perception: { name: 'perception', proficiency: false },
          performance: { name: 'performance', proficiency: false },
          persuasion: { name: 'persuasion', proficiency: false },
          religion: { name: 'religion', proficiency: false },
          sleightOfHand: { name: 'sleightOfHand', proficiency: false },
          stealth: { name: 'stealth', proficiency: false },
          survival: { name: 'survival', proficiency: false },
        },
        'skills'
      ),
      // Character Combat Stats
      this.dataAccessor.addData(
        this.characterName,
        {
          armorClass: 10,
          initiative: 0,
          movement: 30,
          deathSaves: [0, 0],
          proficiencyBonus: 2,
          conditions: [],
          exhaustion: 0,
          inspiration: false,
        },
        'combatStats'
      ),
      //  Character Hit Points
      this.dataAccessor.addData(
        this.characterName,
        {
          hitPoints: {
            maxHitPoints: 10,
            currentHitPoints: 10,
            temporaryHitPoints: 0,
          },
          hitDice: {
            hitDiceNumber: 1,
            hitDiceType: 10,
          },
        },
        'hitPoints'
      ),

      // Character Abilities
      this.dataAccessor.addData(
        this.characterName,
        {
          data: [],
        },
        'abilities'
      ),

      // Character Traits
      this.dataAccessor.addData(
        this.characterName,
        {
          data: [],
        },
        'traits'
      ),

      // Character Proficiencies
      this.dataAccessor.addData(
        this.characterName,
        {
          armor: {
            light: false,
            medium: false,
            heavy: false,
          },
          weapons: {
            simple: false,
            martial: false,
            other: [],
          },
          tools: [],
          languages: ['Gemeinsprache'],
        },
        'proficiencies'
      ),

      // Character Spellslots
      this.dataAccessor.addData(
        this.characterName,
        {
          spellslots: [],
          showSpellslots: false,
          spellcastingAttribute:
            this.spellcastingAttributes[this.characterClass],
        },
        'spellslots'
      ),
      // Ki Points
      this.dataAccessor.addData(
        this.characterName,
        {
          totalPoints: 0,
          usedPoints: 0,
          showKiPoints: false,
        },
        'kiPoints'
      ),
      // Weapons
      this.dataAccessor.addData(
        this.characterName,
        {
          data: [],
        },
        'favoriteWeapons'
      ),
      // WEAPONS AND ARMOR
      this.dataAccessor.addData(
        this.characterName,
        {
          data: [],
        },
        'weaponsAndArmor'
      ),
      // MISCELLANEOUS
      this.dataAccessor.addData(
        this.characterName,
        {
          data: [],
        },
        'miscellaneous'
      ),
      // CONSUMABLES
      this.dataAccessor.addData(
        this.characterName,
        {
          data: [],
        },
        'consumables'
      ),
      // MONEY
      this.dataAccessor.addData(
        this.characterName,
        {
          platinum: 0,
          gold: 0,
          electrum: 0,
          silver: 0,
          copper: 0,
        },
        'money'
      ),
      // FOOD
      this.dataAccessor.addData(
        this.characterName,
        {
          data: [],
        },
        'food'
      ),
      // Favorite Spells
      this.dataAccessor.addData(
        this.characterName,
        {
          spells: [],
        },
        'favoriteSpells'
      ),
      // Spells
      this.dataAccessor.addData(
        this.characterName,
        {
          spells: [],
        },
        'spellLevel0'
      ),
      this.dataAccessor.addData(
        this.characterName,
        {
          spells: [],
        },
        'spellLevel1'
      ),
      this.dataAccessor.addData(
        this.characterName,
        {
          spells: [],
        },
        'spellLevel2'
      ),
      this.dataAccessor.addData(
        this.characterName,
        {
          spells: [],
        },
        'spellLevel3'
      ),
      this.dataAccessor.addData(
        this.characterName,
        {
          spells: [],
        },
        'spellLevel4'
      ),
      this.dataAccessor.addData(
        this.characterName,
        {
          spells: [],
        },
        'spellLevel5'
      ),
      this.dataAccessor.addData(
        this.characterName,
        {
          spells: [],
        },
        'spellLevel6'
      ),
      this.dataAccessor.addData(
        this.characterName,
        {
          spells: [],
        },
        'spellLevel7'
      ),
      this.dataAccessor.addData(
        this.characterName,
        {
          spells: [],
        },
        'spellLevel8'
      ),
      this.dataAccessor.addData(
        this.characterName,
        {
          spells: [],
        },
        'spellLevel9'
      ),

      // Notes

      // Maps

      // NPCs

      // Quests
    ]).then(() => {});
  }
}
