package mx.gob.jumapacelaya.views.crearnuevoticket;

import com.nimbusds.jose.shaded.gson.JsonObject;
import com.nimbusds.jose.shaded.gson.JsonParser;
import com.vaadin.flow.component.button.Button;
import com.vaadin.flow.component.button.ButtonVariant;
import com.vaadin.flow.component.combobox.ComboBox;
import com.vaadin.flow.component.html.H2;
import com.vaadin.flow.component.notification.Notification;
import com.vaadin.flow.component.notification.NotificationVariant;
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.component.textfield.TextArea;
import com.vaadin.flow.component.textfield.TextField;
import com.vaadin.flow.component.upload.Upload;
import com.vaadin.flow.component.upload.receivers.MemoryBuffer;
import com.vaadin.flow.router.PageTitle;
import com.vaadin.flow.router.Route;
import jakarta.annotation.security.PermitAll;
import mx.gob.jumapacelaya.api.RedmineClient;
import mx.gob.jumapacelaya.models.RedmineUser;
import mx.gob.jumapacelaya.services.UserService;
import mx.gob.jumapacelaya.views.MainLayout;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Route(value = "", layout = MainLayout.class)
@PermitAll
@PageTitle("Nuevo ticket")
public class CrearnuevoTicketView extends VerticalLayout {

    private final RedmineClient api;  // Definir el campo final para el RedmineClient
    private final UserService userService;
    private MemoryBuffer buffer;
    private Upload uploadFile;

     // Inyectar el RedmineClient a través del constructor
    public CrearnuevoTicketView(RedmineClient api, UserService service) {
        this.api = api;  // Asignar el RedmineClient inyectado al campo de la clase
        this.userService = service;

        // Obtener la URL de Redmine, apiKey y username desde las propiedades del servidor
        RedmineUser user = userService.getRedmineUser();
        //String apiKey = (String) VaadinService.getCurrentRequest().getWrappedSession().getAttribute("apiKey");
        //String username = (String) VaadinService.getCurrentRequest().getWrappedSession().getAttribute("username");


        // Combo de los tipos de tickets
        ComboBox<String> tipoTickets = new ComboBox<>("Tipo de ticket");
        List<String> types = api.getTicketTypes();  // Llamar al método sin pasar apiKey
        tipoTickets.setItems(types);

        // Campo de texto para el asunto
        TextField asunto = new TextField("Asunto");
        asunto.setWidth("700px");

        // Campo de texto para la descripcion
        TextArea descripcion = new TextArea("Descripcion");
        descripcion.setWidth("1000px");
        descripcion.setHeight("250px");

        // Campo para adjuntar archivos
        buffer = new MemoryBuffer();
        uploadFile = new Upload(buffer);
        uploadFile.setAcceptedFileTypes("image/jpeg", "image/png", "application/pdf");

        // Boton para crear los tickets
        Button createButton = new Button("Enviar ticket", event -> {
            if (user.getKey() == null || user.getKey().isEmpty()) {
                Notification.show("No se encontró la API key en la sesión.", 5000, Notification.Position.MIDDLE)
                        .addThemeVariants(NotificationVariant.LUMO_ERROR);
                return;
            }

            Map<String, String> issueDetails = new HashMap<>();
            issueDetails.put("project_id", "soporte-tecnico-t-i");
            issueDetails.put("subject", asunto.getValue());
            issueDetails.put("description", descripcion.getValue());

            String fileUploadToken = null;
            if (buffer.getFileData() != null) {
                try {
                    byte[] fileContent = buffer.getInputStream().readAllBytes();
                    String fileName = buffer.getFileName();
                    fileUploadToken = api.uploadFile(fileContent, fileName);  // Llamar al método sin pasar apiKey
                } catch (IOException e) {
                    Notification.show("Error al cargar el archivo: " + e.getMessage(), 5000, Notification.Position.MIDDLE)
                            .addThemeVariants(NotificationVariant.LUMO_WARNING);
                }
            }

            String response = api.createIssue(issueDetails, fileUploadToken);  // Llamar al método sin pasar apiKey
            handleResponse(response, asunto, descripcion, tipoTickets);
        });

        createButton.addThemeVariants(ButtonVariant.LUMO_PRIMARY);

        VerticalLayout fieldsLayout = new VerticalLayout(descripcion, uploadFile);
        fieldsLayout.setAlignItems(Alignment.CENTER);
        HorizontalLayout firstFields = new HorizontalLayout(tipoTickets, asunto);
        VerticalLayout buttonLayout = new VerticalLayout(createButton);
        buttonLayout.setAlignItems(Alignment.END);
        buttonLayout.setMargin(true);

        add(new H2("Crear nuevo ticket"), firstFields, fieldsLayout, buttonLayout);
        //this.userService = userService;
    }

    private void handleResponse(String response, TextField asunto, TextArea descripcion, ComboBox<String> tipoTickets) {
        if (response.startsWith("{\"issue\":")) {
            JsonObject jsonResponse = JsonParser.parseString(response).getAsJsonObject();
            int issueNumber = jsonResponse.getAsJsonObject("issue").get("id").getAsInt();
            Notification.show("Su ticket se ha enviado correctamente! Numero de ticket: #" + issueNumber, 5000, Notification.Position.MIDDLE)
                    .addThemeVariants(NotificationVariant.LUMO_SUCCESS);

            resetForm(asunto, descripcion, tipoTickets);
        } else {
            Notification.show(response, 5000, Notification.Position.MIDDLE)
                    .addThemeVariants(NotificationVariant.LUMO_ERROR);
        }
    }

    private void resetForm(TextField asunto, TextArea descripcion, ComboBox<String> tipoTickets) {
        asunto.clear();
        descripcion.clear();
        tipoTickets.clear();
        buffer = new MemoryBuffer();
        uploadFile.setReceiver(buffer);
        uploadFile.clearFileList();
    }
}
