package dto

import (
	"time"

	coremodel "security-center-backend/internal/model"
)

type PageRequest struct {
	Page     int `form:"page" json:"page"`
	PageSize int `form:"page_size" json:"page_size"`
}

type PageResponse[T any] struct {
	Items    []T   `json:"items"`
	Total    int64 `json:"total"`
	Page     int   `json:"page"`
	PageSize int   `json:"page_size"`
}

type CreateScanBatchRequest struct {
	Source          string                 `json:"source"`
	TargetIDs       []uint64               `json:"target_ids"`
	ClientRequestID string                 `json:"client_request_id"`
	Targets         []CreateScanTarget     `json:"targets,omitempty"`
	Metadata        map[string]interface{} `json:"metadata,omitempty"`
}

type CreateScanTarget struct {
	CAASMAssetID   *uint64                `json:"caasm_asset_id,omitempty"`
	CAASMIPAssetID *uint64                `json:"caasm_ip_asset_id,omitempty"`
	CAASMPortID    *uint64                `json:"caasm_port_id,omitempty"`
	PublicIP       string                 `json:"public_ip"`
	Port           int                    `json:"port"`
	Transport      string                 `json:"transport"`
	Domain         *string                `json:"domain,omitempty"`
	Metadata       map[string]interface{} `json:"metadata,omitempty"`
}

type CreateScanBatchResponse struct {
	Batch           ScanBatchSummary `json:"batch"`
	AcceptedTargets int              `json:"accepted_targets"`
	RejectedTargets int              `json:"rejected_targets"`
}

type ScanBatchSummary struct {
	ID              uint64     `json:"id"`
	RequestID       string     `json:"request_id"`
	ScannerBatchID  *string    `json:"scanner_batch_id,omitempty"`
	Source          string     `json:"source"`
	Status          string     `json:"status"`
	CreatedBy       *uint64    `json:"created_by,omitempty"`
	TriggerType     string     `json:"trigger_type"`
	TargetCount     int        `json:"target_count"`
	AcceptedTargets int        `json:"accepted_targets"`
	RejectedTargets int        `json:"rejected_targets"`
	SucceededJobs   int        `json:"succeeded_jobs"`
	FailedJobs      int        `json:"failed_jobs"`
	SkippedJobs     int        `json:"skipped_jobs"`
	SubmittedAt     *time.Time `json:"submitted_at,omitempty"`
	CompletedAt     *time.Time `json:"completed_at,omitempty"`
	LastSyncedAt    *time.Time `json:"last_synced_at,omitempty"`
	CreatedAt       time.Time  `json:"created_at"`
	UpdatedAt       time.Time  `json:"updated_at"`
}

type ScanBatchDetail struct {
	ScanBatchSummary
	QueuedJobs            int                         `json:"queued_jobs"`
	RunningJobs           int                         `json:"running_jobs"`
	ScannerError          *string                     `json:"scanner_error,omitempty"`
	Metadata              map[string]interface{}      `json:"metadata"`
	LatestCallbackReceipt *ScanCallbackReceiptSummary `json:"latest_callback_receipt,omitempty"`
}

type ScanTarget struct {
	ID              uint64                 `json:"id"`
	BatchID         uint64                 `json:"batch_id"`
	CAASMAssetID    *uint64                `json:"caasm_asset_id,omitempty"`
	CAASMIPAssetID  *uint64                `json:"caasm_ip_asset_id,omitempty"`
	CAASMPortID     *uint64                `json:"caasm_port_id,omitempty"`
	ScannerAssetID  string                 `json:"scanner_asset_id"`
	ScannerTargetID *string                `json:"scanner_target_id,omitempty"`
	PublicIP        string                 `json:"public_ip"`
	Port            int                    `json:"port"`
	Transport       string                 `json:"transport"`
	Domain          *string                `json:"domain,omitempty"`
	CloudProvider   *string                `json:"cloud_provider,omitempty"`
	CloudAccountID  *string                `json:"cloud_account_id,omitempty"`
	Region          *string                `json:"region,omitempty"`
	ResourceType    *string                `json:"resource_type,omitempty"`
	ResourceID      *string                `json:"resource_id,omitempty"`
	Owner           *string                `json:"owner,omitempty"`
	Environment     *string                `json:"environment,omitempty"`
	TargetStatus    string                 `json:"target_status"`
	RejectReason    *string                `json:"reject_reason,omitempty"`
	RejectDetail    *string                `json:"reject_detail,omitempty"`
	Metadata        map[string]interface{} `json:"metadata"`
	CreatedAt       time.Time              `json:"created_at"`
	UpdatedAt       time.Time              `json:"updated_at"`
}

type ScanObservation struct {
	ID                   uint64                 `json:"id"`
	BatchID              uint64                 `json:"batch_id"`
	TargetID             *uint64                `json:"target_id,omitempty"`
	ScannerObservationID *string                `json:"scanner_observation_id,omitempty"`
	ScannerTargetID      *string                `json:"scanner_target_id,omitempty"`
	ScannerJobID         *string                `json:"scanner_job_id,omitempty"`
	CAASMAssetID         *uint64                `json:"caasm_asset_id,omitempty"`
	CAASMPortID          *uint64                `json:"caasm_port_id,omitempty"`
	PublicIP             string                 `json:"public_ip"`
	Port                 int                    `json:"port"`
	Transport            string                 `json:"transport"`
	Result               string                 `json:"result"`
	ReasonCode           string                 `json:"reason_code"`
	ConnectMS            int64                  `json:"connect_ms"`
	ScannerID            *string                `json:"scanner_id,omitempty"`
	ScannerVersion       *string                `json:"scanner_version,omitempty"`
	ScannerSourceIP      *string                `json:"scanner_source_ip,omitempty"`
	EvidenceSHA256       *string                `json:"evidence_sha256,omitempty"`
	EvidencePath         *string                `json:"evidence_path,omitempty"`
	StartedAt            *time.Time             `json:"started_at,omitempty"`
	FinishedAt           *time.Time             `json:"finished_at,omitempty"`
	ObservedAt           time.Time              `json:"observed_at"`
	Metadata             map[string]interface{} `json:"metadata"`
	CreatedAt            time.Time              `json:"created_at"`
	UpdatedAt            time.Time              `json:"updated_at"`
}

type ScanCallbackReceipt struct {
	ID                  uint64                 `json:"id"`
	IdempotencyKey      string                 `json:"idempotency_key"`
	RequestID           *string                `json:"request_id,omitempty"`
	ScannerBatchID      *string                `json:"scanner_batch_id,omitempty"`
	LocalBatchID        *uint64                `json:"local_batch_id,omitempty"`
	PayloadSHA256       string                 `json:"payload_sha256"`
	HeaderPayloadSHA256 string                 `json:"header_payload_sha256"`
	RequestHeaderID     *string                `json:"request_header_id,omitempty"`
	Status              string                 `json:"status"`
	HTTPStatus          int                    `json:"http_status"`
	ErrorMessage        *string                `json:"error_message,omitempty"`
	ReceivedAt          time.Time              `json:"received_at"`
	AppliedAt           *time.Time             `json:"applied_at,omitempty"`
	Metadata            map[string]interface{} `json:"metadata"`
	CreatedAt           time.Time              `json:"created_at"`
	UpdatedAt           time.Time              `json:"updated_at"`
}

type ScanCallbackReceiptSummary struct {
	ID             uint64     `json:"id"`
	IdempotencyKey string     `json:"idempotency_key"`
	Status         string     `json:"status"`
	HTTPStatus     int        `json:"http_status"`
	ReceivedAt     time.Time  `json:"received_at"`
	AppliedAt      *time.Time `json:"applied_at,omitempty"`
}

type PortExposureQuery struct {
	PageRequest
	PublicIP    string  `form:"public_ip" json:"public_ip"`
	Port        *int    `form:"port" json:"port,omitempty"`
	Transport   string  `form:"transport" json:"transport"`
	AssetID     *uint64 `form:"asset_id" json:"asset_id,omitempty"`
	CAASMPortID *uint64 `form:"caasm_port_id" json:"caasm_port_id,omitempty"`
	Owner       string  `form:"owner" json:"owner"`
	Environment string  `form:"environment" json:"environment"`
	Result      string  `form:"result" json:"result"`
}

type PortExposureResult struct {
	ObservationID        uint64                 `json:"observation_id"`
	BatchID              uint64                 `json:"batch_id"`
	RequestID            string                 `json:"request_id"`
	ScannerBatchID       *string                `json:"scanner_batch_id,omitempty"`
	TargetID             *uint64                `json:"target_id,omitempty"`
	CAASMAssetID         *uint64                `json:"caasm_asset_id,omitempty"`
	CAASMPortID          *uint64                `json:"caasm_port_id,omitempty"`
	PublicIP             string                 `json:"public_ip"`
	Port                 int                    `json:"port"`
	Transport            string                 `json:"transport"`
	Result               string                 `json:"result"`
	ReasonCode           string                 `json:"reason_code"`
	ConnectMS            int64                  `json:"connect_ms"`
	ScannerSourceIP      *string                `json:"scanner_source_ip,omitempty"`
	EvidenceSHA256       *string                `json:"evidence_sha256,omitempty"`
	EvidencePath         *string                `json:"evidence_path,omitempty"`
	ObservedAt           time.Time              `json:"observed_at"`
	ScannerTargetID      *string                `json:"scanner_target_id,omitempty"`
	ScannerObservationID *string                `json:"scanner_observation_id,omitempty"`
	ScannerJobID         *string                `json:"scanner_job_id,omitempty"`
	TargetOwner          *string                `json:"target_owner,omitempty"`
	TargetEnvironment    *string                `json:"target_environment,omitempty"`
	TargetDomain         *string                `json:"target_domain,omitempty"`
	RawPayload           coremodel.RawJSON      `json:"raw_payload,omitempty"`
	Metadata             map[string]interface{} `json:"metadata"`
}

type ScanStats struct {
	TotalBatches               int64            `json:"total_batches"`
	ActiveBatches              int64            `json:"active_batches"`
	CompletedBatches           int64            `json:"completed_batches"`
	FailedBatches              int64            `json:"failed_batches"`
	ResultCounts               map[string]int64 `json:"result_counts"`
	RecentlyConfirmedOpenCount int64            `json:"recently_confirmed_open_count"`
	CallbackFailures           int64            `json:"callback_failures"`
	LatestScannerSyncAt        *time.Time       `json:"latest_scanner_sync_at,omitempty"`
}
