// Copyright 2021 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 anyhow::{format_err, Result};
use regex::Regex;
use std::fs::File;
use std::io::{BufRead, BufReader};
use std::path::PathBuf;

/// Parses VDL Output to get Emulator PID
pub fn get_emu_pid(vdl_output: &PathBuf) -> Result<u32> {
    let reader = BufReader::new(File::open(vdl_output)?);
    let emu_process = Regex::new(r#"\s+name:\s+"Emulator"$"#).unwrap();
    let pid = Regex::new(r"\s+pid:\s+(?P<id>\d+)$").unwrap();

    let mut found_emu = false;
    let mut emu_pid = 0;
    for line in reader.lines() {
        if let Ok(l) = line {
            if !found_emu && emu_process.is_match(&l) {
                found_emu = true;
                continue;
            }
            if found_emu {
                pid.captures(&l).and_then(|cap| {
                    cap.name("id").map(|id| emu_pid = id.as_str().parse::<u32>().unwrap())
                });
                if emu_pid == 0 {
                    break;
                }
                return Ok(emu_pid);
            }
        }
    }
    return Err(format_err!(
        "Cannot parse --vdl-output {} to obtain emulator PID",
        vdl_output.display()
    ));
}

#[cfg(test)]
mod tests {
    use super::*;
    use std::io::Write;
    use tempfile::Builder;

    #[test]
    fn test_parse_valid() -> Result<()> {
        let data = format!(
            r#"device_info:  {{
                base_dir:  "/tmp/launcher274142475"
                ports:  {{
                  name:  "ssh"
                  value:  57306
                }}
                ports:  {{
                  name:  "emulatorController"
                  value:  43143
                }}
                processes:  {{
                  name:  "Emulator"
                  pid:  1454638
                }}
                processes:  {{
                  name:  "PackageServer"
                  pid:  1454949
                }}
                device_type:  "workstation_qemu-x64"
              }}
              network_address:  "localhost"
              "#,
        );
        let tmp_dir = Builder::new().prefix("vdl_proto_test_").tempdir()?;
        let vdl_out = tmp_dir.path().join("vdl_output");
        File::create(&vdl_out)?.write_all(data.as_bytes())?;
        let pid = get_emu_pid(&vdl_out)?;
        assert_eq!(pid, 1454638);

        Ok(())
    }

    #[test]
    fn test_parse_error() -> Result<()> {
        let data = format!(
            r#"device_info:  {{
                base_dir:  "/tmp/launcher274142475"
                ports:  {{
                  name:  "ssh"
                  value:
                }}
                ports:  {{
                  name:  "emulatorController"
                  value:  43143
                }}
                processes:  {{
                  name:  "Emulator"
                  pid:
                }}
                processes:  {{
                  name:  "PackageServer"
                  pid:  1454949
                }}
                device_type:  "workstation_qemu-x64"
              }}
              network_address:  "localhost"
              "#,
        );
        let tmp_dir = Builder::new().prefix("vdl_proto_test_").tempdir()?;
        let vdl_out = tmp_dir.path().join("vdl_output");
        File::create(&vdl_out)?.write_all(data.as_bytes())?;
        let pid = get_emu_pid(&vdl_out);
        assert_eq!(pid.is_err(), true);

        Ok(())
    }
    #[test]
    fn test_parse_no_emu() -> Result<()> {
        let data = format!(
            r#"device_info:  {{
                base_dir:  "/tmp/launcher274142475"
                ports:  {{
                  name:  "emulatorController"
                  value:  43143
                }}
                processes:  {{
                  name:  "PackageServer"
                  pid:  1454949
                }}
                device_type:  "workstation_qemu-x64"
              }}
              network_address:  "localhost"
              "#,
        );
        let tmp_dir = Builder::new().prefix("vdl_proto_test_").tempdir()?;
        let vdl_out = tmp_dir.path().join("vdl_output");
        File::create(&vdl_out)?.write_all(data.as_bytes())?;
        let pid = get_emu_pid(&vdl_out);
        assert_eq!(pid.is_err(), true);

        Ok(())
    }
}
