package jump

type (
	AuthorizationPhase string
	JumpPrivilege      string
	JumpExpiration     string
	JumpMethod         string
)

// Enums
// Update value list `XXXValues` when update a enum
const (
	AuthorizationPhaseInitialized AuthorizationPhase = "initialized"
	AuthorizationPhaseApproving   AuthorizationPhase = "approving"
	AuthorizationPhaseCreating    AuthorizationPhase = "creating"
	AuthorizationPhaseCreated     AuthorizationPhase = "created"
	AuthorizationPhaseExpired     AuthorizationPhase = "expired"
	AuthorizationPhaseNotApproved AuthorizationPhase = "notapproved"
	AuthorizationPhaseCanceled    AuthorizationPhase = "canceled"

	JumpPrivilegeReadOnly  JumpPrivilege = "read_only"
	JumpPrivilegeReadWrite JumpPrivilege = "read_write"
	JumpPrivilegeAdmin     JumpPrivilege = "admin"

	JumpExpiration1Hour  JumpExpiration = "1h"
	JumpExpiration3Hour  JumpExpiration = "3h"
	JumpExpiration6Hour  JumpExpiration = "6h"
	JumpExpiration12Hour JumpExpiration = "12h"
	JumpExpiration24Hour JumpExpiration = "24h"
	JumpExpiration3Day   JumpExpiration = "3d"
	JumpExpiration7Day   JumpExpiration = "7d"
	JumpExpiration30Day  JumpExpiration = "30d"

	JumpMethodUnspecified JumpMethod = "unspecified"
	JumpMethodK8s         JumpMethod = "k8s"
	JumpMethodTailscale   JumpMethod = "tailscale"
)

var (
	AuthorizationPhaseValues = []AuthorizationPhase{
		AuthorizationPhaseInitialized,
		AuthorizationPhaseApproving, AuthorizationPhaseCreating, AuthorizationPhaseCreated,
		AuthorizationPhaseExpired, AuthorizationPhaseNotApproved,
		AuthorizationPhaseCanceled,
	}
	AuthorizationPhaseFinishedValues = []AuthorizationPhase{
		AuthorizationPhaseNotApproved, AuthorizationPhaseCanceled, AuthorizationPhaseExpired,
	}

	JumpPrivilegeValues = []JumpPrivilege{
		JumpPrivilegeReadOnly, JumpPrivilegeReadWrite, JumpPrivilegeAdmin,
	}

	JumpExpirationValues = []JumpExpiration{
		JumpExpiration1Hour, JumpExpiration3Hour,
		JumpExpiration6Hour, JumpExpiration12Hour,
		JumpExpiration24Hour, JumpExpiration3Day,
		JumpExpiration7Day, JumpExpiration30Day,
	}

	JumpMethodValues = []JumpMethod{
		JumpMethodUnspecified, JumpMethodK8s, JumpMethodTailscale,
	}
)

type JumpK8sAttributes struct {
	Context             string `json:"context"`
	TokenExpireAt       int64  `json:"token_expire_at"` // jump token expire time, zero means no expire
	EnableGatewayAccess bool   `json:"enable_gateway_access,omitempty"`
}

type JumpTailscaleAttributes struct {
	User        string `json:"user"`
	SrcHostname string `json:"src_hostname"`
	SrcIP       string `json:"src_ip"`
	DstHostname string `json:"dst_hostname"`
	DstIP       string `json:"dst_ip"`
}

type JumpAttributes struct {
	K8s       *JumpK8sAttributes       `json:"k8s,omitempty"`
	Tailscale *JumpTailscaleAttributes `json:"tailscale,omitempty"`
}

type Jump struct {
	ID              uint64            `json:"id"`
	DestinationType DestinationType   `json:"destination_type"` // output only
	Destination     *DestinationUnion `json:"destination"`
	Method          JumpMethod        `json:"method"`
	Attributes      JumpAttributes    `json:"attributes"`
} // @name jump.Jump

type Authorization struct {
	ID                  uint64         `json:"id"`
	Applicant           string         `json:"applicant"` // email
	Reason              string         `json:"reason"`
	Privilege           JumpPrivilege  `json:"privilege"`
	Expiration          JumpExpiration `json:"expiration"`
	EnableGatewayAccess bool           `json:"enable_gateway_access"`

	// status
	Phase      AuthorizationPhase `json:"phase"`
	ApprovalID *uint64            `json:"approval_id"`
	CreatedAt  int64              `json:"created_at"`
	ClosedAt   *int64             `json:"closed_at"`
	ExpireAt   *int64             `json:"expire_at"`

	Jumps []*Jump `json:"jumps"`
} // @name jump.Authorization

type JumppodConnectParam struct {
	JumpServerAccessUrl string `json:"jumpserver_accessurl"`
	JumpServerSSHAddr   string `json:"jumpserver_ssh_addr"`
	BaseAssetName       string `json:"base_asset_name"`
	JumpPodNamespace    string `json:"jumppod_namespace"`
	JumpPodName         string `json:"jumppod_name"`
	ConnectionToken     string `json:"connection_token"`
}
