// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

use crate::config::{self, OutputFormat, ProgramStateHolder};
use crate::Options;
use anyhow::{bail, Context as _, Error};
use fuchsia_triage::{
    analyze, analyze_structured, analyze_verbose, ActionResultFormatter, ActionResults,
    DiagnosticData, ParseResult, TriageOutput,
};

/// The entry point for the CLI app.
pub struct App {
    options: Options,
}

impl App {
    /// Creates a new App with the given options.
    pub fn new(options: Options) -> App {
        App { options }
    }

    /// Runs the App.
    ///
    /// This method consumes self and calls run_structured or run_unstructured
    /// depending on if structured output is in options. It then collects the results
    /// and writes the results to the dest. If an error occurs during the running of the app
    /// it will be returned as an Error.
    pub fn run(self, dest: &mut dyn std::io::Write) -> Result<bool, Error> {
        // TODO(https://fxbug.dev/42127530): Use 'argh' crate.
        let ProgramStateHolder { parse_result, diagnostic_data, output_format } =
            config::initialize(self.options.clone())?;

        match output_format {
            OutputFormat::Structured => {
                let structured_run_result = self.run_structured(diagnostic_data, parse_result)?;
                structured_run_result.write_report(dest)?;
                Ok(structured_run_result.has_reportable_issues())
            }
            OutputFormat::Text | OutputFormat::VerboseText => {
                let run_result =
                    self.run_unstructured(diagnostic_data, parse_result, output_format)?;
                run_result.write_report(dest)?;
                Ok(run_result.has_problems())
            }
        }
    }

    fn run_unstructured(
        self,
        diagnostic_data: Vec<DiagnosticData>,
        parse_result: ParseResult,
        output_format: OutputFormat,
    ) -> Result<RunResult, Error> {
        let action_results = match output_format {
            OutputFormat::Text => analyze(&diagnostic_data, &parse_result)?,
            OutputFormat::VerboseText => analyze_verbose(&diagnostic_data, &parse_result)?,
            _ => unreachable!(),
        };

        Ok(RunResult::new(output_format, action_results))
    }

    fn run_structured(
        self,
        diagnostic_data: Vec<DiagnosticData>,
        parse_result: ParseResult,
    ) -> Result<StructuredRunResult, Error> {
        let triage_output = analyze_structured(&diagnostic_data, &parse_result)?;

        Ok(StructuredRunResult { triage_output })
    }
}

/// The result of calling App::run.
pub struct RunResult {
    output_format: OutputFormat,
    action_results: ActionResults,
}

impl RunResult {
    /// Creates a new RunResult struct. This method is intended to be used by the
    /// App:run method.
    fn new(output_format: OutputFormat, action_results: ActionResults) -> RunResult {
        RunResult { output_format, action_results }
    }

    /// Returns true if at least one ActionResults has a warning or errorF.
    fn has_problems(&self) -> bool {
        !(self.action_results.warnings.is_empty() && self.action_results.errors.is_empty())
    }

    /// Writes the contents of the run to the provided writer.
    ///
    /// This method can be used to output the results to a file or stdout.
    pub fn write_report(&self, dest: &mut dyn std::io::Write) -> Result<(), Error> {
        if self.output_format != OutputFormat::Text
            && self.output_format != OutputFormat::VerboseText
        {
            bail!("BUG: Incorrect output format requested");
        }

        let results_formatter = ActionResultFormatter::new(&self.action_results);
        let output = results_formatter.to_string();
        dest.write_fmt(format_args!("{}", output)).context("failed to write to destination")?;
        Ok(())
    }
}

/// The result of calling App::run_structured.
pub struct StructuredRunResult {
    triage_output: TriageOutput,
}

impl StructuredRunResult {
    /// Writes the contents of the run_structured to the provided writer.
    ///
    /// This method can be used to output the results to a file or stdout.
    pub fn write_report(&self, dest: &mut dyn std::io::Write) -> Result<(), Error> {
        let output = serde_json::to_string(&self.triage_output)?;
        dest.write_fmt(format_args!("{}\n", output)).context("failed to write to destination")?;
        Ok(())
    }

    /// Returns true if the result contains a reportable warning, error, or significant Problem
    pub fn has_reportable_issues(&self) -> bool {
        self.triage_output.has_reportable_issues()
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    use fuchsia_triage::Action;

    #[fuchsia::test]
    fn test_output_text_no_warnings() -> Result<(), Error> {
        let action_results = ActionResults::new();
        let run_result = RunResult::new(OutputFormat::Text, action_results);

        let mut dest = vec![];
        run_result.write_report(&mut dest)?;

        let output = String::from_utf8(dest)?;
        assert_eq!("", output);

        Ok(())
    }

    #[fuchsia::test]
    fn test_output_text_with_alerts() -> Result<(), Error> {
        let mut action_results = ActionResults::new();
        action_results.infos.push("hmmm".to_string());
        action_results.warnings.push("oops".to_string());
        action_results.errors.push("fail".to_string());

        let readable_run_result = RunResult::new(OutputFormat::Text, action_results.clone());
        action_results.verbose = true;
        let verbose_run_result = RunResult::new(OutputFormat::VerboseText, action_results.clone());

        let mut readable_dest = vec![];
        readable_run_result.write_report(&mut readable_dest)?;
        let mut verbose_dest = vec![];
        verbose_run_result.write_report(&mut verbose_dest)?;

        let output = String::from_utf8(readable_dest)?;
        assert_eq!("Errors\n------\nfail\n\nWarnings\n--------\noops\n\n", output,);
        let output = String::from_utf8(verbose_dest)?;
        assert_eq!(
            "Errors\n------\nfail\n\nWarnings\n--------\noops\n\nInfo\n----\nhmmm\n\n",
            output,
        );

        Ok(())
    }

    #[fuchsia::test]
    fn test_output_text_with_gauges() -> Result<(), Error> {
        let mut action_results = ActionResults::new();
        action_results.gauges.push("gauge".to_string());
        let run_result = RunResult::new(OutputFormat::Text, action_results);

        let mut dest = vec![];
        run_result.write_report(&mut dest)?;

        let output = String::from_utf8(dest)?;
        assert_eq!("Featured Values\n---------------\ngauge\n\n", output);

        Ok(())
    }

    #[fuchsia::test]
    fn test_structured_output_no_warnings() -> Result<(), Error> {
        let triage_output = TriageOutput::new(Vec::new());
        let structured_run_result = StructuredRunResult { triage_output };

        let mut dest = vec![];
        structured_run_result.write_report(&mut dest)?;

        let output = String::from_utf8(dest)?;
        assert_eq!(
            "{\"actions\":{},\"metrics\":{},\"plugin_results\":{},\"triage_errors\":[]}\n",
            output
        );

        Ok(())
    }

    #[fuchsia::test]
    fn test_structured_output_with_warnings() -> Result<(), Error> {
        let mut triage_output = TriageOutput::new(vec!["file".to_string()]);
        triage_output.add_action(
            "file".to_string(),
            "warning_name".to_string(),
            Action::new_synthetic_warning("fail".to_string()),
        );
        let structured_run_result = StructuredRunResult { triage_output };

        let mut dest = vec![];
        structured_run_result.write_report(&mut dest)?;

        let output = String::from_utf8(dest)?;
        assert_eq!(
            "{\"actions\":{\"file\":{\"warning_name\":{\"type\":\"Alert\",\"trigger\":\
        {\"metric\":{\"Eval\":{\"raw_expression\":\"True()\",\"parsed_expression\":{\"Function\":\
        [\"True\",[]]}}},\"cached_value\":\
        {\"Bool\":true}},\"print\":\"fail\",\"file_bug\":null,\"tag\":null,\
         \"severity\":\"Warning\"}}},\"metrics\":\
        {\"file\":{}},\"plugin_results\":{},\"triage_errors\":[]}\n",
            output
        );

        Ok(())
    }

    #[fuchsia::test]
    fn test_structured_output_with_gauges() -> Result<(), Error> {
        let mut triage_output = TriageOutput::new(vec!["file".to_string()]);
        triage_output.add_action(
            "file".to_string(),
            "gauge_name".to_string(),
            Action::new_synthetic_string_gauge("gauge".to_string(), None, None),
        );
        let structured_run_result = StructuredRunResult { triage_output };

        let mut dest = vec![];
        structured_run_result.write_report(&mut dest)?;

        let output = String::from_utf8(dest)?;
        assert_eq!(
            "{\"actions\":{\"file\":{\"gauge_name\":{\"type\":\"Gauge\",\"value\":{\"metric\":\
            {\"Eval\":{\"raw_expression\":\"'gauge'\",\"parsed_expression\":{\"Value\":\
            {\"String\":\"gauge\"}}}},\"cached_value\":{\"String\":\"gauge\"}},\"format\":null,\
            \"tag\":null}}},\"metrics\":{\"file\":{}},\"plugin_results\":{},\"triage_errors\":[]}\n",
            output
        );

        Ok(())
    }
}
