package com.termux.shared.models;

import com.termux.shared.markdown.MarkdownUtils;
import com.termux.shared.android.AndroidUtils;
import java.io.Serializable;

/**
 * An object that stored info for {@link com.termux.shared.activities.ReportActivity}.
 */
public class ReportInfo implements Serializable {

    /**
     * The user action that was being processed for which the report was generated.
     */
    public final String userAction;

    /**
     * The internal app component that sent the report.
     */
    public final String sender;

    /**
     * The report title.
     */
    public final String reportTitle;

    /**
     * The timestamp for the report.
     */
    public final String reportTimestamp;

    /**
     * The markdown report text prefix. Will not be part of copy and share operations, etc.
     */
    public String reportStringPrefix;

    /**
     * The markdown report text.
     */
    public String reportString;

    /**
     * The markdown report text suffix. Will not be part of copy and share operations, etc.
     */
    public String reportStringSuffix;

    /**
     * If set to {@code true}, then report header info will be added to the report when markdown is
     * generated.
     */
    public boolean addReportInfoHeaderToMarkdown = false;

    /**
     * The label for the report file to save if user selects menu_item_save_report_to_file.
     */
    public String reportSaveFileLabel;

    /**
     * The path for the report file to save if user selects menu_item_save_report_to_file.
     */
    public String reportSaveFilePath;

    public ReportInfo(String userAction, String sender, String reportTitle) {
        this.userAction = userAction;
        this.sender = sender;
        this.reportTitle = reportTitle;
        this.reportTimestamp = AndroidUtils.getCurrentMilliSecondUTCTimeStamp();
    }

    public void setReportStringPrefix(String reportStringPrefix) {
        this.reportStringPrefix = reportStringPrefix;
    }

    public void setReportString(String reportString) {
        this.reportString = reportString;
    }

    public void setReportStringSuffix(String reportStringSuffix) {
        this.reportStringSuffix = reportStringSuffix;
    }

    public void setAddReportInfoHeaderToMarkdown(boolean addReportInfoHeaderToMarkdown) {
        this.addReportInfoHeaderToMarkdown = addReportInfoHeaderToMarkdown;
    }

    public void setReportSaveFileLabelAndPath(String reportSaveFileLabel, String reportSaveFilePath) {
        setReportSaveFileLabel(reportSaveFileLabel);
        setReportSaveFilePath(reportSaveFilePath);
    }

    public void setReportSaveFileLabel(String reportSaveFileLabel) {
        this.reportSaveFileLabel = reportSaveFileLabel;
    }

    public void setReportSaveFilePath(String reportSaveFilePath) {
        this.reportSaveFilePath = reportSaveFilePath;
    }

    /**
     * Get a markdown {@link String} for {@link ReportInfo}.
     *
     * @param reportInfo The {@link ReportInfo} to convert.
     * @return Returns the markdown {@link String}.
     */
    public static String getReportInfoMarkdownString(final ReportInfo reportInfo) {
        if (reportInfo == null)
            return "null";
        StringBuilder markdownString = new StringBuilder();
        if (reportInfo.addReportInfoHeaderToMarkdown) {
            markdownString.append("## Report Info\n\n");
            markdownString.append("\n").append(MarkdownUtils.getSingleLineMarkdownStringEntry("User Action", reportInfo.userAction, "-"));
            markdownString.append("\n").append(MarkdownUtils.getSingleLineMarkdownStringEntry("Sender", reportInfo.sender, "-"));
            markdownString.append("\n").append(MarkdownUtils.getSingleLineMarkdownStringEntry("Report Timestamp", reportInfo.reportTimestamp, "-"));
            markdownString.append("\n##\n\n");
        }
        markdownString.append(reportInfo.reportString);
        return markdownString.toString();
    }
}
