// File: /workspace/github_cpp_makefile_star2_O2/rcolomina[P]the_charmed_house/src/invocador.cpp
// Function: Invocador::exec(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>)
int Invocador::exec(string command,
		    string parametro1,
		    string parametro2){

    auto it = this->mapCommands.find(command);
    if (it != this->mapCommands.end()){
        mapCommands[command]->execute();
        return 0;
    }
    
    if(command==""){
        cout<<"Escribe un commando valido para continuar."<<endl;
        return 0;
    }
        
    
    vector<string> commandAvailables;
    for(auto it = mapCommands.begin();
        it != mapCommands.end(); ++it) {
        commandAvailables.push_back(it->first);
    }
        
    int minDistance=100;
    string commandSuggested = "";
    for(auto it=commandAvailables.begin();
        it!= commandAvailables.end();
        ++it){
        DistLevenshtein dist(*it,command);
        int newdist = dist.calculate();
        if(newdist < minDistance){
            minDistance=newdist;
            commandSuggested=*it;
        }
        
    }
    cout<<endl;
    cout<<"Quiza querias escribir el commando '"<<commandSuggested<<"'"<<endl;
        
    
//     // TODO: Move the following ones to new commands
//      if(command=="arriba");
//      else if(command=="abajo");	
//      else if(command=="entrar");
//      else if(command=="salir");					
//      else if(command=="salidas")
//      {
// 	  ICommand *icommand = mapCommands[s_norte];
	  
// 	  Cardinal *cardinal = dynamic_cast<Cardinal*>(icommand);

// 	  pScene escena_actual = cardinal->getCurrentScene();
// 	       //->getCurrentScene();
// 	  string salidas_disponibles = escena_actual->salidasDisponibles();
// 	  cout<<endl<<"Las salidas disponibles son:"<<salidas_disponibles<<endl;
//      }
//      // else if(command=="tiempo")
// //	  cout<<endl<<"Han pasado "<<tiempo<<" segundos desde que comenzó la partida."<<endl;
//      else if(command=="");
//      else 
//      {
// 	  // TODO: Use regular expresion instead/
// 	  bool hijo=(command=="hijo" or command=="Hijo");
	  
// 	  bool puta=(parametro1=="puta" or parametro1=="Puta") or (parametro2=="puta" or parametro2=="Puta");
	  
// 	  bool idiota=(command=="Idiota" or command=="idiota") or 
// 	       (parametro1=="Idiota" or parametro1=="idiota") or 
// 	       (parametro2=="Idiota" or parametro2=="idiota");
	  
// 	  bool maricon=(command=="maricón" or command=="Maricón") or (command=="maricon" or command=="Maricon") or
// 	       (parametro1=="maricón" or parametro1=="Maricón") or (parametro1=="maricon" or parametro1=="Maricon") or
// 	       (parametro2=="maricón" or parametro2=="Maricón") or (parametro2=="maricon" or parametro2=="Maricon");


// 	  bool cabron=(command=="cabron" or command=="Cabron") or (command=="Cabrón" or command=="cabrón") or
// 	       (parametro1=="cabron" or parametro1=="Cabron") or (parametro1=="Cabrón" or parametro1=="cabrón") or
// 	       (parametro2=="cabron" or parametro2=="Cabron") or (parametro2=="Cabrón" or parametro2=="cabrón");		 

	  
// 	  if(hijo and puta){
// 	       cout<<"Hijo puta lo serás tu, se un poco más serio, o morirás.";
// 	       return 1;
// 	  }
// 	  else if(idiota){
// 	       cout<<"La idiotez de persigue, vas a morir.";
// 	       return 1;
// 	  }
// 	  else if(maricon){
// 	       cout<<"¿Te gusta la sodomía?.";
// 	       return 1; 
// 	  }
// 	  else if(cabron){
// 	       cout<<"¿Consientes que tu mujer se acueste con otro?";
// 	       return 1; 
// 	  }
//      }    
          
     return 0;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0xb8, %rsp
movq %rsi, %rbp
movq %rdi, %r15
callq 0x173fa
movq %rax, %r14
leaq 0x8(%r15), %rax
cmpq %rax, %r14
je 0x16dcc
movq %r15, %rdi
movq %rbp, %rsi
callq 0x16f88
movq (%rax), %rdi
movq (%rdi), %rax
callq *(%rax)
jmp 0x16f21
leaq 0xa868(%rip), %rsi      # 0x2163b
movq %rbp, %rdi
callq 0x136e0
testb %al, %al
je 0x16dff
movq 0x181d2(%rip), %rdi     # 0x2efb8
leaq 0xacb9(%rip), %rsi      # 0x21aa6
callq 0x5310
movq %rax, %rdi
callq 0x51a0
jmp 0x16f21
xorps %xmm0, %xmm0
movq %rsp, %r12
movaps %xmm0, (%r12)
andq $0x0, 0x10(%r12)
movq 0x18(%r15), %r15
cmpq %r14, %r15
je 0x16e32
leaq 0x20(%r15), %rsi
movq %r12, %rdi
callq 0x121bc
movq %r15, %rdi
callq 0x5240
movq %rax, %r15
jmp 0x16e14
leaq 0xa802(%rip), %rsi      # 0x2163b
leaq 0x18(%rsp), %rdi
leaq 0x78(%rsp), %rdx
callq 0x12230
pushq $0x64
popq %rbx
movq (%rsp), %r14
leaq 0x58(%rsp), %r12
leaq 0x78(%rsp), %r13
cmpq 0x8(%rsp), %r14
je 0x16ecc
leaq 0x38(%rsp), %rdi
movq %r14, %rsi
callq 0x5430
movq %r12, %rdi
movq %rbp, %rsi
callq 0x5430
movq %rbp, %r15
movq %r13, %rdi
leaq 0x38(%rsp), %rbp
movq %rbp, %rsi
movq %r12, %rdx
callq 0x16fee
movq %r12, %rdi
callq 0x5638
movq %rbp, %rdi
callq 0x5638
movq %r13, %rdi
callq 0x12b00
movl %eax, %ebp
cmpl %ebx, %eax
jge 0x16ebb
leaq 0x18(%rsp), %rdi
movq %r14, %rsi
callq 0x51d0
movl %ebp, %ebx
movq %r13, %rdi
callq 0x17024
addq $0x20, %r14
movq %r15, %rbp
jmp 0x16e59
movq 0x180e5(%rip), %rdi     # 0x2efb8
callq 0x51a0
movq 0x180d9(%rip), %rdi     # 0x2efb8
leaq 0xabeb(%rip), %rsi      # 0x21ad1
callq 0x5310
leaq 0x18(%rsp), %rsi
movq %rax, %rdi
callq 0x52d0
leaq 0xb07e(%rip), %rsi      # 0x21f7d
movq %rax, %rdi
callq 0x5310
movq %rax, %rdi
callq 0x51a0
leaq 0x18(%rsp), %rdi
callq 0x5638
movq %rsp, %rdi
callq 0x121e8
xorl %eax, %eax
addq $0xb8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
jmp 0x16f5c
jmp 0x16f57
movq %rax, %rbx
jmp 0x16f4b
movq %rax, %rbx
leaq 0x58(%rsp), %rdi
callq 0x5638
leaq 0x38(%rsp), %rdi
callq 0x5638
jmp 0x16f6e
movq %rax, %rbx
jmp 0x16f6e
movq %rax, %rbx
jmp 0x16f78
movq %rax, %rbx
leaq 0x78(%rsp), %rdi
callq 0x17024
leaq 0x18(%rsp), %rdi
callq 0x5638
movq %rsp, %rdi
callq 0x121e8
movq %rbx, %rdi
callq 0x55a0