package com.imprimelibros.erp.presupuesto.classes;

import org.springframework.stereotype.Component;

import com.imprimelibros.erp.i18n.TranslationService;
import com.imprimelibros.erp.presupuesto.Presupuesto;
import org.springframework.context.MessageSource;

import java.util.Locale;
import java.util.List;
import java.util.Map;

@Component
public class PresupuestoFormatter {

    private final TranslationService translationService;
    private final MessageSource ms;
    private final PresupuestoPapeles papeles;
    private final PresupuestoAcabados acabados;

    public PresupuestoFormatter(
            TranslationService translationService,
            MessageSource ms,
            PresupuestoPapeles papeles,
            PresupuestoAcabados acabados) {
        this.translationService = translationService;
        this.ms = ms;
        this.papeles = papeles;
        this.acabados = acabados;
    }

    public String resumen(Presupuesto p, List<Map<String, Object>> servicios, Locale locale) {
        String encuadernacion = translationService.label(p.getTipoEncuadernacion(), locale);
        String tipoImpresion = translationService.label(p.getTipoImpresion(), locale);
        String tapaCubierta = translationService.label(p.getTipoCubierta(), locale);

        Object[] args = {

                p.getSelectedTirada(),
                encuadernacion,
                tipoImpresion,
                (p.getPaginasColorTotal() != null ? p.getPaginasColorTotal() : p.getPaginasColor())
                        + p.getPaginasNegro(),
                p.getAncho(), p.getAlto(),
                papeles.labelPapel(p.getPapelInteriorId(), locale), p.getGramajeInterior(),
                tapaCubierta,
                papeles.labelPapel(p.getPapelCubiertaId(), locale), p.getGramajeCubierta(),
        };
        String textoResumen = ms.getMessage("presupuesto.resumen-texto", args, locale);
        textoResumen += "<ul>";

        // tapa blanda
        if (p.getTipoCubierta() == Presupuesto.TipoCubierta.tapaBlanda) {
            String impresionCubierta = ms.getMessage(
                    "presupuesto.resumen-texto-impresion-caras-cubierta",
                    new Object[] {
                            p.getCubiertaCaras() == 2
                                    ? ms.getMessage("presupuesto.una-cara", null, locale)
                                    : ms.getMessage("presupuesto.dos-caras", null, locale)
                    },
                    locale);
            textoResumen += impresionCubierta;

            if (p.getSolapasCubierta()) {
                textoResumen += ms.getMessage(
                        "presupuesto.resumen-texto-solapas-cubierta",
                        new Object[] { p.getTamanioSolapasCubierta() },
                        locale);
            }
        }
        // tapa dura
        else if (p.getTipoCubierta() == Presupuesto.TipoCubierta.tapaDura
                || p.getTipoCubierta() == Presupuesto.TipoCubierta.tapaDuraLomoRedondo) {

            String textImpresionGuardas = "";
            if (p.getGuardasImpresas() == 0) {
                textImpresionGuardas = ms.getMessage("presupuesto.guardas-no-impresas", null, locale);
            } else if (p.getGuardasImpresas() == 4) {
                textImpresionGuardas = ms.getMessage("presupuesto.guardas-impresas-una-cara", null, locale);
            } else if (p.getGuardasImpresas() == 8) {
                textImpresionGuardas = ms.getMessage("presupuesto.guardas-impresas-dos-caras", null, locale);
            }

            textoResumen += ms.getMessage(
                    "presupuesto.resumen-texto-guardas-cabezada",
                    new Object[] {
                            textImpresionGuardas,
                            papeles.labelPapel(p.getPapelGuardasId(), locale),
                            p.getGramajeGuardas(),
                            papeles.labelCabezada(p.getCabezada(), locale),
                    },
                    locale);
        }

        if (p.getAcabado() != null) {
            textoResumen += ms.getMessage(
                    "presupuesto.resumen-texto-acabado-cubierta",
                    new Object[] { acabados.labelAcabado(p.getAcabado(), locale) },
                    locale);
        }

        textoResumen += ms.getMessage("presupuesto.resumen-texto-end", null, locale);

        if (Boolean.TRUE.equals(p.getSobrecubierta())) {
            textoResumen += ms.getMessage(
                    "presupuesto.resumen-texto-sobrecubierta",
                    new Object[] {
                            papeles.labelPapel(p.getPapelSobrecubiertaId(), locale),
                            p.getGramajeSobrecubierta(),
                            acabados.labelAcabado(p.getAcabadoSobrecubierta(), locale),
                            p.getTamanioSolapasSobrecubierta()
                    },
                    locale);
        }

        if (Boolean.TRUE.equals(p.getFaja())) {
            textoResumen += ms.getMessage(
                    "presupuesto.resumen-texto-faja",
                    new Object[] {
                            papeles.labelPapel(p.getPapelFajaId(), locale),
                            p.getGramajeFaja(),
                            p.getAltoFaja(),
                            acabados.labelAcabado(p.getAcabadoFaja(), locale),
                            p.getTamanioSolapasFaja()
                    },
                    locale);
        }
        textoResumen += ms.getMessage("presupuesto.resumen-texto-end", null, locale);

        return textoResumen;
    }
}
