/* contact.c -- implementasi model dan operasi kontak. */

#include "contact.h"

#include <string.h>

void contact_list_init(ContactList *list) {
    if (list == 0) return;
    list->jumlah = 0;
    list->id_berikutnya = 1;
}

int contact_valid_nama(const char *nama) {
    if (nama == 0 || nama[0] == '\0') return 0;
    /* Cek panjang maksimum. */
    if (strlen(nama) >= CONTACT_NAMA_MAKS) return 0;
    return 1;
}

ContactStatus contact_tambah(ContactList *list,
                              const char *nama,
                              const char *telp,
                              const char *email) {
    if (list == 0) return CONTACT_ERR_INPUT_INVALID;
    if (!contact_valid_nama(nama)) return CONTACT_ERR_INPUT_INVALID;
    if (list->jumlah >= CONTACT_MAKS) return CONTACT_ERR_PENUH;

    Contact *c = &list->data[list->jumlah];
    c->id = list->id_berikutnya++;
    strncpy(c->nama, nama, CONTACT_NAMA_MAKS - 1);
    c->nama[CONTACT_NAMA_MAKS - 1] = '\0';
    strncpy(c->telp, telp ? telp : "", CONTACT_TELP_MAKS - 1);
    c->telp[CONTACT_TELP_MAKS - 1] = '\0';
    strncpy(c->email, email ? email : "", CONTACT_EMAIL_MAKS - 1);
    c->email[CONTACT_EMAIL_MAKS - 1] = '\0';
    list->jumlah++;
    return CONTACT_OK;
}

void contact_tampilkan(const ContactList *list, FILE *out) {
    if (list == 0 || out == 0) return;
    fprintf(out, "%-4s %-20s %-15s %-25s\n",
            "ID", "Nama", "Telp", "Email");
    for (int i = 0; i < list->jumlah; i++) {
        const Contact *c = &list->data[i];
        fprintf(out, "%-4d %-20s %-15s %-25s\n",
                c->id, c->nama, c->telp, c->email);
    }
    fprintf(out, "Total: %d kontak\n", list->jumlah);
}

int contact_cari(const ContactList *list, const char *nama) {
    if (list == 0 || nama == 0) return -1;
    for (int i = 0; i < list->jumlah; i++) {
        if (strcmp(list->data[i].nama, nama) == 0) {
            return i;
        }
    }
    return -1;
}

ContactStatus contact_ubah(ContactList *list, int id,
                            const char *nama_baru,
                            const char *telp_baru,
                            const char *email_baru) {
    if (list == 0) return CONTACT_ERR_INPUT_INVALID;
    for (int i = 0; i < list->jumlah; i++) {
        if (list->data[i].id == id) {
            if (nama_baru && !contact_valid_nama(nama_baru)) {
                return CONTACT_ERR_INPUT_INVALID;
            }
            if (nama_baru) {
                strncpy(list->data[i].nama, nama_baru, CONTACT_NAMA_MAKS - 1);
                list->data[i].nama[CONTACT_NAMA_MAKS - 1] = '\0';
            }
            if (telp_baru) {
                strncpy(list->data[i].telp, telp_baru, CONTACT_TELP_MAKS - 1);
                list->data[i].telp[CONTACT_TELP_MAKS - 1] = '\0';
            }
            if (email_baru) {
                strncpy(list->data[i].email, email_baru, CONTACT_EMAIL_MAKS - 1);
                list->data[i].email[CONTACT_EMAIL_MAKS - 1] = '\0';
            }
            return CONTACT_OK;
        }
    }
    return CONTACT_ERR_TIDAK_DITEMUKAN;
}

ContactStatus contact_hapus(ContactList *list, int id) {
    if (list == 0) return CONTACT_ERR_INPUT_INVALID;
    for (int i = 0; i < list->jumlah; i++) {
        if (list->data[i].id == id) {
            /* Geser elemen setelahnya ke depan. */
            for (int j = i; j < list->jumlah - 1; j++) {
                list->data[j] = list->data[j + 1];
            }
            list->jumlah--;
            return CONTACT_OK;
        }
    }
    return CONTACT_ERR_TIDAK_DITEMUKAN;
}
