/// <reference path="../TypeScriptHTMLApp/_Hintergründe/lib.d.ts" />


 namespace CheatSheet.Interfaces {
  // Schnittstelle
  export interface IKontakt {
   id: number;
   name: string;
   geprueft: boolean;
   erfassungsdatum: Date;
   toString(details: boolean): string;
  }

  // Aufzählungstyp
  export enum KundenArt {
   A = 1,
   B,
   C
  }

  export enum KundenArt24 { // neu ab TS 2.4
   A = "sehr gut", B = "gut", C = "schlecht"
  }
 }

 namespace CheatSheet.GO {

  // #region Basisklasse
  /** Kontakt mit id, name, ort
  * @autor Dr. Holger Schwichtenberg
  */
  export class Kontakt implements Interfaces.IKontakt {
   // ---------- Properties ohne Getter/Setter
   public geprueft: boolean;
   protected interneID: number;
   private _erfassungsdatum: Date;

   // ---------- Properties mit Getter/Setter
   get erfassungsdatum(): Date {
    return this._erfassungsdatum;
   }

   set erfassungsdatum(erfassungsdatum: Date) {
    this._erfassungsdatum = erfassungsdatum;
   }

   /**
   * @param id Kundenummer
   * @param name Kundenname
   */
   constructor(
    public id: number,
    public name: string) {
    this.erfassungsdatum = new Date();
    this.id = id; // Diese Zeile ist ueberfluessig !!!
    Kontakt.Anzahl++;
   }

   /**
    * Öffentliche Methode
    * @param details Soll der Ort mitgeliefert werden?
    */
   toString(details: boolean = false): string {
    var e: string = `${this.id}: ${this.name}`;
    if (details) e += `, erfasst am ${this.erfassungsdatum}`;
    return e;
   }

   // Statisches Mitglied
   static Anzahl: number;
  }
  // #endregion


  // #region Erbende Klasse
  export class Kunde extends Kontakt {
   public KundenArt: Interfaces.KundenArt24;

   constructor(id: number, name: string, public umsatz: number) {
    super(id, name);
    this.KundenArt = Interfaces.KundenArt24.C;
    console.log("Umsatz", umsatz + 1.01);
    if (umsatz > 10000) this.KundenArt = Interfaces.KundenArt24.A;
    if (umsatz > 5000) this.KundenArt = Interfaces.KundenArt24.B;
   }

   toString() { return `Kunde ${super.toString()}: ${this.umsatz.toFixed(2)} Euro`; }
  }
  // #endregion


  // #region Generische Klasse
  export class Verbindung<T1 extends Kontakt, T2 extends Kontakt> {
   constructor(public k1: T1, public k2: T2) {
   }

   public toString(): string {
    return `${this.k1.name} is verbunden mit ${this.k2.name}`;
   }
  }
  // #endregion


  // #region Generische  Duck Typing
  export class Person {
   public id: number;
   public name: string;
  }

  export class Mitarbeiter {
   public id: number;
   public name: string;
   public einstellungsdatum: Date;
  }
  // #endregion


 } // End Namespace

