#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX 100

typedef struct {
    int registro;
    char nome[100];
    char endereco[150];
    char telefone[20];
    char email[100];
    char observacoes[200];
} Cliente;

void salvarCliente(Cliente c) {
    FILE *fp = fopen("clientes.dat", "ab");
    if (fp == NULL) {
        perror("Erro ao abrir arquivo");
        exit(1);
    }
    fwrite(&c, sizeof(Cliente), 1, fp);
    fclose(fp);
}

void listarClientes() {
    Cliente c;
    FILE *fp = fopen("clientes.dat", "rb");
    if (fp == NULL) {
        printf("Nenhum cliente cadastrado.\n");
        return;
    }
    printf("==== Lista de Clientes ====\n");
    while (fread(&c, sizeof(Cliente), 1, fp)) {
        printf("Registro: %d\nNome: %s\nEndereço: %s\nTelefone: %s\nE-mail: %s\nObservações: %s\n\n",
               c.registro, c.nome, c.endereco, c.telefone, c.email, c.observacoes);
    }
    fclose(fp);
}

int buscarCliente(int reg, Cliente *out) {
    FILE *fp = fopen("clientes.dat", "rb");
    if (fp == NULL) return 0;
    Cliente c;
    while (fread(&c, sizeof(Cliente), 1, fp)) {
        if (c.registro == reg) {
            *out = c;
            fclose(fp);
            return 1;
        }
    }
    fclose(fp);
    return 0;
}

void atualizarCliente(int reg) {
    FILE *fp = fopen("clientes.dat", "rb+");
    if (fp == NULL) {
        printf("Erro ao abrir arquivo.\n");
        return;
    }
    Cliente c;
    int encontrado = 0;
    while (fread(&c, sizeof(Cliente), 1, fp)) {
        if (c.registro == reg) {
            encontrado = 1;
            printf("Atualizando cliente %d:\n", reg);
            printf("Novo nome: "); fgets(c.nome, sizeof(c.nome), stdin); strtok(c.nome, "\n");
            printf("Novo endereço: "); fgets(c.endereco, sizeof(c.endereco), stdin); strtok(c.endereco, "\n");
            printf("Novo telefone: "); fgets(c.telefone, sizeof(c.telefone), stdin); strtok(c.telefone, "\n");
            printf("Novo e-mail: "); fgets(c.email, sizeof(c.email), stdin); strtok(c.email, "\n");
            printf("Novas observações: "); fgets(c.observacoes, sizeof(c.observacoes), stdin); strtok(c.observacoes, "\n");

            fseek(fp, -sizeof(Cliente), SEEK_CUR);
            fwrite(&c, sizeof(Cliente), 1, fp);
            break;
        }
    }
    fclose(fp);
    if (!encontrado)
        printf("Cliente não encontrado.\n");
}

void deletarCliente(int reg) {
    FILE *fp = fopen("clientes.dat", "rb");
    FILE *temp = fopen("temp.dat", "wb");
    if (!fp || !temp) {
        printf("Erro ao abrir arquivos.\n");
        return;
    }
    Cliente c;
    int encontrado = 0;
    while (fread(&c, sizeof(Cliente), 1, fp)) {
        if (c.registro == reg) {
            encontrado = 1;
            continue; // ignora esse cliente
        }
        fwrite(&c, sizeof(Cliente), 1, temp);
    }
    fclose(fp);
    fclose(temp);
    remove("clientes.dat");
    rename("temp.dat", "clientes.dat");
    if (encontrado)
        printf("Cliente removido.\n");
    else
        printf("Cliente não encontrado.\n");
}

void menu() {
    int opcao, reg;
    Cliente c;

    do {
        printf("\n===== MENU CLIENTES =====\n");
        printf("1. Cadastrar cliente\n");
        printf("2. Listar clientes\n");
        printf("3. Buscar cliente\n");
        printf("4. Atualizar cliente\n");
        printf("5. Deletar cliente\n");
        printf("0. Sair\n");
        printf("Escolha: ");
        scanf("%d", &opcao);
        getchar(); // limpa o buffer

        switch (opcao) {
            case 1:
                printf("Registro (ID): "); scanf("%d", &c.registro); getchar();
                printf("Nome: "); fgets(c.nome, sizeof(c.nome), stdin); strtok(c.nome, "\n");
                printf("Endereço: "); fgets(c.endereco, sizeof(c.endereco), stdin); strtok(c.endereco, "\n");
                printf("Telefone: "); fgets(c.telefone, sizeof(c.telefone), stdin); strtok(c.telefone, "\n");
                printf("E-mail: "); fgets(c.email, sizeof(c.email), stdin); strtok(c.email, "\n");
                printf("Observações: "); fgets(c.observacoes, sizeof(c.observacoes), stdin); strtok(c.observacoes, "\n");
                salvarCliente(c);
                break;
            case 2:
                listarClientes();
                break;
            case 3:
                printf("Informe o registro: ");
                scanf("%d", &reg); getchar();
                if (buscarCliente(reg, &c)) {
                    printf("Registro: %d\nNome: %s\nEndereço: %s\nTelefone: %s\nE-mail: %s\nObservações: %s\n",
                           c.registro, c.nome, c.endereco, c.telefone, c.email, c.observacoes);
                } else {
                    printf("Cliente não encontrado.\n");
                }
                break;
            case 4:
                printf("Informe o registro do cliente a atualizar: ");
                scanf("%d", &reg); getchar();
                atualizarCliente(reg);
                break;
            case 5:
                printf("Informe o registro do cliente a deletar: ");
                scanf("%d", &reg); getchar();
                deletarCliente(reg);
                break;
            case 0:
                printf("Saindo...\n");
                break;
            default:
                printf("Opção inválida.\n");
        }
    } while (opcao != 0);
}

int main() {
    menu();
    return 0;
}