package handler

import (
	"time"

	coremodel "security-center-backend/internal/model"
	vulnmodel "security-center-backend/internal/modules/vuln/model"
	"security-center-backend/internal/service/directory"
)

type userSummary struct {
	ID        uint64 `json:"id"`
	Name      string `json:"name"`
	Email     string `json:"email"`
	AvatarURL string `json:"avatar_url,omitempty"`
}

type employeeSummary struct {
	ID             uint64 `json:"id"`
	Name           string `json:"name"`
	Email          string `json:"email"`
	AvatarURL      string `json:"avatar_url,omitempty"`
	DepartmentID   string `json:"department_id,omitempty"`
	DepartmentName string `json:"department_name,omitempty"`
}

type departmentSummary struct {
	ID               uint64 `json:"id"`
	LarkDepartmentID string `json:"lark_department_id"`
	Name             string `json:"name"`
}

type vulnerabilityListItemDTO struct {
	ID                  uint64                        `json:"id"`
	PublicID            string                        `json:"public_id,omitempty"`
	Title               string                        `json:"title"`
	SeverityLevel       vulnmodel.SeverityLevel       `json:"severity_level"`
	Status              vulnmodel.VulnerabilityStatus `json:"status"`
	Application         string                        `json:"application,omitempty"`
	CodeRepository      string                        `json:"code_repository,omitempty"`
	VulnerabilityType   string                        `json:"vulnerability_type,omitempty"`
	DiscoveryChannel    string                        `json:"discovery_channel,omitempty"`
	DiscoveryPhase      string                        `json:"discovery_phase,omitempty"`
	NetworkEnv          string                        `json:"network_env,omitempty"`
	IsThirdParty        bool                          `json:"is_third_party"`
	InterfacePath       string                        `json:"interface_path,omitempty"`
	Source              string                        `json:"source,omitempty"`
	AffectedAssetsCount int                           `json:"affected_assets_count"`
	Tags                []string                      `json:"tags"`
	HasPOCVerification  bool                          `json:"has_poc_verification"`
	DependencyName      string                        `json:"dependency_name,omitempty"`
	DependencyVersion   string                        `json:"dependency_version,omitempty"`
	BatchGroupID        *uint64                       `json:"batch_group_id,omitempty"`
	OwnerEmployee       *employeeSummary              `json:"owner_employee,omitempty"`
	IsPublicViewable    bool                          `json:"is_public_viewable"`
	Discoverer          *employeeSummary              `json:"discoverer,omitempty"`
	Fixer               *employeeSummary              `json:"fixer,omitempty"`
	DepartmentID        *string                       `json:"department_id,omitempty"`
	Department          *departmentSummary            `json:"department,omitempty"`
	Submitter           *userSummary                  `json:"submitter,omitempty"`
	SubmittedAt         time.Time                     `json:"submitted_at"`
	SLADeadline         time.Time                     `json:"sla_deadline"`
	IsOverdue           bool                          `json:"is_overdue"`
	Actions             []string                      `json:"actions"`
}

func summarizeUser(u *coremodel.User) *userSummary {
	if u == nil || u.ID == 0 {
		return nil
	}
	out := &userSummary{
		ID:    u.ID,
		Name:  u.Name,
		Email: u.Email,
	}
	if u.AvatarURL != "" {
		out.AvatarURL = u.AvatarURL
	}
	return out
}

func summarizeEmployee(emp *directory.Employee) *employeeSummary {
	if emp == nil || emp.ID == 0 {
		return nil
	}
	return &employeeSummary{
		ID:             emp.ID,
		Name:           emp.Name,
		Email:          emp.Email,
		AvatarURL:      emp.AvatarURL,
		DepartmentID:   emp.DepartmentID,
		DepartmentName: emp.DepartmentName,
	}
}

func summarizeDepartment(dept *directory.Department) *departmentSummary {
	if dept == nil || dept.ID == 0 {
		return nil
	}
	return &departmentSummary{
		ID:               dept.ID,
		LarkDepartmentID: dept.LarkDepartmentID,
		Name:             dept.Name,
	}
}

func toVulnListItemDTO(v vulnmodel.Vulnerability, actions []string) vulnerabilityListItemDTO {
	return vulnerabilityListItemDTO{
		ID:                  v.ID,
		PublicID:            v.PublicID,
		Title:               v.Title,
		SeverityLevel:       v.SeverityLevel,
		Status:              v.Status,
		Application:         v.Application,
		CodeRepository:      v.CodeRepository,
		VulnerabilityType:   v.VulnerabilityType,
		DiscoveryChannel:    v.DiscoveryChannel,
		DiscoveryPhase:      v.DiscoveryPhase,
		NetworkEnv:          v.NetworkEnv,
		IsThirdParty:        v.IsThirdParty,
		InterfacePath:       v.InterfacePath,
		Source:              v.Source,
		AffectedAssetsCount: v.AffectedAssetsCount,
		Tags:                []string(v.Tags),
		HasPOCVerification:  v.HasPOCVerification,
		DependencyName:      v.DependencyName,
		DependencyVersion:   v.DependencyVersion,
		BatchGroupID:        v.BatchGroupID,
		OwnerEmployee:       summarizeEmployee(v.Owner),
		IsPublicViewable:    v.IsPublicViewable,
		Discoverer:          summarizeEmployee(v.Discoverer),
		Fixer:               summarizeEmployee(v.Fixer),
		DepartmentID:        v.DepartmentID,
		Department:          summarizeDepartment(v.Department),
		Submitter:           summarizeUser(v.Submitter),
		SubmittedAt:         v.SubmittedAt,
		SLADeadline:         v.SLADeadline,
		IsOverdue:           v.IsOverdue,
		Actions:             actions,
	}
}
