package service

import (
	"context"
	"errors"

	vulnmodel "security-center-backend/internal/modules/vuln/model"
	"security-center-backend/internal/modules/vuln/repository"
)

type DiscoveryChannelListQuery struct {
	Page       int
	PageSize   int
	Query      string
	SystemOnly *bool
}

type DiscoveryChannelListResult struct {
	Items []vulnmodel.DiscoveryChannel `json:"items"`
	Total int64                        `json:"total"`
}

type DiscoveryChannelService struct {
	repo repository.DiscoveryChannelRepository
}

func NewDiscoveryChannelService(repo repository.DiscoveryChannelRepository) *DiscoveryChannelService {
	return &DiscoveryChannelService{repo: repo}
}

func (s *DiscoveryChannelService) List(ctx context.Context, query DiscoveryChannelListQuery) (*DiscoveryChannelListResult, error) {
	items, total, err := s.repo.List(ctx, repository.DiscoveryChannelListParams{
		Page:       query.Page,
		PageSize:   query.PageSize,
		Query:      query.Query,
		SystemOnly: query.SystemOnly,
	})
	if err != nil {
		return nil, err
	}
	return &DiscoveryChannelListResult{Items: items, Total: total}, nil
}

func (s *DiscoveryChannelService) Create(ctx context.Context, channel *vulnmodel.DiscoveryChannel) error {
	return s.repo.Create(ctx, channel)
}

func (s *DiscoveryChannelService) Update(ctx context.Context, channel *vulnmodel.DiscoveryChannel) error {
	if channel.ID == 0 {
		return errors.New("id is required")
	}
	return s.repo.Update(ctx, channel)
}

func (s *DiscoveryChannelService) Delete(ctx context.Context, id uint64, allowSystem bool) error {
	if id == 0 {
		return errors.New("id is required")
	}
	isSystem, err := s.repo.IsSystem(ctx, id)
	if err != nil {
		return err
	}
	if isSystem && !allowSystem {
		return errors.New("system channels cannot be deleted")
	}
	return s.repo.Delete(ctx, id)
}
