// File: brashi[P]PetFera/src/./main.cpp
// Function: menu()
void menu() {
    shared_ptr<Petshop> petshop = make_shared<Petshop>();
    unique_ptr<MapeadorMenu> mapeador = make_unique<MapeadorMenu>();
    bool executando = true;
    string opcao;
    
    BancoDados banco(petshop);
    banco.lerDados();
    pausar();
    while(executando) {
        limparTela();
        imprimirMenu();

        getline(cin, opcao);
        limparTela();
        
        #ifdef DEBUG
            if(toupper(opcao[0]) == 'T')
                banco.lerDadosTestes();
        #endif
        if(toupper(opcao[0]) == 'N' && !std::filesystem::is_empty("dados/")) {
            cout << "Tem certeza? TUDO será apagado" << endl;
            cout << "S - para SIM: ";
            getline(cin, opcao);

            if(toupper(opcao[0]) == 'S')
                banco.excluirArquivos();
            else
                cout << "Operação cancelada..." << endl;
        } else {
            try {
                executando = mapeador->escolhas[toupper(opcao[0])](petshop);
            } catch (const std::bad_function_call&) {
                cout << "Informe uma opção válida para realizar uma ação" << endl;
            } catch (const std::invalid_argument&) {
                cout << "Um valor numérico era esperado e não condiz com o introduzido." << endl;
            } catch (char const* msg) {
                cout << "Erro: " << msg << endl << "Verifique os dados informados e tente novamente." << endl;
            } catch (const string msg) {
                cout << "Erro: " << msg << endl << "Verifique os dados informados e tente novamente." << endl;
            } catch (...) {
                cout << "Algo de errado ocorreu, verifique os dados informados e tente novamente." << endl;
            }
        }

        pausar();
    }
    
    banco.salvarDados();
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x270, %rsp            # imm = 0x270
leaq -0x10(%rbp), %rdi
callq 0x14260
leaq -0x18(%rbp), %rdi
callq 0x142d0
jmp 0x13a8f
movb $0x1, -0x25(%rbp)
leaq -0x48(%rbp), %rdi
callq 0x6480
leaq -0x130(%rbp), %rdi
movq %rdi, -0x1b0(%rbp)
leaq -0x10(%rbp), %rsi
callq 0xac80
movq -0x1b0(%rbp), %rsi
leaq -0x120(%rbp), %rdi
callq 0x6e70
jmp 0x13ac8
leaq -0x130(%rbp), %rdi
callq 0xb070
leaq -0x120(%rbp), %rdi
callq 0x8af0
jmp 0x13ae2
callq 0x13a00
jmp 0x13ae9
jmp 0x13aeb
testb $0x1, -0x25(%rbp)
je 0x140df
callq 0x139e0
jmp 0x13afc
callq 0x136b0
jmp 0x13b03
movq 0x4f4d6(%rip), %rdi     # 0x62fe0
leaq -0x48(%rbp), %rsi
callq 0x6090
jmp 0x13b15
callq 0x139e0
jmp 0x13b1c
movb $0x0, -0x159(%rbp)
xorl %eax, %eax
movl %eax, %esi
leaq -0x48(%rbp), %rdi
callq 0x6660
movq %rax, -0x1b8(%rbp)
jmp 0x13b39
movq -0x1b8(%rbp), %rax
movsbl (%rax), %edi
callq 0x6600
movl %eax, %ecx
xorl %eax, %eax
cmpl $0x4e, %ecx
movb %al, -0x1b9(%rbp)
jne 0x13b9a
leaq 0x2c559(%rip), %rsi     # 0x400b7
leaq -0x158(%rbp), %rdi
movl $0x2, %edx
callq 0x14180
jmp 0x13b71
movb $0x1, -0x159(%rbp)
leaq -0x158(%rbp), %rdi
callq 0x6610
movb %al, -0x1ba(%rbp)
jmp 0x13b8c
movb -0x1ba(%rbp), %al
xorb $-0x1, %al
movb %al, -0x1b9(%rbp)
movb -0x1b9(%rbp), %al
movb %al, -0x1bb(%rbp)
testb $0x1, -0x159(%rbp)
jne 0x13bb1
jmp 0x13bbd
leaq -0x158(%rbp), %rdi
callq 0xaf80
movb -0x1bb(%rbp), %al
testb $0x1, %al
jne 0x13bcc
jmp 0x13d00
movq 0x4f3f5(%rip), %rdi     # 0x62fc8
leaq 0x2d027(%rip), %rsi     # 0x40c01
callq 0x6310
movq %rax, -0x1c8(%rbp)
jmp 0x13be8
movq -0x1c8(%rbp), %rdi
movq 0x4f3aa(%rip), %rsi     # 0x62fa0
callq 0x6360
jmp 0x13bfd
movq 0x4f3c4(%rip), %rdi     # 0x62fc8
leaq 0x2d016(%rip), %rsi     # 0x40c21
callq 0x6310
jmp 0x13c12
movq 0x4f3c7(%rip), %rdi     # 0x62fe0
leaq -0x48(%rbp), %rsi
callq 0x6090
jmp 0x13c24
xorl %eax, %eax
movl %eax, %esi
leaq -0x48(%rbp), %rdi
callq 0x6660
movq %rax, -0x1d0(%rbp)
jmp 0x13c3a
movq -0x1d0(%rbp), %rax
movsbl (%rax), %edi
callq 0x6600
cmpl $0x53, %eax
jne 0x13cc8
leaq -0x120(%rbp), %rdi
callq 0xa7a0
jmp 0x13c5c
jmp 0x13cfb
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x20(%rbp)
movl %eax, -0x24(%rbp)
jmp 0x1413b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x20(%rbp)
movl %eax, -0x24(%rbp)
leaq -0x130(%rbp), %rdi
callq 0xb070
jmp 0x14129
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x20(%rbp)
movl %eax, -0x24(%rbp)
jmp 0x1411d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x20(%rbp)
movl %eax, -0x24(%rbp)
testb $0x1, -0x159(%rbp)
jne 0x13cb7
jmp 0x13cc3
leaq -0x158(%rbp), %rdi
callq 0xaf80
jmp 0x1411d
movq 0x4f2f9(%rip), %rdi     # 0x62fc8
leaq 0x2cf5a(%rip), %rsi     # 0x40c30
callq 0x6310
movq %rax, -0x1d8(%rbp)
jmp 0x13ce4
movq -0x1d8(%rbp), %rdi
movq 0x4f2ae(%rip), %rsi     # 0x62fa0
callq 0x6360
jmp 0x13cf9
jmp 0x13cfb
jmp 0x140d3
leaq -0x18(%rbp), %rdi
callq 0x14340
movq %rax, -0x1e8(%rbp)
xorl %eax, %eax
movl %eax, %esi
leaq -0x48(%rbp), %rdi
callq 0x6660
movq %rax, -0x1e0(%rbp)
jmp 0x13d26
movq -0x1e0(%rbp), %rax
movsbl (%rax), %edi
callq 0x6600
movq -0x1e8(%rbp), %rdi
movb %al, -0x15a(%rbp)
leaq -0x15a(%rbp), %rsi
callq 0x14360
movq %rax, -0x1f0(%rbp)
jmp 0x13d57
leaq -0x170(%rbp), %rdi
movq %rdi, -0x200(%rbp)
leaq -0x10(%rbp), %rsi
callq 0xac80
movq -0x1f0(%rbp), %rdi
movq -0x200(%rbp), %rsi
callq 0x14440
movb %al, -0x1f1(%rbp)
jmp 0x13d89
movb -0x1f1(%rbp), %al
andb $0x1, %al
movb %al, -0x25(%rbp)
leaq -0x170(%rbp), %rdi
callq 0xb070
jmp 0x13e27
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x20(%rbp)
movl %eax, -0x24(%rbp)
jmp 0x13dcb
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x20(%rbp)
movl %eax, -0x24(%rbp)
leaq -0x170(%rbp), %rdi
callq 0xb070
movl -0x24(%rbp), %eax
movl %eax, -0x204(%rbp)
movl $0x5, %ecx
cmpl %ecx, %eax
jne 0x13e2c
movq -0x20(%rbp), %rdi
callq 0x6170
movq %rax, -0x1a8(%rbp)
movq 0x4f1d4(%rip), %rdi     # 0x62fc8
leaq 0x2cf08(%rip), %rsi     # 0x40d03
callq 0x6310
movq %rax, -0x210(%rbp)
jmp 0x13e09
movq -0x210(%rbp), %rdi
movq 0x4f189(%rip), %rsi     # 0x62fa0
callq 0x6360
jmp 0x13e1e
callq 0x6550
jmp 0x13e25
jmp 0x13e27
jmp 0x140d3
movl -0x204(%rbp), %eax
movl $0x4, %ecx
cmpl %ecx, %eax
jne 0x13e85
movq -0x20(%rbp), %rdi
callq 0x6170
movq %rax, -0x1a0(%rbp)
movq 0x4f176(%rip), %rdi     # 0x62fc8
leaq 0x2ce69(%rip), %rsi     # 0x40cc2
callq 0x6310
movq %rax, -0x218(%rbp)
jmp 0x13e67
movq -0x218(%rbp), %rdi
movq 0x4f12b(%rip), %rsi     # 0x62fa0
callq 0x6360
jmp 0x13e7c
callq 0x6550
jmp 0x13e83
jmp 0x13e27
movl -0x204(%rbp), %eax
movl $0x3, %ecx
cmpl %ecx, %eax
jne 0x13f37
movq -0x20(%rbp), %rdi
callq 0x6170
movq %rax, -0x198(%rbp)
movq 0x4f119(%rip), %rdi     # 0x62fc8
leaq 0x2c225(%rip), %rsi     # 0x400db
callq 0x6310
movq %rax, -0x220(%rbp)
jmp 0x13ec4
movq -0x220(%rbp), %rdi
movq -0x198(%rbp), %rsi
callq 0x6310
movq %rax, -0x228(%rbp)
jmp 0x13ee0
movq -0x228(%rbp), %rdi
movq 0x4f0b2(%rip), %rsi     # 0x62fa0
callq 0x6360
movq %rax, -0x230(%rbp)
jmp 0x13efc
movq -0x230(%rbp), %rdi
leaq 0x2cd87(%rip), %rsi     # 0x40c91
callq 0x6310
movq %rax, -0x238(%rbp)
jmp 0x13f18
movq -0x238(%rbp), %rdi
movq 0x4f07a(%rip), %rsi     # 0x62fa0
callq 0x6360
jmp 0x13f2d
callq 0x6550
jmp 0x13e27
movl -0x204(%rbp), %eax
movl $0x2, %ecx
cmpl %ecx, %eax
jne 0x14014
movq -0x20(%rbp), %rdi
movq %rdi, -0x240(%rbp)
callq 0x6420
movq %rax, %rsi
leaq -0x190(%rbp), %rdi
callq 0x61a0
jmp 0x13f6b
movq -0x240(%rbp), %rdi
callq 0x6170
movq 0x4f04a(%rip), %rdi     # 0x62fc8
leaq 0x2c156(%rip), %rsi     # 0x400db
callq 0x6310
movq %rax, -0x248(%rbp)
jmp 0x13f93
movq -0x248(%rbp), %rdi
leaq -0x190(%rbp), %rsi
callq 0x6300
movq %rax, -0x250(%rbp)
jmp 0x13faf
movq -0x250(%rbp), %rdi
movq 0x4efe3(%rip), %rsi     # 0x62fa0
callq 0x6360
movq %rax, -0x258(%rbp)
jmp 0x13fcb
movq -0x258(%rbp), %rdi
leaq 0x2ccb8(%rip), %rsi     # 0x40c91
callq 0x6310
movq %rax, -0x260(%rbp)
jmp 0x13fe7
movq -0x260(%rbp), %rdi
movq 0x4efab(%rip), %rsi     # 0x62fa0
callq 0x6360
jmp 0x13ffc
leaq -0x190(%rbp), %rdi
callq 0x6678
callq 0x6550
jmp 0x1400f
jmp 0x13e27
movq -0x20(%rbp), %rdi
callq 0x6170
movq 0x4efa4(%rip), %rdi     # 0x62fc8
leaq 0x2cc1d(%rip), %rsi     # 0x40c48
callq 0x6310
movq %rax, -0x268(%rbp)
jmp 0x14039
movq -0x268(%rbp), %rdi
movq 0x4ef59(%rip), %rsi     # 0x62fa0
callq 0x6360
jmp 0x1404e
callq 0x6550
jmp 0x14055
jmp 0x13e27
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x20(%rbp)
movl %eax, -0x24(%rbp)
callq 0x6550
jmp 0x1406d
jmp 0x1411d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x20(%rbp)
movl %eax, -0x24(%rbp)
leaq -0x190(%rbp), %rdi
callq 0x6678
callq 0x6550
jmp 0x14091
jmp 0x1411d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x20(%rbp)
movl %eax, -0x24(%rbp)
callq 0x6550
jmp 0x1411d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x20(%rbp)
movl %eax, -0x24(%rbp)
callq 0x6550
jmp 0x140bc
jmp 0x1411d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x20(%rbp)
movl %eax, -0x24(%rbp)
callq 0x6550
jmp 0x140d1
jmp 0x1411d
callq 0x13a00
jmp 0x140da
jmp 0x13aeb
leaq -0x120(%rbp), %rdi
callq 0x73d0
jmp 0x140ed
leaq -0x120(%rbp), %rdi
callq 0x14490
leaq -0x48(%rbp), %rdi
callq 0x6678
leaq -0x18(%rbp), %rdi
callq 0x14500
leaq -0x10(%rbp), %rdi
callq 0xb070
addq $0x270, %rsp            # imm = 0x270
popq %rbp
retq
leaq -0x120(%rbp), %rdi
callq 0x14490
leaq -0x48(%rbp), %rdi
callq 0x6678
leaq -0x18(%rbp), %rdi
callq 0x14500
leaq -0x10(%rbp), %rdi
callq 0xb070
movq -0x20(%rbp), %rdi
callq 0x6590
movq %rax, %rdi
callq 0xc1c0
nopw %cs:(%rax,%rax)