package tender_approval

// CreateTenderApprovalForm represents the form for creating a new tender approval
type CreateTenderApprovalForm struct {
	TenderID       string         `json:"tender_id" valid:"required"`
	SubmissionMode SubmissionMode `json:"submission_mode" valid:"required,in(self-apply|partnership)"`
	Status         ApprovalStatus `json:"status,omitempty" valid:"optional,in(submitted|rejected)"`
}

// UpdateTenderApprovalForm represents the form for updating a tender approval
type UpdateTenderApprovalForm struct {
	SubmissionMode *string `json:"submission_mode,omitempty" valid:"optional,in(self-apply|partnership)"`
	Status         *string `json:"status,omitempty" valid:"optional,in(submitted|rejected)"`
}

// ListTenderApprovalsForm represents the form for listing tender approvals with filters
type ListTenderApprovalsForm struct {
	TenderID       *string  `query:"tender_id" valid:"optional"`
	CompanyID      *string  `query:"company_id" valid:"optional"`
	Status         []string `query:"status" valid:"optional"`
	SubmissionMode []string `query:"submission_mode" valid:"optional"`
	CreatedAtFrom  *int64   `query:"created_at_from" valid:"optional"`
	CreatedAtTo    *int64   `query:"created_at_to" valid:"optional"`
	Limit          *int     `query:"limit" valid:"optional,range(1|100)"`
	Offset         *int     `query:"offset" valid:"optional,min(0)"`
	SortBy         *string  `query:"sort_by" valid:"optional,in(created_at|updated_at|status|submission_mode)"`
	SortOrder      *string  `query:"sort_order" valid:"optional,in(asc|desc)"`
}

// ApproveTenderForm represents the form for approving a tender
type ApproveTenderForm struct {
	Notes *string `json:"notes,omitempty" valid:"optional,length(0|1000)"`
}

// RejectTenderForm represents the form for rejecting a tender
type RejectTenderForm struct {
	Reason string `json:"reason" valid:"required,length(10|500)"`
}

// TenderApprovalListResponse represents the response for listing tender approvals
type TenderApprovalListResponse struct {
	TenderApprovals []*TenderApprovalResponse `json:"tender_approvals"`
	Total           int64                     `json:"total"`
	Limit           int                       `json:"limit"`
	Offset          int                       `json:"offset"`
	TotalPages      int                       `json:"total_pages"`
}

// TenderApproval search and matching DTOs
type TenderApprovalSearchForm struct {
	Query          *string  `query:"q" valid:"optional"`
	TenderID       *string  `query:"tender_id" valid:"optional"`
	CompanyID      *string  `query:"company_id" valid:"optional"`
	Status         []string `query:"status" valid:"optional"`
	SubmissionMode []string `query:"submission_mode" valid:"optional"`
	CreatedAtFrom  *int64   `query:"created_at_from" valid:"optional"`
	CreatedAtTo    *int64   `query:"created_at_to" valid:"optional"`
	Limit          *int     `query:"limit" valid:"optional,range(1|100)"`
	Offset         *int     `query:"offset" valid:"optional,min(0)"`
}

// TenderApproval statistics DTOs
type TenderApprovalStatsResponse struct {
	TotalApprovals   int64 `json:"total_approvals"`
	SubmittedTenders int64 `json:"submitted_tenders"`
	RejectedTenders  int64 `json:"rejected_tenders"`
	LastUpdated      int64 `json:"last_updated"`
}

// CompanyTenderApprovalStatsResponse represents company-specific tender approval statistics
type CompanyTenderApprovalStatsResponse struct {
	CompanyID        string `json:"company_id"`
	TotalApprovals   int64  `json:"total_approvals"`
	SubmittedTenders int64  `json:"submitted_tenders"`
	RejectedTenders  int64  `json:"rejected_tenders"`
	SelfApplyCount   int64  `json:"self_apply_count"`
	PartnershipCount int64  `json:"partnership_count"`
	LastUpdated      int64  `json:"last_updated"`
}

// ToggleTenderApprovalForm represents the form for toggling a tender approval
type ToggleTenderApprovalForm struct {
	TenderID       string         `json:"tender_id" valid:"required"`
	Status         ApprovalStatus `json:"status" valid:"required,in(submitted|rejected)"`
	SubmissionMode SubmissionMode `json:"submission_mode" valid:"required,in(self-apply|partnership)"`
}

// CompanyTenderApprovalStatsRequest represents a request for company tender approval statistics
type CompanyTenderApprovalStatsRequest struct {
	CompanyIDs []string `query:"company_ids" valid:"optional"`
	CompanyID  *string  `query:"company_id" valid:"optional"`
}

// AggregatedCompanyStatsResponse represents aggregated statistics across all companies
type AggregatedCompanyStatsResponse struct {
	TotalCompanies        int64                                 `json:"total_companies"`
	TotalApprovals        int64                                 `json:"total_approvals"`
	TotalSubmittedTenders int64                                 `json:"total_submitted_tenders"`
	TotalRejectedTenders  int64                                 `json:"total_rejected_tenders"`
	TotalSelfApplyCount   int64                                 `json:"total_self_apply_count"`
	TotalPartnershipCount int64                                 `json:"total_partnership_count"`
	ApprovalsByStatus     map[string]int64                      `json:"approvals_by_status"`
	ApprovalsBySubmission map[string]int64                      `json:"approvals_by_submission"`
	CompanyStats          []*CompanyTenderApprovalStatsResponse `json:"company_stats"`
	LastUpdated           int64                                 `json:"last_updated"`
}
