// File: /workspace/github_cpp_makefile_star2_O3/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, %rbx
movq %rdi, %r15
callq 0x20262
movq %rax, %r14
leaq 0x8(%r15), %rax
cmpq %rax, %r14
je 0x1faa8
movq %r15, %rdi
movq %rbx, %rsi
callq 0x1fdcc
movq (%rax), %rdi
movq (%rdi), %rax
callq *(%rax)
jmp 0x1fd2d
leaq 0xdb74(%rip), %rsi      # 0x2d623
movq %rbx, %rdi
callq 0x5110
testl %eax, %eax
je 0x1fceb
xorps %xmm0, %xmm0
movaps %xmm0, 0x20(%rsp)
movq $0x0, 0x30(%rsp)
movq 0x18(%r15), %r15
cmpq %r14, %r15
je 0x1fafa
leaq 0x20(%rsp), %r12
leaq 0x20(%r15), %rsi
movq %r12, %rdi
callq 0x19d90
movq %r15, %rdi
callq 0x5240
movq %rax, %r15
cmpq %r14, %rax
jne 0x1fade
leaq 0x10(%rsp), %rax
movq %rax, -0x10(%rax)
leaq 0xdb19(%rip), %rdx      # 0x2d623
movq %rsp, %rdi
movq %rdx, %rsi
callq 0x19e74
movq 0x20(%rsp), %r14
cmpq 0x28(%rsp), %r14
je 0x1fc2a
movl $0x64, %r15d
leaq 0x58(%rsp), %r12
leaq 0x78(%rsp), %r13
leaq 0x48(%rsp), %rax
movq %rax, 0x38(%rsp)
movq (%r14), %rsi
movq 0x8(%r14), %rdx
addq %rsi, %rdx
leaq 0x38(%rsp), %rdi
callq 0x1a0b6
leaq 0x68(%rsp), %rax
movq %rax, 0x58(%rsp)
movq (%rbx), %rsi
movq 0x8(%rbx), %rdx
addq %rsi, %rdx
movq %r12, %rdi
callq 0x1a0b6
movq %r13, %rdi
leaq 0x38(%rsp), %rsi
movq %r12, %rdx
callq 0x1fe48
movq 0x58(%rsp), %rdi
leaq 0x68(%rsp), %rax
cmpq %rax, %rdi
je 0x1fb9b
movq 0x68(%rsp), %rsi
incq %rsi
callq 0x5340
movq 0x38(%rsp), %rdi
leaq 0x48(%rsp), %rax
cmpq %rax, %rdi
je 0x1fbb7
movq 0x48(%rsp), %rsi
incq %rsi
callq 0x5340
movq %r13, %rdi
callq 0x1a830
movl %eax, %ebp
cmpl %r15d, %eax
jge 0x1fbd4
movq %rsp, %rdi
movq %r14, %rsi
callq 0x51d0
movl %ebp, %r15d
movq 0x98(%rsp), %rdi
leaq 0xa8(%rsp), %rax
cmpq %rax, %rdi
je 0x1fbf9
movq 0xa8(%rsp), %rsi
incq %rsi
callq 0x5340
movq 0x78(%rsp), %rdi
leaq 0x88(%rsp), %rax
cmpq %rax, %rdi
je 0x1fc1b
movq 0x88(%rsp), %rsi
incq %rsi
callq 0x5340
addq $0x20, %r14
cmpq 0x28(%rsp), %r14
jne 0x1fb35
movq 0x1a38f(%rip), %rdi     # 0x39fc0
movq (%rdi), %rax
addq -0x18(%rax), %rdi
movl $0xa, %esi
callq 0x5300
movsbl %al, %esi
movq 0x1a374(%rip), %rdi     # 0x39fc0
callq 0x5050
movq %rax, %rdi
callq 0x5230
movq 0x1a360(%rip), %rdi     # 0x39fc0
leaq 0xde52(%rip), %rsi      # 0x2dab9
movl $0x24, %edx
callq 0x53a0
movq (%rsp), %rsi
movq 0x8(%rsp), %rdx
movq 0x1a33f(%rip), %rdi     # 0x39fc0
callq 0x53a0
movq %rax, %rbx
leaq 0xe2c1(%rip), %rsi      # 0x2df51
movl $0x1, %edx
movq %rax, %rdi
callq 0x53a0
movq (%rbx), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x5300
movsbl %al, %esi
movq %rbx, %rdi
callq 0x5050
movq %rax, %rdi
callq 0x5230
movq (%rsp), %rdi
leaq 0x10(%rsp), %rax
cmpq %rax, %rdi
je 0x1fcdf
movq 0x10(%rsp), %rsi
incq %rsi
callq 0x5340
leaq 0x20(%rsp), %rdi
callq 0x19dce
jmp 0x1fd2d
movq 0x1a2ce(%rip), %rbx     # 0x39fc0
leaq 0xdd95(%rip), %rsi      # 0x2da8e
movl $0x2a, %edx
movq %rbx, %rdi
callq 0x53a0
movq (%rbx), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x5300
movsbl %al, %esi
movq %rbx, %rdi
callq 0x5050
movq %rax, %rdi
callq 0x5230
xorl %eax, %eax
addq $0xb8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
jmp 0x1fd8c
jmp 0x1fd45
movq %rax, %rbx
jmp 0x1fd9e
movq %rax, %rbx
jmp 0x1fd6e
movq %rax, %rbx
movq 0x58(%rsp), %rdi
leaq 0x68(%rsp), %rax
cmpq %rax, %rdi
je 0x1fd6e
movq 0x68(%rsp), %rsi
incq %rsi
callq 0x5340
movq 0x38(%rsp), %rdi
leaq 0x48(%rsp), %rax
cmpq %rax, %rdi
je 0x1fd9e
movq 0x48(%rsp), %rsi
incq %rsi
callq 0x5340
jmp 0x1fd9e
movq %rax, %rbx
jmp 0x1fdb9
movq %rax, %rbx
leaq 0x78(%rsp), %rdi
callq 0x1feac
movq (%rsp), %rdi
leaq 0x10(%rsp), %rax
cmpq %rax, %rdi
je 0x1fdb9
movq 0x10(%rsp), %rsi
incq %rsi
callq 0x5340
leaq 0x20(%rsp), %rdi
callq 0x19dce
movq %rbx, %rdi
callq 0x55c0
nop