/*
 * procurar_arquivo - Procura arquivos recursivamente (análogo ao find)
 * Uso: procurar_arquivo <diretório> <padrão>
 *   Ou: procurar_arquivo <padrão>  (busca a partir do diretório atual)
 *
 * O padrão pode conter coringas como *.c, teste*.txt, etc.
 */

#define _DEFAULT_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <dirent.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fnmatch.h>

static int encontrados = 0;

static int buscar(const char *dirpath, const char *padrao, int profundidade) {
    DIR *dir = opendir(dirpath);
    if (!dir) {
        fprintf(stderr, "procurar_arquivo: erro ao abrir '%s': %s\n",
                dirpath, strerror(errno));
        return -1;
    }

    struct dirent *ent;
    char caminho[4096];

    while ((ent = readdir(dir)) != NULL) {
        /* Pula . e .. */
        if (strcmp(ent->d_name, ".") == 0 || strcmp(ent->d_name, "..") == 0)
            continue;

        snprintf(caminho, sizeof(caminho), "%s/%s", dirpath, ent->d_name);

        struct stat st;
        if (lstat(caminho, &st) != 0)
            continue;

        /* Verifica se o nome bate com o padrão */
        if (fnmatch(padrao, ent->d_name, 0) == 0) {
            printf("%s\n", caminho);
            encontrados++;
        }

        /* Se for diretório (e não link simbólico), busca recursivamente */
        if (S_ISDIR(st.st_mode) && !S_ISLNK(st.st_mode)) {
            buscar(caminho, padrao, profundidade + 1);
        }
    }

    closedir(dir);
    return 0;
}

int main(int argc, char *argv[]) {
    const char *diretorio = ".";
    const char *padrao = NULL;

    if (argc < 2) {
        fprintf(stderr, "Uso: procurar_arquivo [diretório] <padrão>\n");
        fprintf(stderr, "Exemplos:\n");
        fprintf(stderr, "  procurar_arquivo '*.c'           (busca no dir atual)\n");
        fprintf(stderr, "  procurar_arquivo /tmp '*.txt'    (busca em /tmp)\n");
        return EXIT_FAILURE;
    }

    if (argc == 2) {
        /* Apenas padrão informado */
        padrao = argv[1];
    } else {
        /* Diretório + padrão */
        diretorio = argv[1];
        padrao = argv[2];
    }

    printf("Procurando por '%s' em '%s'...\n", padrao, diretorio);
    buscar(diretorio, padrao, 0);

    if (encontrados == 0) {
        printf("Nenhum arquivo encontrado.\n");
    } else {
        printf("\n%d arquivo(s) encontrado(s).\n", encontrados);
    }

    return EXIT_SUCCESS;
}
