package org.msh.etbm.db;


import org.msh.etbm.commons.entities.cmdlog.Operation;
import org.msh.etbm.commons.entities.cmdlog.PropertyLog;
import org.msh.etbm.db.entities.AdministrativeUnit;

import javax.persistence.*;
import javax.validation.constraints.NotNull;

@Embeddable
public class Address {

    @Column(length = 100)
    private String address;

    @Column(length = 100)
    private String complement;

    @Column(length = 20)
    private String zipCode;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "ADMINUNIT_ID")
    @NotNull
    @PropertyLog(operations = {Operation.NEW, Operation.DELETE})
    private AdministrativeUnit adminUnit;


    @Override
    public String toString() {
        String s = (address == null ? "" : address);

        if ((complement != null) && (!complement.isEmpty())) {
            if (!s.isEmpty()) {
                s += '\n';
            }
            s += complement;
        }

        if ((zipCode != null) && (!zipCode.isEmpty())) {
            if (!s.isEmpty()) {
                s += '\n';
            }
            s += zipCode;
        }

        if (adminUnit != null) {
            if (!s.isEmpty()) {
                s += "\n";
            }
            s += adminUnit.getFullDisplayName();
        }

        return s;
    }

    /**
     * Checks if the address is empty.
     * Name changed because of EL expression limitations (bug)
     *
     * @return
     */
    public boolean isEmptyy() {
        return (isStringEmpty(getAddress())) || (getAdminUnit() == null);
    }

    public void copy(Address addr) {
        address = addr.getAddress();
        complement = addr.getComplement();
        zipCode = addr.zipCode;
        adminUnit = addr.getAdminUnit();
    }

    private boolean isStringEmpty(String s) {
        return (s == null) || (s.isEmpty());
    }

    public String getComplement() {
        return complement;
    }

    public void setComplement(String complement) {
        this.complement = complement;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getZipCode() {
        return zipCode;
    }

    public void setZipCode(String zipCode) {
        this.zipCode = zipCode;
    }


    /**
     * @param adminUnit the adminUnit to set
     */
    public void setAdminUnit(AdministrativeUnit adminUnit) {
        this.adminUnit = adminUnit;
    }

    /**
     * @return the adminUnit
     */
    public AdministrativeUnit getAdminUnit() {
        return adminUnit;
    }

}
