// Copyright 2022 The Pigweed Authors
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
//     https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.

use std::{
    cell::{Ref, RefCell},
    ffi::OsStr,
    path::{Path, PathBuf},
};

use crate::{registry::Registry, target::Provider};
use crate::{Error, Result};
use manifest::Manifest;

pub mod file;
pub(crate) mod manifest;

#[doc(inline)]
pub use file::File;

/// A `qg`-based project.
#[derive(Debug)]
pub struct Project {
    root: PathBuf,
    cache_dir: PathBuf,
    name: String,
    // Use a RefCell to provide interior mutability on the registry so that it can
    // be lazily loaded without taking a mutable reference on the Project.
    registry: RefCell<Option<Registry>>,
}

impl Project {
    const MANIFEST_FILE: &str = "qg.toml";
    const CACHE_DIRECTORY: &str = "qg-cache";

    /// Checks if a project name is valid.
    ///
    /// Names may consist of unicode letters or numbers, hyphens, and underscores.
    #[must_use]
    pub fn name_is_valid(name: &str) -> bool {
        !name.is_empty()
            && name
                .chars()
                .all(|c| c.is_alphanumeric() || c == '-' || c == '_')
    }

    /// Searches for a qg project in the current directory and its ancestors.
    ///
    /// # Errors
    /// May return one of the following errors:
    /// - [`Error::File`]: Failed to access the filesystem.
    /// - [`Error::ProjectNotFound`]: No project could be located.
    pub fn locate() -> Result<Self> {
        let cwd = std::env::current_dir()?;
        let mut cwd = cwd.as_path();

        let project_root = loop {
            if cwd.join(Self::MANIFEST_FILE).exists() {
                break cwd;
            }

            cwd = match cwd.parent() {
                Some(p) => p,
                None => return Err(Error::ProjectNotFound),
            }
        };

        let manifest = self::File::new(project_root.join(Self::MANIFEST_FILE))
            .deserialize_toml::<Manifest>()?;

        Ok(Self {
            root: project_root.to_owned(),
            cache_dir: project_root.join(Self::CACHE_DIRECTORY),
            name: manifest.project.name,
            registry: RefCell::new(None),
        })
    }

    /// Initializes a new project at the specified `root`.
    ///
    /// # Errors
    /// Returns an error if the root directory does not exist or is
    /// inaccessible.
    ///
    /// # Panics
    /// Temporarily panics if a project already exists within `root` as
    /// subprojects are not yet supported.
    pub fn create(root: &Path, name: &str) -> Result<Self> {
        let parent_project = match Self::locate() {
            Ok(p) => Some(p),
            Err(Error::ProjectNotFound) => None,
            Err(e) => return Err(e),
        };

        // TODO(frolv): Initialize a new subproject in an existing project.
        assert!(parent_project.is_none(), "subprojects not yet supported");

        if !Self::name_is_valid(name) {
            return Err(Error::InvalidName(name.into()));
        }

        let project = Self {
            root: root.to_owned(),
            cache_dir: root.join(Self::CACHE_DIRECTORY),
            name: name.into(),
            registry: RefCell::new(None),
        };

        let manifest = Manifest::new(name);
        project.root_manifest().serialize_toml(&manifest)?;

        Ok(project)
    }

    /// Returns the root directory of the project.
    #[must_use]
    pub fn root(&self) -> &Path {
        &self.root
    }

    /// Returns the name of the project.
    #[must_use]
    pub fn name(&self) -> &str {
        &self.name
    }

    /// Returns a [`File`](self::File) representing some configuration file located
    /// at `path` within the project directory.
    ///
    /// # Errors
    /// Returns an [`Error::InvalidPath`] if the provided path is absolute.
    pub fn file(&self, path: impl AsRef<OsStr>) -> Result<self::File> {
        Self::relative_file(&self.root, Path::new(path.as_ref()))
    }

    /// Returns a [`File`](self::File) representing some file located at `path`
    /// within the project's cache directory.
    ///
    /// # Errors
    /// Returns an [`Error::InvalidPath`] if the provided path is absolute.
    pub fn cache_file(&self, path: impl AsRef<OsStr>) -> Result<self::File> {
        Self::relative_file(&self.cache_dir, Path::new(path.as_ref()))
    }

    /// Returns the target registry for this project.  Will locate and parse
    /// manifests if they have not already been read.
    ///
    /// # Errors
    /// Returns an error if manifest files could not be read or are improperly
    /// structured.
    pub fn registry(&self) -> Result<Ref<Registry>> {
        {
            // Scope the mutable borrow to just the existence check and
            // manifest parsing.
            let mut registry = self.registry.borrow_mut();
            if registry.is_none() {
                *registry = Some(self.parse_manifests()?);
            }
        }

        Ok(Ref::map(self.registry.borrow(), |registry| {
            registry
                .as_ref()
                .expect("registry should be valid due to being created above")
        }))
    }

    /// Reads `qg` manifest files starting from the project root into a registry
    /// of available packages.
    ///
    /// # Errors
    /// Returns an error if manifest files could not be read or are improperly
    /// structured.
    fn parse_manifests(&self) -> Result<Registry> {
        let root_manifest_file = self.root_manifest();
        let root_manifest = root_manifest_file.deserialize_toml::<Manifest>()?;
        let mut registry = Registry::new();

        let project_provider = Provider::new(
            &root_manifest.project.name,
            root_manifest_file.path(),
            false,
        );
        registry.add_provider(project_provider)?;

        for (name, target) in root_manifest.targets {
            registry.add_target(crate::Target::from_manifest(
                &name,
                &root_manifest.project.name,
                target.namespace.is_global(),
                target,
            )?)?;
        }

        for (provider, desc) in &root_manifest.providers {
            if let Some(manifest) = &desc.manifest {
                let provider_file = root_manifest_file.relative_file(manifest);

                let provider_data = provider_file.deserialize_toml::<manifest::ProviderFile>()?;
                let global_provider = if let Some(desc) = &provider_data.provider {
                    desc.namespace.is_global()
                } else {
                    false
                };

                registry.add_provider(Provider::new(
                    provider,
                    provider_file.path(),
                    global_provider,
                ))?;

                for (name, target) in provider_data.targets {
                    registry.add_target(crate::Target::from_manifest(
                        &name,
                        provider,
                        global_provider || target.namespace.is_global(),
                        target,
                    )?)?;
                }
            }
        }

        Ok(registry)
    }

    fn root_manifest(&self) -> self::File {
        self.file(Self::MANIFEST_FILE)
            .expect("manifest path is not absolute")
    }

    fn relative_file(root: &Path, path: &Path) -> Result<self::File> {
        if !path.as_os_str().is_empty() && !path.is_absolute() {
            Ok(self::File::new(root.join(path)))
        } else {
            Err(Error::InvalidPath)
        }
    }
}

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

    #[test]
    fn name_is_valid_valid() {
        assert!(Project::name_is_valid("qg"));
        assert!(Project::name_is_valid("my-project"));
        assert!(Project::name_is_valid("my_other_project"));
        assert!(Project::name_is_valid("мой-проект"));
    }

    #[test]
    fn name_is_valid_invalid() {
        assert!(!Project::name_is_valid(""));
        assert!(!Project::name_is_valid("project!"));
        assert!(!Project::name_is_valid("💩"));
    }

    #[test]
    fn file_valid_path() {
        let root = PathBuf::from("/qg");
        let project = Project {
            cache_dir: root.join("qg-cache"),
            root,
            name: "qg2".into(),
            registry: RefCell::new(None),
        };

        assert_eq!(
            project.file("emoji.json").unwrap().path(),
            Path::new("/qg/emoji.json")
        );
        assert_eq!(
            project.file("secrets/nuclear_codes.toml").unwrap().path(),
            Path::new("/qg/secrets/nuclear_codes.toml")
        );
        assert_eq!(
            project.cache_file("downloads.xml").unwrap().path(),
            Path::new("/qg/qg-cache/downloads.xml")
        );
    }

    #[test]
    fn file_invalid_path() {
        let root = PathBuf::from("/qg");
        let project = Project {
            cache_dir: root.join("qg-cache"),
            root,
            name: "qg2".into(),
            registry: RefCell::new(None),
        };

        assert!(matches!(
            project.file("/bin").unwrap_err(),
            Error::InvalidPath,
        ));
        assert!(matches!(
            project.cache_file("/").unwrap_err(),
            Error::InvalidPath,
        ));
        assert!(matches!(project.file("").unwrap_err(), Error::InvalidPath));
        assert!(matches!(
            project.cache_file("").unwrap_err(),
            Error::InvalidPath,
        ));
    }
}
