/*
 * escrever - Escreve texto em um arquivo (análogo ao echo/cat >)
 * Uso: escrever <arquivo> [texto]
 * Se o texto não for informado, lê da entrada padrão (stdin).
 * Sobrescreve o arquivo se ele já existir.
 */

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

#define BUFFER_SIZE 4096

int main(int argc, char *argv[]) {
    if (argc < 2) {
        fprintf(stderr, "Uso: escrever <arquivo> [texto]\n");
        fprintf(stderr, "  Se o texto não for informado, lê do stdin (Ctrl+D para finalizar).\n");
        return EXIT_FAILURE;
    }

    const char *nome_arquivo = argv[1];
    FILE *fp = fopen(nome_arquivo, "w");
    if (!fp) {
        fprintf(stderr, "escrever: erro ao abrir '%s' para escrita: %s\n",
                nome_arquivo, strerror(errno));
        return EXIT_FAILURE;
    }

    if (argc >= 3) {
        /* Escreve o texto passado como argumento */
        for (int i = 2; i < argc; i++) {
            if (i > 2) fputc(' ', fp); /* espaço entre argumentos */
            if (fputs(argv[i], fp) == EOF) {
                fprintf(stderr, "escrever: erro ao escrever em '%s': %s\n",
                        nome_arquivo, strerror(errno));
                fclose(fp);
                return EXIT_FAILURE;
            }
        }
        fputc('\n', fp);
    } else {
        /* Lê do stdin */
        char buf[BUFFER_SIZE];
        size_t n;
        while ((n = fread(buf, 1, sizeof(buf), stdin)) > 0) {
            if (fwrite(buf, 1, n, fp) != n) {
                fprintf(stderr, "escrever: erro ao escrever em '%s': %s\n",
                        nome_arquivo, strerror(errno));
                fclose(fp);
                return EXIT_FAILURE;
            }
        }
        if (ferror(stdin)) {
            fprintf(stderr, "escrever: erro ao ler da entrada padrão\n");
            fclose(fp);
            return EXIT_FAILURE;
        }
    }

    fclose(fp);
    printf("Arquivo '%s' escrito com sucesso.\n", nome_arquivo);
    return EXIT_SUCCESS;
}
