// File: 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
movq %rsp, %rbp
subq $0x170, %rsp            # imm = 0x170
movq %rsi, -0x140(%rbp)
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq %rdx, -0x20(%rbp)
movq %rcx, -0x28(%rbp)
movq -0x10(%rbp), %rdi
movq %rdi, -0x138(%rbp)
callq 0x38d70
movq -0x138(%rbp), %rdi
movq %rax, -0x30(%rbp)
callq 0x38dd0
movq %rax, -0x38(%rbp)
leaq -0x30(%rbp), %rdi
leaq -0x38(%rbp), %rsi
callq 0x38da0
testb $0x1, %al
jne 0x389e9
jmp 0x38a10
movq -0x140(%rbp), %rsi
movq -0x138(%rbp), %rdi
callq 0x38e00
movq (%rax), %rdi
movq (%rdi), %rax
callq *(%rax)
movl $0x0, -0x4(%rbp)
jmp 0x38d58
movq -0x140(%rbp), %rdi
leaq 0x17c1d(%rip), %rsi     # 0x5063b
callq 0x2d7d0
testb $0x1, %al
jne 0x38a29
jmp 0x38a57
movq 0x38588(%rip), %rdi     # 0x70fb8
leaq 0x1806f(%rip), %rsi     # 0x50aa6
callq 0x53a0
movq %rax, %rdi
movq 0x3854a(%rip), %rsi     # 0x70f90
callq 0x5400
movl $0x0, -0x4(%rbp)
jmp 0x38d58
leaq -0x50(%rbp), %rdi
callq 0x297d0
movq -0x138(%rbp), %rdi
callq 0x38ee0
movq %rax, -0x58(%rbp)
movq -0x138(%rbp), %rdi
callq 0x38dd0
movq %rax, -0x60(%rbp)
leaq -0x58(%rbp), %rdi
leaq -0x60(%rbp), %rsi
callq 0x38da0
testb $0x1, %al
jne 0x38a93
jmp 0x38ac8
leaq -0x58(%rbp), %rdi
callq 0x38f10
movq %rax, %rsi
leaq -0x50(%rbp), %rdi
callq 0x29840
jmp 0x38aaa
jmp 0x38aac
leaq -0x58(%rbp), %rdi
callq 0x38f30
jmp 0x38a70
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x68(%rbp)
movl %eax, -0x6c(%rbp)
jmp 0x38d4d
movl $0x64, -0x70(%rbp)
leaq -0x91(%rbp), %rdi
movq %rdi, -0x148(%rbp)
callq 0x56d0
movq -0x148(%rbp), %rdx
leaq 0x17b4b(%rip), %rsi     # 0x5063b
leaq -0x90(%rbp), %rdi
callq 0x299c0
jmp 0x38afe
leaq -0x91(%rbp), %rdi
callq 0x5420
leaq -0x50(%rbp), %rdi
callq 0x2a3d0
movq %rax, -0xa0(%rbp)
leaq -0x50(%rbp), %rdi
callq 0x2a250
movq %rax, -0xa8(%rbp)
leaq -0xa0(%rbp), %rdi
leaq -0xa8(%rbp), %rsi
callq 0x38f60
testb $0x1, %al
jne 0x38b46
jmp 0x38ca5
leaq -0xa0(%rbp), %rdi
callq 0x369d0
movq %rax, %rsi
leaq -0x108(%rbp), %rdi
callq 0x5180
jmp 0x38b63
movq -0x140(%rbp), %rsi
leaq -0x128(%rbp), %rdi
callq 0x5180
jmp 0x38b78
leaq -0xe8(%rbp), %rdi
leaq -0x108(%rbp), %rsi
leaq -0x128(%rbp), %rdx
callq 0x38fa0
jmp 0x38b94
leaq -0x128(%rbp), %rdi
callq 0x5748
leaq -0x108(%rbp), %rdi
callq 0x5748
leaq -0xe8(%rbp), %rdi
callq 0x2c280
movl %eax, -0x14c(%rbp)
jmp 0x38bc0
movl -0x14c(%rbp), %eax
movl %eax, -0x12c(%rbp)
movl -0x12c(%rbp), %eax
cmpl -0x70(%rbp), %eax
jge 0x38c88
movl -0x12c(%rbp), %eax
movl %eax, -0x70(%rbp)
leaq -0xa0(%rbp), %rdi
callq 0x369d0
movq %rax, %rsi
leaq -0x90(%rbp), %rdi
callq 0x5060
jmp 0x38c01
jmp 0x38c88
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x68(%rbp)
movl %eax, -0x6c(%rbp)
leaq -0x91(%rbp), %rdi
callq 0x5420
jmp 0x38d4d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x68(%rbp)
movl %eax, -0x6c(%rbp)
jmp 0x38d41
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x68(%rbp)
movl %eax, -0x6c(%rbp)
jmp 0x38c5a
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x68(%rbp)
movl %eax, -0x6c(%rbp)
leaq -0x128(%rbp), %rdi
callq 0x5748
leaq -0x108(%rbp), %rdi
callq 0x5748
jmp 0x38d41
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x68(%rbp)
movl %eax, -0x6c(%rbp)
leaq -0xe8(%rbp), %rdi
callq 0x39000
jmp 0x38d41
leaq -0xe8(%rbp), %rdi
callq 0x39000
leaq -0xa0(%rbp), %rdi
callq 0x39030
jmp 0x38b1a
movq 0x3830c(%rip), %rdi     # 0x70fb8
movq 0x382dd(%rip), %rsi     # 0x70f90
callq 0x5400
jmp 0x38cba
movq 0x382f7(%rip), %rdi     # 0x70fb8
leaq 0x17e09(%rip), %rsi     # 0x50ad1
callq 0x53a0
movq %rax, -0x158(%rbp)
jmp 0x38cd6
movq -0x158(%rbp), %rdi
leaq -0x90(%rbp), %rsi
callq 0x5350
movq %rax, -0x160(%rbp)
jmp 0x38cf2
movq -0x160(%rbp), %rdi
leaq 0x1825c(%rip), %rsi     # 0x50f5c
callq 0x53a0
movq %rax, -0x168(%rbp)
jmp 0x38d0e
movq -0x168(%rbp), %rdi
movq 0x38274(%rip), %rsi     # 0x70f90
callq 0x5400
jmp 0x38d23
movl $0x0, -0x4(%rbp)
leaq -0x90(%rbp), %rdi
callq 0x5748
leaq -0x50(%rbp), %rdi
callq 0x298b0
jmp 0x38d58
leaq -0x90(%rbp), %rdi
callq 0x5748
leaq -0x50(%rbp), %rdi
callq 0x298b0
jmp 0x38d64
movl -0x4(%rbp), %eax
addq $0x170, %rsp            # imm = 0x170
popq %rbp
retq
movq -0x68(%rbp), %rdi
callq 0x56c0
nopl (%rax)