package api

import (
	"time"

	"banger/internal/model"
)

type Empty struct{}

type PingResult struct {
	Status  string `json:"status"`
	PID     int    `json:"pid"`
	Version string `json:"version,omitempty"`
	Commit  string `json:"commit,omitempty"`
	BuiltAt string `json:"built_at,omitempty"`
}

type ShutdownResult struct {
	Status string `json:"status"`
}

type VMCreateParams struct {
	Name              string `json:"name,omitempty"`
	ImageName         string `json:"image_name,omitempty"`
	VCPUCount         *int   `json:"vcpu_count,omitempty"`
	MemoryMiB         *int   `json:"memory_mib,omitempty"`
	SystemOverlaySize string `json:"system_overlay_size,omitempty"`
	WorkDiskSize      string `json:"work_disk_size,omitempty"`
	NATEnabled        bool   `json:"nat_enabled,omitempty"`
	NoStart           bool   `json:"no_start,omitempty"`
}

type VMCreateStatusParams struct {
	ID string `json:"id"`
}

type VMCreateOperation struct {
	ID        string          `json:"id"`
	VMID      string          `json:"vm_id,omitempty"`
	VMName    string          `json:"vm_name,omitempty"`
	Stage     string          `json:"stage,omitempty"`
	Detail    string          `json:"detail,omitempty"`
	StartedAt time.Time       `json:"started_at,omitempty"`
	UpdatedAt time.Time       `json:"updated_at,omitempty"`
	Done      bool            `json:"done"`
	Success   bool            `json:"success"`
	Error     string          `json:"error,omitempty"`
	VM        *model.VMRecord `json:"vm,omitempty"`
}

type VMCreateBeginResult struct {
	Operation VMCreateOperation `json:"operation"`
}

type VMCreateStatusResult struct {
	Operation VMCreateOperation `json:"operation"`
}

type VMRefParams struct {
	IDOrName string `json:"id_or_name"`
}

type VMKillParams struct {
	IDOrName string `json:"id_or_name"`
	Signal   string `json:"signal,omitempty"`
}

type VMSetParams struct {
	IDOrName     string `json:"id_or_name"`
	VCPUCount    *int   `json:"vcpu_count,omitempty"`
	MemoryMiB    *int   `json:"memory_mib,omitempty"`
	WorkDiskSize string `json:"work_disk_size,omitempty"`
	NATEnabled   *bool  `json:"nat_enabled,omitempty"`
}

type VMListResult struct {
	VMs []model.VMRecord `json:"vms"`
}

type VMShowResult struct {
	VM model.VMRecord `json:"vm"`
}

type VMStatsResult struct {
	VM    model.VMRecord `json:"vm"`
	Stats model.VMStats  `json:"stats"`
}

type VMLogsResult struct {
	LogPath string `json:"log_path"`
}

type VMSSHResult struct {
	Name    string `json:"name"`
	GuestIP string `json:"guest_ip"`
}

type VMHealthResult struct {
	Name    string `json:"name"`
	Healthy bool   `json:"healthy"`
}

type VMPingResult struct {
	Name  string `json:"name"`
	Alive bool   `json:"alive"`
}

type VMPort struct {
	Proto       string `json:"proto"`
	BindAddress string `json:"bind_address,omitempty"`
	Port        int    `json:"port"`
	PID         int    `json:"pid,omitempty"`
	Process     string `json:"process,omitempty"`
	Command     string `json:"command,omitempty"`
	Endpoint    string `json:"endpoint,omitempty"`
}

type VMPortsResult struct {
	Name    string   `json:"name"`
	DNSName string   `json:"dns_name,omitempty"`
	Ports   []VMPort `json:"ports"`
}

type WorkspaceExportParams struct {
	IDOrName   string `json:"id_or_name"`
	GuestPath  string `json:"guest_path,omitempty"`
	BaseCommit string `json:"base_commit,omitempty"`
}

type WorkspaceExportResult struct {
	GuestPath    string   `json:"guest_path"`
	BaseCommit   string   `json:"base_commit"`
	Patch        []byte   `json:"patch"`
	ChangedFiles []string `json:"changed_files"`
	HasChanges   bool     `json:"has_changes"`
}

type VMWorkspacePrepareParams struct {
	IDOrName         string `json:"id_or_name"`
	SourcePath       string `json:"source_path"`
	GuestPath        string `json:"guest_path,omitempty"`
	Branch           string `json:"branch,omitempty"`
	From             string `json:"from,omitempty"`
	Mode             string `json:"mode,omitempty"`
	IncludeUntracked bool   `json:"include_untracked,omitempty"`
}

type VMWorkspacePrepareResult struct {
	Workspace model.WorkspacePrepareResult `json:"workspace"`
}

type ImageRegisterParams struct {
	Name         string `json:"name,omitempty"`
	RootfsPath   string `json:"rootfs_path,omitempty"`
	WorkSeedPath string `json:"work_seed_path,omitempty"`
	KernelPath   string `json:"kernel_path,omitempty"`
	InitrdPath   string `json:"initrd_path,omitempty"`
	ModulesDir   string `json:"modules_dir,omitempty"`
	KernelRef    string `json:"kernel_ref,omitempty"`
}

type ImagePullParams struct {
	Ref        string `json:"ref"`
	Name       string `json:"name,omitempty"`
	KernelPath string `json:"kernel_path,omitempty"`
	InitrdPath string `json:"initrd_path,omitempty"`
	ModulesDir string `json:"modules_dir,omitempty"`
	KernelRef  string `json:"kernel_ref,omitempty"`
	SizeBytes  int64  `json:"size_bytes,omitempty"`
}

type ImageRefParams struct {
	IDOrName string `json:"id_or_name"`
}

type OperationSummary struct {
	ID        string    `json:"id"`
	Kind      string    `json:"kind"`
	Stage     string    `json:"stage,omitempty"`
	Detail    string    `json:"detail,omitempty"`
	Done      bool      `json:"done"`
	StartedAt time.Time `json:"started_at,omitempty"`
	UpdatedAt time.Time `json:"updated_at,omitempty"`
}

type OperationsListResult struct {
	Operations []OperationSummary `json:"operations"`
}

type ImageCachePruneParams struct {
	DryRun bool `json:"dry_run,omitempty"`
}

type ImageCachePruneResult struct {
	BytesFreed int64  `json:"bytes_freed"`
	BlobsFreed int    `json:"blobs_freed"`
	DryRun     bool   `json:"dry_run"`
	CacheDir   string `json:"cache_dir"`
}

type ImageListResult struct {
	Images []model.Image `json:"images"`
}

type ImageShowResult struct {
	Image model.Image `json:"image"`
}

type KernelEntry struct {
	Name          string `json:"name"`
	Distro        string `json:"distro,omitempty"`
	Arch          string `json:"arch,omitempty"`
	KernelVersion string `json:"kernel_version,omitempty"`
	SHA256        string `json:"sha256,omitempty"`
	Source        string `json:"source,omitempty"`
	ImportedAt    string `json:"imported_at,omitempty"`
	KernelPath    string `json:"kernel_path,omitempty"`
	InitrdPath    string `json:"initrd_path,omitempty"`
	ModulesDir    string `json:"modules_dir,omitempty"`
}

type KernelListResult struct {
	Entries []KernelEntry `json:"entries"`
}

type KernelRefParams struct {
	Name string `json:"name"`
}

type KernelShowResult struct {
	Entry KernelEntry `json:"entry"`
}

type KernelImportParams struct {
	Name    string `json:"name"`
	FromDir string `json:"from_dir"`
	Distro  string `json:"distro,omitempty"`
	Arch    string `json:"arch,omitempty"`
}

type KernelPullParams struct {
	Name  string `json:"name"`
	Force bool   `json:"force,omitempty"`
}

type KernelCatalogEntry struct {
	Name          string `json:"name"`
	Distro        string `json:"distro,omitempty"`
	Arch          string `json:"arch,omitempty"`
	KernelVersion string `json:"kernel_version,omitempty"`
	SizeBytes     int64  `json:"size_bytes,omitempty"`
	Description   string `json:"description,omitempty"`
	Pulled        bool   `json:"pulled"`
}

type KernelCatalogResult struct {
	Entries []KernelCatalogEntry `json:"entries"`
}
