#include <fstream>

#include "Banque.H"
#include "CompteAvecDecouvert.H"
#include "CompteAvecJournal.H"

Banque::Banque(int capacite)
  : capacite(capacite), nombre_comptes(0), comptes(new Compte*[capacite]) {}

Banque::~Banque() {
  delete[] comptes;
}

Compte* Banque::rechercherCompte(char* login){
  for (int i = 0; i < nombre_comptes; i++) {
    Compte* c = comptes[i]; 
    if (strcmp(c->nom,login) == 0) return c;
  }
  return NULL;
}

void Banque::ouvrirCompte(){
  char commande[10];
  int decouvert_max;
  char login[80];

  if (nombre_comptes >= capacite){
    cout << "ERREUR : la banque a atteint sa capacité maximale !" << endl;
  }

  cout << "login : " << flush;
  cin >> login;

  if (rechercherCompte(login) != NULL){
    cout << "ERREUR : ce nom de login est déjà utilisé !" << endl;
  } else {
    cout << "Créer un compte avec (d)écouvert ou avec (j)ournal [d,j]? :" << flush;
    cin >> commande;
    switch (commande[0]){
    case 'd': case 'D':
      cout << "Découvert maximum : " << flush;
      cin >> decouvert_max;
      if (decouvert_max < 0) {
        cout << "ERREUR : le decouvert doit être positif !" << endl;
      }
      // ... à compléter ...
      break;
    case 'j': case 'J':
      // ... à compléter ...
      break;
    default:
      cout << "ERREUR : commande inconnue '" << commande[0] << "'" << endl;
    }
  }
}

void affiche_reponse (Compte::Reponse reponse) {
  switch (reponse) {
  case Compte::rep_Ok :
    cout << "ok" << endl;
    break;

  case Compte::rep_Somme_Negative :
    cout << "erreur: somme négative !" << endl;
    break;

  case Compte::rep_Solde_Insuffisant:
    cout << "erreur: solde insuffisant !" << endl;
    break;

  default:
    cout << "erreur interne: code de retour inconnu (" << (int)reponse << ")" << endl;
    break;
  }
}

void Banque::consulterCompte(char* login){
  Compte* c = rechercherCompte(login);
  if (c == NULL){
    cout << "ERREUR : il n'y a pas de client avec le nom : " << login << endl;
  } else {
    char operation;
    int somme;
    bool termine = false;

    cout << "Vous travaillez sur le compte de " << c->nom << endl;
    cout << "Tapez : " << endl;
    cout << "s  pour connaître le solde courant," << endl;
    cout << "d  pour effectuer un dépôt," << endl;
    cout << "r  pour effectuer un retrait, et" << endl;
    cout << "t  pour terminer." << endl << endl;

    while (! termine) {
      cout << "Commande: " << flush;
      cin >> operation;
      switch (operation) {
      case 'd' : case 'D' :
        cout << "Somme à déposer: " << flush;
        cin >> somme;
        affiche_reponse (c->depot (somme));
        break;

      case 'r': case 'R':
        cout << "Somme à retirer: " << flush;
        cin >> somme;
        affiche_reponse (c->retrait (somme));
        break;

      case 's': case 'S':
        cout << "Solde courant: " << c->solde_courant () << endl;
        break;

      case 't': case 'T':
        cout << "Au revoir !" << endl;
        termine = true;
        break;

      default:
        cout << "Commande inconnue `" << operation << "'" << endl;
        break;
      }
    }
  }
} 

void Banque::ajouterCompte(Compte* compte){
  if (nombre_comptes == capacite) return;
  comptes[nombre_comptes] = compte;
  nombre_comptes++;
}

void Banque::demarrer(){
  char commande;
  char login[80];

  while (true){
    cout << endl;
    cout << "------- BANQUE -------" << endl;
    cout << "1. ouvrir un compte" << endl;
    cout << "2. consulter un compte" << endl;
    cout << "3. quitter la banque" << endl;
    cout << endl;
    cout << "choix [1,2,3]? : " << flush;
			       
    cin >> commande;

    switch (commande){
    case '1': // creer un compte
      ouvrirCompte();
      break;
    case '2': // consulter un compte
      cout << "login : " << flush;
      cin >> login;
      consulterCompte(login);
      break;
    case '3': // quitter le programme
      exit(0);
    default:
      cout << "ERREUR : commande inconnue '" << commande << "'" << endl;
    }
  }
}
