// 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.

package fidlgen

import (
	"fmt"
	"regexp"
	"strings"
)

// LibraryName represents a FIDL library name, such as `fuchsia.mem` or
// `fuchsia.ui.scenic`.
type LibraryName struct {
	fqn string
}

func (name LibraryName) String() string {
	return name.fqn
}

// Parts returns the library name in parts, e.g. `fuchsia`, `mem` or
// `fuchsia`, `ui`, `scenic`.
func (name LibraryName) Parts() []string {
	return strings.Split(name.fqn, ".")
}

// FullyQualifiedName returns the fully qualified name, e.g. `fuchsia.mem` or
// `fuchsia.ui.scenic`.
//
// See https://fuchsia.dev/fuchsia-src/development/languages/fidl/reference/ftp/ftp-043#fully_qualified_names
func (name LibraryName) FullyQualifiedName() string {
	return name.fqn
}

// Name represents a FIDL declaration name, consisting of a FIDL library, and
// a FIDL declration such as `fuchsia.mem` and `Buffer`.
type Name struct {
	libraryName LibraryName
	declName    string
}

func (name Name) String() string {
	return fmt.Sprintf("%s/%s", name.libraryName, name.declName)
}

// LibraryName returns the library name, e.g. `fuchsia.mem`.
func (name Name) LibraryName() LibraryName {
	return name.libraryName
}

// DeclarationName returns the declaration name, e.g. `Buffer`.
func (name Name) DeclarationName() string {
	return name.declName
}

// FullyQualifiedName returns the fully qualified name, e.g. `fuchsia.mem/Buffer`.
//
// See https://fuchsia.dev/fuchsia-src/development/languages/fidl/reference/ftp/ftp-043#fully_qualified_names
func (name Name) FullyQualifiedName() string {
	return fmt.Sprintf("%s/%s", name.libraryName.fqn, name.declName)
}

var checkLibraryName = regexp.MustCompile("^[a-z][a-z0-9]*(\\.[a-z][a-z0-9]*)*$")

// ReadLibraryName reads a library name from a fully qualified name.
//
// See https://fuchsia.dev/fuchsia-src/development/languages/fidl/reference/ftp/ftp-043#fully_qualified_names
func ReadLibraryName(fullyQualifiedName string) (LibraryName, error) {
	if !checkLibraryName.MatchString(fullyQualifiedName) {
		return LibraryName{}, fmt.Errorf("invalid library name: %s", fullyQualifiedName)
	}
	return LibraryName{fullyQualifiedName}, nil
}

// MustReadLibraryName reads a library name from a fully qualified name, and
// panics in case of error.
//
// See https://fuchsia.dev/fuchsia-src/development/languages/fidl/reference/ftp/ftp-043#fully_qualified_names
func MustReadLibraryName(fullyQualifiedName string) LibraryName {
	name, err := ReadLibraryName(fullyQualifiedName)
	if err != nil {
		panic(err)
	}
	return name
}

// ReadName reads a name from a fully qualified name.
//
// See https://fuchsia.dev/fuchsia-src/development/languages/fidl/reference/ftp/ftp-043#fully_qualified_names
func ReadName(fullyQualifiedName string) (Name, error) {
	parts := strings.Split(fullyQualifiedName, "/")
	if len(parts) != 2 {
		return Name{}, fmt.Errorf("expected a fully qualified name library.name/DeclarationName, found %s", fullyQualifiedName)
	}
	libraryName, err := ReadLibraryName(parts[0])
	if err != nil {
		return Name{}, err
	}
	return Name{
		libraryName: libraryName,
		declName:    parts[1],
	}, nil
}

// MustReadName reads a name from a fully qualified name, and panics in case of
// error.
//
// See https://fuchsia.dev/fuchsia-src/development/languages/fidl/reference/ftp/ftp-043#fully_qualified_names
func MustReadName(fullyQualifiedName string) Name {
	name, err := ReadName(fullyQualifiedName)
	if err != nil {
		panic(err)
	}
	return name
}
