// Copyright 2020 Google Inc. All Rights Reserved.
//
// 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
//
//     http://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.

// This package contains the error interface returned by changelog and
// findbuild packages. It includes functions to retrieve HTTP status codes
// from Gerrit and Gitiles errors, and functions to create ChangelogErrors
// relevant to the changelog and findbuild features.

package utils

import (
	"errors"
	"fmt"
	"regexp"

	"google.golang.org/grpc/codes"
	"google.golang.org/grpc/status"
)

var (
	grpcCodeToHTTP = map[string]string{
		codes.Unknown.String():            "500",
		codes.InvalidArgument.String():    "400",
		codes.NotFound.String():           "404",
		codes.PermissionDenied.String():   "403",
		codes.Unauthenticated.String():    "401",
		codes.ResourceExhausted.String():  "429",
		codes.FailedPrecondition.String(): "400",
		codes.OutOfRange.String():         "400",
		codes.Internal.String():           "500",
		codes.Unavailable.String():        "503",
		codes.DataLoss.String():           "500",
	}

	// ChangeIDUnsupported returns a ChangelogError object for findbuild indicating an
	// invalid CL identifier was provided for findbuild
	ChangeIDUnsupported = &UtilChangelogError{
		httpCode: "400",
		header:   "Change-ID Not Supported",
		err:      "Change-ID is not a supported input format. Please enter either a CL-number (example: 3206) or a Commit-SHA (example: I7e549d7753cc7acec2b44bb5a305347a97719ab9) for a submitted CL.",
	}

	// ForbiddenError is a ChangelogError object indicating the user does not have
	// permission to access a resource
	ForbiddenError = &UtilChangelogError{
		httpCode: "403",
		header:   "No Access",
		err:      "This account does not have access to internal repositories. Please retry with an authorized account, or select the external button to query from publically accessible sources.",
	}

	// InternalServerError is a ChangelogError object indicating an internal error
	InternalServerError = &UtilChangelogError{
		httpCode: "500",
		header:   "Internal Server Error",
		err:      "An unexpected error occurred while retrieving the requested information.",
	}

	gitiles403ErrMsg = "unexpected HTTP 403 from Gitiles"
	gerritErrCodeRe  = regexp.MustCompile("status code\\s*(\\d+)")
)

// ChangelogError is the error type used by the changelog and findbuild package
type ChangelogError interface {
	error
	HTTPCode() string
	Header() string
	HTMLError() string
}

// UtilChangelogError implements the ChangelogError interface
type UtilChangelogError struct {
	httpCode string
	header   string
	err      string
	htmlErr  string
}

// HTTPCode retrieves the HTTP error code associated with the error
// ex. 400
func (e *UtilChangelogError) HTTPCode() string {
	return e.httpCode
}

// Header retrieves the full HTTP status associated with the error
// ex. 400 Bad Request
func (e *UtilChangelogError) Header() string {
	return e.header
}

// Error returns the error string
func (e *UtilChangelogError) Error() string {
	return e.err
}

// HTMLError returns an HTML version of the error string
func (e *UtilChangelogError) HTMLError() string {
	if e.htmlErr != "" {
		return e.htmlErr
	}
	return e.Error()
}

func unwrapError(err error) error {
	innerErr := err
	for errors.Unwrap(innerErr) != nil {
		innerErr = errors.Unwrap(innerErr)
	}
	return innerErr
}

// BuildNotFound returns a ChangelogError object for changelog indicating
// the desired build could not be found
func BuildNotFound(buildNumber string) *UtilChangelogError {
	return &UtilChangelogError{
		httpCode: "404",
		header:   "Build Not Found",
		err:      fmt.Sprintf("Build number %s not found. Please input a valid build number (example: 13310.1035.0).", buildNumber),
	}
}

func clLink(clID, instanceURL string) string {
	return fmt.Sprintf("<a href=\"%s/q/%s\" target=\"_blank\">CL %s</a>", instanceURL, clID, clID)
}

// CLNotFound returns a ChangelogError object for findbuild indicating the provided
// CL could not be found
func CLNotFound(clID string) *UtilChangelogError {
	return &UtilChangelogError{
		httpCode: "404",
		header:   "CL Not Found",
		err:      fmt.Sprintf("CL/Commit-SHA %s not found. Please enter either the CL-number (example: 3206) or a Commit-SHA (example: I7e549d7753cc7acec2b44bb5a305347a97719ab9) of a submitted CL.", clID),
	}
}

// CLLandingNotFound returns a ChangelogError object for findbuild indicating
// no build was found containing a CL
func CLLandingNotFound(clID, instanceURL string) *UtilChangelogError {
	errStrFmt := "No build was found containing %s."
	link := clLink(clID, instanceURL)
	return &UtilChangelogError{
		httpCode: "404",
		header:   "No Build Found",
		err:      fmt.Sprintf(errStrFmt, "CL "+clID),
		htmlErr:  fmt.Sprintf(errStrFmt, link),
	}
}

// CLNotUsed returns a ChangelogError object for findbuild indicating
// that the repository and branch associated with a CL was not found in any
// manifest files
func CLNotUsed(clID, repo, branch, instanceURL string) *UtilChangelogError {
	errStrFmt := "%s modifies the %s repository on the %s branch, which was not used by builds near its submission time."
	link := clLink(clID, instanceURL)
	return &UtilChangelogError{
		httpCode: "406",
		header:   "CL Not Used",
		err:      fmt.Sprintf(errStrFmt, "CL "+clID, repo, branch),
		htmlErr:  fmt.Sprintf(errStrFmt, link, repo, branch),
	}
}

// CLTooRecent returns a ChangelogError object for findbuild indicating the provided
// CL could not be found
func CLTooRecent(clID, instanceURL string) *UtilChangelogError {
	errStrFmt := "%s was submitted too recently to be included in any builds. Please wait a couple hours and try again."
	link := clLink(clID, instanceURL)
	return &UtilChangelogError{
		httpCode: "406",
		header:   "CL Too Recent",
		err:      fmt.Sprintf(errStrFmt, "CL "+clID),
		htmlErr:  fmt.Sprintf(errStrFmt, link),
	}
}

// CLNotSubmitted returns a ChangelogError object for findbuild indicating
// that the provided CL has not been submitted
func CLNotSubmitted(clID, instanceURL string) *UtilChangelogError {
	errStrFmt := "%s has not been submitted yet. A CL will not enter any build until it is successfully submitted."
	link := clLink(clID, instanceURL)
	return &UtilChangelogError{
		httpCode: "406",
		header:   "CL Not Submitted",
		err:      fmt.Sprintf(errStrFmt, "CL "+clID),
		htmlErr:  fmt.Sprintf(errStrFmt, link),
	}
}

// CLInvalidRelease returns a ChangelogError object for findbuild indicating
// that the branch a CL was submitted in was not recognized as a release branch
func CLInvalidRelease(clID, release, instanceURL string) *UtilChangelogError {
	errStrFmt := "%s maps to release %s, which is not a valid release"
	link := clLink(clID, instanceURL)
	return &UtilChangelogError{
		httpCode: "406",
		header:   "Invalid Release Branch",
		err:      fmt.Sprintf(errStrFmt, "CL "+clID, release),
		htmlErr:  fmt.Sprintf(errStrFmt, link, release),
	}
}

// GitilesErrCode parses a Gitiles error message and returns an HTTP error code
// associated with the error. Returns 500 if no error code is found.
func GitilesErrCode(err error) string {
	err = unwrapError(err)
	rpcStatus, ok := status.FromError(err)
	if !ok {
		return "500"
	}
	code, text := rpcStatus.Code(), rpcStatus.Message()
	// RPC status code misclassifies 403 error as 500 error for Gitiles requests
	if code == codes.Internal && text == gitiles403ErrMsg {
		code = codes.PermissionDenied
	}
	if httpCode, ok := grpcCodeToHTTP[code.String()]; ok {
		return httpCode
	}
	return "500"
}

// GerritErrCode parse a Gerrit error and returns an HTTP error code associated
// with the error. Returns 500 if no error code is found.
func GerritErrCode(err error) string {
	err = unwrapError(err)
	matches := gerritErrCodeRe.FindStringSubmatch(err.Error())
	if len(matches) != 2 {
		return "500"
	}
	return matches[1]
}
