package com.khartec.waltz.web.endpoints.extracts;

import org.eclipse.jetty.http.MimeTypes;
import org.jooq.lambda.tuple.Tuple3;
import spark.Request;
import spark.Response;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

import static com.khartec.waltz.common.EnumUtilities.readEnum;
import static com.khartec.waltz.common.StringUtilities.mkSafe;

/**
 * Represents classes which are used for Data Extraction.
 */
public interface DataExtractor {

    void register();


    /**
     * Reads the extract format from the web request.  Expects as a param with the
     * name `format`.  E.g. `my-extract?format=XLSX`
     *
     * Defaults to` ExtractFormat.CSV` if not found or not recognized.
     *
     * @param request  web request
     * @return enum representing the value of the format parameter
     */
    default ExtractFormat parseExtractFormat(Request request) {
        return readEnum(
                request.queryParams("format"),
                ExtractFormat.class,
                v -> ExtractFormat.CSV);
    }


    /**
     * Removes illegal characters from sheetName.  Currently: `\ : ; * ? / `
     *
     * @param name  input name of the sheet
     * @return outputs sanitized sheet name
     */
    default String sanitizeSheetName(String name) {
        return mkSafe(name).replaceAll("[:;*?/\\\\]", "");
    }


    default Object writeReportResults(Response response, Tuple3<ExtractFormat, String, byte[]> reportResult) throws IOException {
        String templateName = reportResult.v2;

        HttpServletResponse httpResponse = response.raw();

        switch (reportResult.v1) {
            case XLSX:
                httpResponse.setHeader("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
                httpResponse.setHeader("Content-Disposition", "attachment; filename=" + templateName + ".xlsx");
                httpResponse.setHeader("Content-Transfer-Encoding", "7bit");
                break;
            case CSV:
                response.type(MimeTypes.Type.TEXT_PLAIN.name());
                response.header("Content-disposition", "attachment; filename=" + templateName + ".csv");
                break;
            default:
                break;
        }

        byte[] bytes = reportResult.v3;
        httpResponse.setContentLength(bytes.length);
        httpResponse.getOutputStream().write(bytes);
        httpResponse.getOutputStream().flush();
        httpResponse.getOutputStream().close();

        return httpResponse;
    }


}