package admin

import (
    "context"
	v1 "github.com/go-nunu/nunu-layout-advanced/api/v1"
	"github.com/go-nunu/nunu-layout-advanced/api/v1/admin"
	"github.com/go-nunu/nunu-layout-advanced/internal/model"
	"github.com/go-nunu/nunu-layout-advanced/internal/repository"
	"math"
	"strings"
)

type GatewayIpAdminRepository interface {
	GetGatewayIpAdmin(ctx context.Context, id int64) (*model.Gatewayip, error)
	GetGatewayGroupIpList(ctx context.Context,req admin.SearchGatewayIpParams) (*v1.PaginatedResponse[model.Gatewayip], error)
	AddGatewayIp(ctx context.Context,req model.Gatewayip) error
	EditGatewayIp(ctx context.Context,req model.Gatewayip) error
	DeleteGatewayIp(ctx context.Context,id int64) error
	DeleteGatewayIps(ctx context.Context, ids []int64) error
}

func NewGatewayIpAdminRepository(
	repository *repository.Repository,
) GatewayIpAdminRepository {
	return &gatewayIpAdminRepository{
		Repository: repository,
	}
}

type gatewayIpAdminRepository struct {
	*repository.Repository
}

func (r *gatewayIpAdminRepository) GetGatewayIpAdmin(ctx context.Context, id int64) (*model.Gatewayip, error) {
	var req model.Gatewayip

	return &req, r.DB(ctx).Model(&model.Gatewayip{}).Where("id = ?", id).First(&req).Error
}


func (r *gatewayIpAdminRepository) GetGatewayGroupIpList(ctx context.Context,req admin.SearchGatewayIpParams) (*v1.PaginatedResponse[model.Gatewayip], error) {
	var res []model.Gatewayip
	var total int64

	query := r.Db.WithContext(ctx).Model(&model.Gatewayip{})
	if  req.Ip != "" {
		trimmedName := strings.TrimSpace(req.Ip)
		// 使用 LIKE 进行模糊匹配
		query = query.Where("ip LIKE CONCAT('%', ?, '%')", trimmedName)
	}


	if req.HostId != 0 {
		query = query.Where("host_id = ?", req.HostId)
	}

	if req.Name != "" {
		trimmedName := strings.TrimSpace(req.Name)
		// 使用 LIKE 进行模糊匹配
		query = query.Where("name LIKE CONCAT('%', ?, '%')", trimmedName)
	}

	if req.NodeArea != "" {
		trimmedName := strings.TrimSpace(req.NodeArea)
		// 使用 LIKE 进行模糊匹配
		query = query.Where("node_area LIKE CONCAT('%', ?, '%')", trimmedName)
	}


	if req.Comment != "" {
		trimmedName := strings.TrimSpace(req.Comment)
		// 使用 LIKE 进行模糊匹配
		query = query.Where("comment LIKE CONCAT('%', ?, '%')", trimmedName)
	}

	if req.Column != "" {
		query = query.Order(req.Column + " " + req.Order)
	}

	if err := query.Count(&total).Error; err != nil {
		// 如果连计数都失败了，直接返回错误
		return nil, err
	}


	page := req.Current
	pageSize := req.PageSize

	if page <= 0 {
		page = 1
	}

	if pageSize <= 0 {
		pageSize = 10 // 默认每页 10 条
	} else if pageSize > 100 {
		pageSize = 100 // 每页最多 100 条
	}

	// 计算 offset (偏移量)
	// 例如，第 1 页，offset = (1-1)*10 = 0 (从第0条开始)
	// 第 2 页，offset = (2-1)*10 = 10 (从第10条开始)
	offset := (page - 1) * pageSize
	// 3. 执行最终的查询
	// 在所有条件都添加完毕后，再执行 .Find()
	result := query.Offset(offset).Limit(pageSize).Find(&res)
	if result.Error != nil {
		// 这里的错误可能是数据库连接问题等，而不是“未找到记录”
		return nil, result.Error
	}
	return &v1.PaginatedResponse[model.Gatewayip]{
		Records: res,
		Page: page,
		PageSize: pageSize,
		Total: total,
		TotalPages: int(math.Ceil(float64(total) / float64(pageSize))),

	}, nil
}

func (r *gatewayIpAdminRepository) AddGatewayIp(ctx context.Context,req model.Gatewayip) error {
	return r.DB(ctx).Create(&req).Error
}

func (r *gatewayIpAdminRepository) EditGatewayIp(ctx context.Context,req model.Gatewayip) error {
	return r.DB(ctx).Updates(&req).Error
}

func (r *gatewayIpAdminRepository) DeleteGatewayIp(ctx context.Context,id int64) error {
	return r.DB(ctx).Model(&model.Gatewayip{}).Where("id = ?", id).Delete(id).Error
}

func (r *gatewayIpAdminRepository) DeleteGatewayIps(ctx context.Context, ids []int64) error {
	return r.DB(ctx).Model(&model.Gatewayip{}).Where("id in ?", ids).Delete(&model.Gatewayip{}).Error
}