package com.fitbank.schemautils;

import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import com.fitbank.util.CaseInsensitiveMap;
import com.fitbank.util.CaseInsensitiveSet;
import java.util.Collection;

/**
 * Clase Table.
 * 
 * @author FitBank
 */
public class Table {

    private final Map<String, Field> fields = new CaseInsensitiveMap<Field>();

    private final Collection<String> primaryKeys = new CaseInsensitiveSet();

    private String code = "";

    private String name = "";

    private String description = "";

    /**
     * Añade un campo a este objeto.
     * 
     * @param field
     *            Field a ser añadido
     */
    public final void addField(Field field) {
        fields.put(field.getName(), field);

        if (field.getPrimaryKey()) {
            primaryKeys.add(field.getName());
        }
    }

    /**
     * Obtiene un campo de este objeto.
     * 
     * @param name
     *            Nombre del campo
     * 
     * @return Field obtenido
     */
    public final Field findField(int code) {
        for (Field field : getFields().values()) {
            if (Integer.parseInt(field.getCode()) == code) {
                return field;
            }
        }

        return null;
    }

    /**
     * Obtiene un mapa de los nombres de los fields apuntando al objeto de
     * fields.
     * 
     * @return String[] con los nombres de los fields.
     */
    public final Map<String, Field> getFields() {
        return fields;
    }

    /**
     * Obtiene un mapa con los nombres de las claves primarias en este objeto.
     * 
     * @return String[] con los nombres de las claves primarias
     */
    public final Collection<String> getPrimaryKeys() {
        return primaryKeys;
    }

    /**
     * Obtiene un arreglo con los nombres de las claves primarias en este
     * objeto.
     * 
     * @return String[] con los nombres de las claves primarias
     */
    public final String[] getPrimaryKeysAsArrayForComboBox() {
        Set<String> s = new HashSet<String>();
        s.add("");
        s.addAll(primaryKeys);
        return s.toArray(new String[] {});
    }

    /**
     * Cambia el name de este objeto.
     * 
     * @param name
     *            String con el nuevo name
     */
    public void setName(String name) {
        this.name = name == null ? "" : name;
    }

    /**
     * Obtiene el name de este objeto.
     * 
     * @return String con el name
     */
    public String getName() {
        return name;
    }

    /**
     * Cambia el número de este objeto.
     * 
     * @param code
     *            String con el nuevo número
     */
    public void setCode(String code) {
        this.code = code == null ? "" : code;
    }

    /**
     * Obtiene el número de este objeto.
     * 
     * @return String con el número
     */
    public String getCode() {
        return code;
    }

    /**
     * Cambia la descripción de este objeto.
     * 
     * @param description
     *            String con la nueva descripción
     */
    public void setDescription(String description) {
        this.description = description == null ? "" : description;
    }

    /**
     * Obtiene la descripción de este objeto.
     * 
     * @return String con la descripción
     */
    public String getDescription() {
        return description;
    }
}
