package br.gov.sigefp.common.util;

import java.math.BigDecimal;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

/**
 * Configurações e utilitários específicos para Guiné-Bissau.
 */
public class GuineaBissauConfig {

    /**
     * Código do país: GW (ISO 3166-1 alpha-2)
     */
    public static final String COUNTRY_CODE = "GW";

    /**
     * Nome do país
     */
    public static final String COUNTRY_NAME = "Guiné-Bissau";

    /**
     * Código da moeda: XOF (Franco CFA da África Ocidental)
     */
    public static final String CURRENCY_CODE = "XOF";

    /**
     * Símbolo da moeda
     */
    public static final String CURRENCY_SYMBOL = "FCFA";

    /**
     * Timezone: Africa/Bissau (UTC+0)
     */
    public static final ZoneId TIMEZONE = ZoneId.of("Africa/Bissau");

    /**
     * Locale: Português da Guiné-Bissau
     */
    public static final Locale LOCALE = new Locale("pt", "GW");

    /**
     * Formato de data: DD/MM/YYYY
     */
    public static final String DATE_FORMAT = "dd/MM/yyyy";

    /**
     * Formato de data e hora: DD/MM/YYYY HH:mm
     */
    public static final String DATETIME_FORMAT = "dd/MM/yyyy HH:mm";

    /**
     * Formato de data e hora completo: DD/MM/YYYY HH:mm:ss
     */
    public static final String DATETIME_FULL_FORMAT = "dd/MM/yyyy HH:mm:ss";

    /**
     * Código telefônico internacional: +245
     */
    public static final String PHONE_CODE = "+245";

    /**
     * Formata um valor monetário no formato da Guiné-Bissau.
     * 
     * @param value Valor a formatar
     * @return String formatada (ex: "1.234,56 FCFA")
     */
    public static String formatCurrency(BigDecimal value) {
        if (value == null) {
            return "0,00 " + CURRENCY_SYMBOL;
        }
        
        NumberFormat currencyFormat = NumberFormat.getCurrencyInstance(LOCALE);
        // Como XOF não tem suporte nativo em todos os Locales, formatamos manualmente
        NumberFormat numberFormat = NumberFormat.getNumberInstance(LOCALE);
        numberFormat.setMinimumFractionDigits(2);
        numberFormat.setMaximumFractionDigits(2);
        
        return numberFormat.format(value) + " " + CURRENCY_SYMBOL;
    }

    /**
     * Formata um número no formato da Guiné-Bissau.
     * 
     * @param value Valor a formatar
     * @return String formatada (ex: "1.234,56")
     */
    public static String formatNumber(BigDecimal value) {
        if (value == null) {
            return "0,00";
        }
        
        NumberFormat numberFormat = NumberFormat.getNumberInstance(LOCALE);
        numberFormat.setMinimumFractionDigits(2);
        numberFormat.setMaximumFractionDigits(2);
        
        return numberFormat.format(value);
    }

    /**
     * Formata um número inteiro no formato da Guiné-Bissau.
     * 
     * @param value Valor a formatar
     * @return String formatada (ex: "1.234")
     */
    public static String formatInteger(Long value) {
        if (value == null) {
            return "0";
        }
        
        NumberFormat numberFormat = NumberFormat.getNumberInstance(LOCALE);
        numberFormat.setMinimumFractionDigits(0);
        numberFormat.setMaximumFractionDigits(0);
        
        return numberFormat.format(value);
    }

    /**
     * Retorna um DateTimeFormatter para datas no formato DD/MM/YYYY.
     */
    public static DateTimeFormatter getDateFormatter() {
        return DateTimeFormatter.ofPattern(DATE_FORMAT, LOCALE);
    }

    /**
     * Retorna um DateTimeFormatter para data e hora no formato DD/MM/YYYY HH:mm.
     */
    public static DateTimeFormatter getDateTimeFormatter() {
        return DateTimeFormatter.ofPattern(DATETIME_FORMAT, LOCALE);
    }

    /**
     * Retorna um DateTimeFormatter para data e hora completo no formato DD/MM/YYYY HH:mm:ss.
     */
    public static DateTimeFormatter getDateTimeFullFormatter() {
        return DateTimeFormatter.ofPattern(DATETIME_FULL_FORMAT, LOCALE);
    }

    /**
     * Retorna um SimpleDateFormat para datas no formato DD/MM/YYYY.
     */
    public static SimpleDateFormat getSimpleDateFormat() {
        return new SimpleDateFormat(DATE_FORMAT, LOCALE);
    }

    /**
     * Retorna um SimpleDateFormat para data e hora no formato DD/MM/YYYY HH:mm.
     */
    public static SimpleDateFormat getSimpleDateTimeFormat() {
        return new SimpleDateFormat(DATETIME_FORMAT, LOCALE);
    }
}


