package com.social.media.domain.company.valueobjects;

import jakarta.persistence.Column;
import jakarta.persistence.Embeddable;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Value;

/**
 * Address Value Object
 * 
 * Represents a complete address with all components
 * following Brazilian address standards.
 * 
 * @author Social Media Manager Team
 * @since 2.0.0
 */
@Embeddable
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@EqualsAndHashCode
public class Address {
    
    @Column(name = "address_street", length = 200)
    private String street;
    
    @Column(name = "address_number", length = 20)
    private String number;
    
    @Column(name = "address_complement", length = 100)
    private String complement;
    
    @Column(name = "address_neighborhood", length = 100)
    private String neighborhood;
    
    @Column(name = "address_city", length = 100)
    private String city;
    
    @Column(name = "address_state", length = 50)
    private String state;
    
    @Column(name = "address_country", length = 50)
    private String country = "Brasil";
    
    @Column(name = "address_zip_code", length = 10)
    private String zipCode;
    
    /**
     * Create a complete address
     */
    public static Address of(String street, String number, String complement, 
                           String neighborhood, String city, String state, 
                           String country, String zipCode) {
        var address = new Address();
        address.street = street;
        address.number = number;
        address.complement = complement;
        address.neighborhood = neighborhood;
        address.city = city;
        address.state = state;
        address.country = country != null ? country : "Brasil";
        address.zipCode = zipCode;
        return address;
    }
    
    /**
     * Create address without complement
     */
    public static Address of(String street, String number, String neighborhood, 
                           String city, String state, String zipCode) {
        return of(street, number, null, neighborhood, city, state, "Brasil", zipCode);
    }
    
    /**
     * Get formatted address string
     */
    public String getFormattedAddress() {
        var builder = new StringBuilder();
        
        if (street != null && !street.isBlank()) {
            builder.append(street);
            if (number != null && !number.isBlank()) {
                builder.append(", ").append(number);
            }
            if (complement != null && !complement.isBlank()) {
                builder.append(" - ").append(complement);
            }
        }
        
        if (neighborhood != null && !neighborhood.isBlank()) {
            if (!builder.isEmpty()) builder.append(", ");
            builder.append(neighborhood);
        }
        
        if (city != null && !city.isBlank()) {
            if (!builder.isEmpty()) builder.append(", ");
            builder.append(city);
        }
        
        if (state != null && !state.isBlank()) {
            if (!builder.isEmpty()) builder.append(" - ");
            builder.append(state);
        }
        
        if (zipCode != null && !zipCode.isBlank()) {
            if (!builder.isEmpty()) builder.append(", ");
            builder.append("CEP: ").append(zipCode);
        }
        
        if (country != null && !country.isBlank() && !"Brasil".equals(country)) {
            if (!builder.isEmpty()) builder.append(", ");
            builder.append(country);
        }
        
        return builder.toString();
    }
    
    /**
     * Check if address has minimum required information
     */
    public boolean isComplete() {
        return street != null && !street.isBlank() &&
               city != null && !city.isBlank() &&
               state != null && !state.isBlank();
    }
    
    @Override
    public String toString() {
        return getFormattedAddress();
    }
}
