package io.delphiplatform.api.v3.model.localization;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import com.google.common.base.MoreObjects;
import com.google.common.base.Objects;

import java.util.HashMap;
import java.util.Map;

import javax.validation.constraints.NotNull;

import io.delphiplatform.api.v3.model.Region;
import io.delphiplatform.api.v3.rdb.entity.RegionEntity;

@JsonPropertyOrder(alphabetic = true)
public class RegionLocalization {

    @JsonProperty("region")
    private Region region;

    @JsonProperty("region_translations")
    private Map<String, RegionTranslation> regionTranslations;

    public static RegionLocalization from(RegionEntity regionEntity) {
        if (regionEntity == null) {
            return null;
        }
        HashMap<String, RegionTranslation> regionTranslations = new HashMap<>();
        regionEntity.getCountryLocales()
            .forEach(e -> regionTranslations.put(e.getCountryLocaleId().getLangTag(), RegionTranslation.from(e)));
        return new RegionLocalization()
            .region(Region.from(regionEntity))
            .regionTranslations(regionTranslations);
    }

    public RegionLocalization region(Region region) {
        this.region = region;
        return this;
    }

    @NotNull
    public Region getRegion() {
        return region;
    }

    public void setRegion(Region region) {
        this.region = region;
    }

    public RegionLocalization regionTranslations(Map<String, RegionTranslation> regionTranslations) {
        this.regionTranslations = regionTranslations;
        return this;
    }

    @NotNull
    public Map<String, RegionTranslation> getRegionTranslations() {
        return regionTranslations;
    }

    public void setRegionTranslations(Map<String, RegionTranslation> regionTranslations) {
        this.regionTranslations = regionTranslations;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        RegionLocalization that = (RegionLocalization) o;
        return Objects.equal(region, that.region) && Objects
            .equal(regionTranslations, that.regionTranslations);
    }

    @Override
    public int hashCode() {
        return Objects.hashCode(region, regionTranslations);
    }

    @Override
    public String toString() {
        return MoreObjects.toStringHelper(this)
            .add("region", region)
            .add("regionTranslations", regionTranslations)
            .toString();
    }

}
