// Copyright 2023 Harness, Inc.
//
// 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.

package types

import (
	"github.com/harness/gitness/types/enum"
)

type GitspaceConfig struct {
	ID                    int64                  `json:"-"`
	Identifier            string                 `json:"identifier"`
	Name                  string                 `json:"name"`
	IDE                   enum.IDEType           `json:"ide"`
	State                 enum.GitspaceStateType `json:"state"`
	SpaceID               int64                  `json:"-"`
	IsDeleted             bool                   `json:"-"`
	GitspaceInstance      *GitspaceInstance      `json:"instance"`
	SpacePath             string                 `json:"space_path"`
	Created               int64                  `json:"created"`
	Updated               int64                  `json:"updated"`
	SSHTokenIdentifier    string                 `json:"ssh_token_identifier"`
	InfraProviderResource InfraProviderResource  `json:"resource"`
	CodeRepo
	GitspaceUser
}

type CodeRepo struct {
	URL              string                    `json:"code_repo_url"`
	Ref              *string                   `json:"code_repo_ref"`
	Type             enum.GitspaceCodeRepoType `json:"code_repo_type"`
	Branch           string                    `json:"branch"`
	DevcontainerPath *string                   `json:"devcontainer_path,omitempty"`
	IsPrivate        bool                      `json:"code_repo_is_private"`
	AuthType         string                    `json:"-"`
	AuthID           string                    `json:"-"`
}

type GitspaceUser struct {
	ID          *int64 `json:"-"`
	Identifier  string `json:"user_id"`
	Email       string `json:"user_email"`
	DisplayName string `json:"user_display_name"`
}

type GitspaceInstance struct {
	ID               int64                          `json:"-"`
	GitSpaceConfigID int64                          `json:"-"`
	Identifier       string                         `json:"identifier"`
	URL              *string                        `json:"url,omitempty"`
	State            enum.GitspaceInstanceStateType `json:"state"`
	UserID           string                         `json:"-"`
	ResourceUsage    *string                        `json:"resource_usage"`
	LastUsed         int64                          `json:"last_used,omitempty"`
	TotalTimeUsed    int64                          `json:"total_time_used"`
	TrackedChanges   *string                        `json:"tracked_changes"`
	AccessKey        *string                        `json:"access_key,omitempty"`
	AccessType       enum.GitspaceAccessType        `json:"access_type"`
	AccessKeyRef     *string                        `json:"access_key_ref"`
	MachineUser      *string                        `json:"machine_user,omitempty"`
	SpacePath        string                         `json:"space_path"`
	SpaceID          int64                          `json:"-"`
	Created          int64                          `json:"created"`
	Updated          int64                          `json:"updated"`
}

type GitspaceFilter struct {
	QueryFilter    ListQueryFilter
	UserID         string
	SpaceIDs       []int64
	IncludeDeleted bool
}