package br.gov.servicos.cms;

import br.gov.servicos.v3.schema.ServicoXML;
import com.github.slugify.Slugify;
import lombok.AllArgsConstructor;
import lombok.SneakyThrows;
import lombok.Value;
import lombok.experimental.FieldDefaults;
import lombok.experimental.Wither;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.stereotype.Component;

import java.text.ParseException;
import java.util.Locale;

import static br.gov.servicos.cms.TipoPagina.SERVICO;
import static br.gov.servicos.config.PortalDeServicosIndex.PORTAL_DE_SERVICOS_INDEX;
import static lombok.AccessLevel.PRIVATE;
import static org.springframework.data.elasticsearch.annotations.FieldIndex.not_analyzed;
import static org.springframework.data.elasticsearch.annotations.FieldType.String;

@Value
@Wither
@AllArgsConstructor(access = PRIVATE)
@Document(indexName = PORTAL_DE_SERVICOS_INDEX, type = "pagina-estatica")
public class PaginaEstatica {

    @Id
    @Field(store = true, type = String, index = not_analyzed)
    String id;

    @Field(store = true, type = String)
    String nome;

    @Field(store = true, type = String)
    String conteudo;

    @Field(type = String, store = true, index = not_analyzed)
    String html;

    @Field(store = true, type = String, index = not_analyzed)
    String tipoConteudo;

    public PaginaEstatica() {
        this(null, null, null, null, null);
    }

    @SneakyThrows
    public static PaginaEstatica fromServico(ServicoXML servico) {
        return new PaginaEstatica()
                .withId(new Slugify().slugify(servico.getNome()))
                .withTipoConteudo(SERVICO.getNome())
                .withNome(servico.getNome())
                .withConteudo(servico.getDescricao());
    }

    @Component
    @FieldDefaults(level = PRIVATE, makeFinal = true)
    public static class PaginaEstaticaFormatter implements org.springframework.format.Formatter<PaginaEstatica> {

        PaginaEstaticaRepository paginas;
        Slugify slugify;

        @Autowired
        public PaginaEstaticaFormatter(PaginaEstaticaRepository paginas, Slugify slugify) {
            this.paginas = paginas;
            this.slugify = slugify;
        }

        @Override
        public PaginaEstatica parse(String id, Locale locale) throws ParseException {
            return paginas.findOne(slugify.slugify(id));
        }

        @Override
        public String print(PaginaEstatica conteudo, Locale locale) {
            return conteudo.getId();
        }
    }

}