// Copyright 2019 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::file_io::{config_from_files, diagnostics_from_directory},
    crate::Options,
    anyhow::{bail, format_err, Error},
    fuchsia_triage::{ActionTagDirective, DiagnosticData, ParseResult},
    std::{path::Path, str::FromStr},
};

// TODO(https://fxbug.dev/42127533): Add support for CSV.
#[derive(Debug, PartialEq, Clone)]
pub enum OutputFormat {
    Structured,
    Text,
    VerboseText,
}

impl FromStr for OutputFormat {
    type Err = anyhow::Error;
    fn from_str(output_format: &str) -> Result<Self, Self::Err> {
        match output_format {
            "structured" => Ok(OutputFormat::Structured),
            "text" => Ok(OutputFormat::Text),
            "verbose-text" => Ok(OutputFormat::VerboseText),
            incorrect => Err(format_err!(
                "Invalid output type '{}' - must be 'text' or 'verbose-text' or 'structured",
                incorrect
            )),
        }
    }
}

/// Complete program execution context.
pub struct ProgramStateHolder {
    pub parse_result: ParseResult,
    pub diagnostic_data: Vec<DiagnosticData>,
    pub output_format: OutputFormat,
}

/// Parses the inspect.json file and all the config files.
pub fn initialize(options: Options) -> Result<ProgramStateHolder, Error> {
    let Options { data_directory, output_format, config_files, tags, exclude_tags } = options;

    if config_files.len() == 0 {
        bail!("Need at least one config file; use --config");
    }

    let parse_result =
        config_from_files(&config_files, &ActionTagDirective::from_tags(tags, exclude_tags))?;
    parse_result.validate()?;

    let diagnostic_data = diagnostics_from_directory(&Path::new(&data_directory))?;

    Ok(ProgramStateHolder { parse_result, diagnostic_data, output_format })
}

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

    #[fuchsia::test]
    fn output_format_from_string() -> Result<(), Error> {
        assert_eq!(OutputFormat::from_str("text")?, OutputFormat::Text);
        assert_eq!(OutputFormat::from_str("verbose-text")?, OutputFormat::VerboseText);
        assert_eq!(OutputFormat::from_str("structured")?, OutputFormat::Structured);
        assert!(OutputFormat::from_str("").is_err(), "Should have returned 'Err' on ''");
        assert!(OutputFormat::from_str("CSV").is_err(), "Should have returned 'Err' on 'CSV'");
        assert!(OutputFormat::from_str("Text").is_err(), "Should have returned 'Err' on 'Text'");
        assert!(OutputFormat::from_str("verbose_text").is_err(), "Should reject underscore");
        assert!(
            OutputFormat::from_str("GARBAGE").is_err(),
            "Should have returned 'Err' on 'GARBAGE'"
        );
        Ok(())
    }
}
