package common

import (
	"time"
)

type PageInfo struct {
	TotalCount int
	ItemCount  int
}

type RepoInfo struct {
	Summary        RepoSummary
	ImageSummaries []ImageSummary `json:"images"`
}

type RepoSummary struct {
	Name          string       `json:"name"`
	LastUpdated   time.Time    `json:"lastUpdated"`
	Size          string       `json:"size"`
	Platforms     []Platform   `json:"platforms"`
	Vendors       []string     `json:"vendors"`
	IsStarred     bool         `json:"isStarred"`
	IsBookmarked  bool         `json:"isBookmarked"`
	StarCount     int          `json:"starCount"`
	DownloadCount int          `json:"downloadCount"`
	NewestImage   ImageSummary `json:"newestImage"`
}

type PaginatedImagesResult struct {
	Results []ImageSummary `json:"results"`
	Page    PageInfo       `json:"page"`
}

type ImageSummary struct {
	RepoName        string                    `json:"repoName"`
	Tag             string                    `json:"tag"`
	Digest          string                    `json:"digest"`
	MediaType       string                    `json:"mediaType"`
	Manifests       []ManifestSummary         `json:"manifests"`
	Size            string                    `json:"size"`
	DownloadCount   int                       `json:"downloadCount"`
	LastUpdated     time.Time                 `json:"lastUpdated"`
	Description     string                    `json:"description"`
	IsSigned        bool                      `json:"isSigned"`
	Licenses        string                    `json:"licenses"`
	Labels          string                    `json:"labels"`
	Title           string                    `json:"title"`
	Source          string                    `json:"source"`
	Documentation   string                    `json:"documentation"`
	Authors         string                    `json:"authors"`
	Vendor          string                    `json:"vendor"`
	Vulnerabilities ImageVulnerabilitySummary `json:"vulnerabilities"`
	Referrers       []Referrer                `json:"referrers"`
}

type ManifestSummary struct {
	Digest          string                    `json:"digest"`
	ConfigDigest    string                    `json:"configDigest"`
	LastUpdated     time.Time                 `json:"lastUpdated"`
	Size            string                    `json:"size"`
	Platform        Platform                  `json:"platform"`
	IsSigned        bool                      `json:"isSigned"`
	DownloadCount   int                       `json:"downloadCount"`
	Layers          []LayerSummary            `json:"layers"`
	History         []LayerHistory            `json:"history"`
	Vulnerabilities ImageVulnerabilitySummary `json:"vulnerabilities"`
	Referrers       []Referrer                `json:"referrers"`
	ArtifactType    string                    `json:"artifactType"`
}

type Platform struct {
	Os      string `json:"os"`
	Arch    string `json:"arch"`
	Variant string `json:"variant"`
}

type ImageVulnerabilitySummary struct {
	MaxSeverity string `json:"maxSeverity"`
	Count       int    `json:"count"`
}

type LayerSummary struct {
	Size   string `json:"size"`
	Digest string `json:"digest"`
	Score  int    `json:"score"`
}

type LayerHistory struct {
	Layer              LayerSummary       `json:"layer"`
	HistoryDescription HistoryDescription `json:"historyDescription"`
}

type HistoryDescription struct {
	Created    time.Time `json:"created"`
	CreatedBy  string    `json:"createdBy"`
	Author     string    `json:"author"`
	Comment    string    `json:"comment"`
	EmptyLayer bool      `json:"emptyLayer"`
}

type Referrer struct {
	MediaType    string       `json:"mediatype"`
	ArtifactType string       `json:"artifacttype"`
	Size         int          `json:"size"`
	Digest       string       `json:"digest"`
	Annotations  []Annotation `json:"annotations"`
}

type Annotation struct {
	Key   string `json:"key"`
	Value string `json:"value"`
}

type ImageListWithCVEFixedResponse struct {
	Errors                []ErrorGQL `json:"errors"`
	ImageListWithCVEFixed `json:"data"`
}

type ImageListWithCVEFixed struct {
	PaginatedImagesResult `json:"ImageListWithCVEFixed"` //nolint:tagliatelle // graphQL schema
}

type ImagesForCve struct {
	Errors           []ErrorGQL `json:"errors"`
	ImagesForCVEList `json:"data"`
}

type ImagesForCVEList struct {
	PaginatedImagesResult `json:"ImageListForCVE"` //nolint:tagliatelle // graphQL schema
}

type ImagesForDigest struct {
	Errors              []ErrorGQL `json:"errors"`
	ImagesForDigestList `json:"data"`
}

type ImagesForDigestList struct {
	PaginatedImagesResult `json:"ImageListForDigest"` //nolint:tagliatelle // graphQL schema
}

type RepoWithNewestImageResponse struct {
	RepoListWithNewestImage `json:"data"`
	Errors                  []ErrorGQL `json:"errors"`
}

type DerivedImageListResponse struct {
	DerivedImageList `json:"data"`
	Errors           []ErrorGQL `json:"errors"`
}

type BaseImageListResponse struct {
	BaseImageList `json:"data"`
	Errors        []ErrorGQL `json:"errors"`
}

type DerivedImageList struct {
	PaginatedImagesResult `json:"derivedImageList"`
}

type BaseImageList struct {
	PaginatedImagesResult `json:"baseImageList"`
}

type ImageListResponse struct {
	ImageList `json:"data"`
	Errors    []ErrorGQL `json:"errors"`
}

type ImageList struct {
	PaginatedImagesResult `json:"imageList"`
}

type ExpandedRepoInfoResp struct {
	ExpandedRepoInfo `json:"data"`
	Errors           []ErrorGQL `json:"errors"`
}

type ReferrersResp struct {
	ReferrersResult `json:"data"`
	Errors          []ErrorGQL `json:"errors"`
}

type ReferrersResult struct {
	Referrers []Referrer `json:"referrers"`
}
type GlobalSearchResultResp struct {
	GlobalSearchResult `json:"data"`
	Errors             []ErrorGQL `json:"errors"`
}

type GlobalSearchResult struct {
	GlobalSearch `json:"globalSearch"`
}

type GlobalSearch struct {
	Images []ImageSummary `json:"images"`
	Repos  []RepoSummary  `json:"repos"`
	Layers []LayerSummary `json:"layers"`
	Page   PageInfo       `json:"page"`
}

type ExpandedRepoInfo struct {
	RepoInfo `json:"expandedRepoInfo"`
}

type PaginatedReposResult struct {
	Results []RepoSummary `json:"results"`
	Page    PageInfo      `json:"page"`
}

//nolint:tagliatelle // graphQL schema
type RepoListWithNewestImage struct {
	PaginatedReposResult `json:"RepoListWithNewestImage"`
}

type ErrorGQL struct {
	Message string   `json:"message"`
	Path    []string `json:"path"`
}

type SingleImageSummary struct {
	ImageSummary `json:"Image"` //nolint:tagliatelle
}
type ImageSummaryResult struct {
	SingleImageSummary `json:"data"`
	Errors             []ErrorGQL `json:"errors"`
}

//nolint:tagliatelle // graphQL schema
type StarredRepos struct {
	PaginatedReposResult `json:"StarredRepos"`
}

//nolint:tagliatelle // graphQL schema
type BookmarkedRepos struct {
	PaginatedReposResult `json:"BookmarkedRepos"`
}

type StarredReposResponse struct {
	StarredRepos `json:"data"`
	Errors       []ErrorGQL `json:"errors"`
}

type BookmarkedReposResponse struct {
	BookmarkedRepos `json:"data"`
	Errors          []ErrorGQL `json:"errors"`
}
