package agent

import (
	"context"
	"fmt"
	"net/http"
	"strings"
	"sim-server/app/main/model"
	"sim-server/common/globalkey"
	"sim-server/common/xerr"

	"github.com/pkg/errors"
	"github.com/zeromicro/go-zero/core/logx"

	"sim-server/app/main/api/internal/svc"
)

type ShortLinkRedirectLogic struct {
	logx.Logger
	ctx    context.Context
	svcCtx *svc.ServiceContext
}

func NewShortLinkRedirectLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ShortLinkRedirectLogic {
	return &ShortLinkRedirectLogic{
		Logger: logx.WithContext(ctx),
		ctx:    ctx,
		svcCtx: svcCtx,
	}
}

// ShortLinkRedirect 短链重定向
// 从短链重定向到推广页面
func (l *ShortLinkRedirectLogic) ShortLinkRedirect(shortCode string, r *http.Request, w http.ResponseWriter) error {
	// 1. 验证短链标识
	if shortCode == "" {
		return errors.Wrapf(xerr.NewErrCode(xerr.REUQEST_PARAM_ERROR), "缺少短链标识")
	}

	// 2. 查询短链记录
	shortLink, err := l.svcCtx.AgentShortLinkModel.FindOneByShortCodeDelState(l.ctx, shortCode, globalkey.DelStateNo)
	if err != nil {
		if errors.Is(err, model.ErrNotFound) {
			return errors.Wrapf(xerr.NewErrCode(xerr.REUQEST_PARAM_ERROR), "短链不存在或已失效")
		}
		return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询短链失败, %v", err)
	}

	// 3. 根据类型验证链接有效性
	if shortLink.Type == 1 {
		// 推广报告类型：验证linkIdentifier是否存在
		if shortLink.LinkIdentifier.Valid && shortLink.LinkIdentifier.String != "" {
			_, err = l.svcCtx.AgentLinkModel.FindOneByLinkIdentifier(l.ctx, shortLink.LinkIdentifier.String)
			if err != nil {
				if errors.Is(err, model.ErrNotFound) {
					return errors.Wrapf(xerr.NewErrCode(xerr.REUQEST_PARAM_ERROR), "推广链接不存在或已失效")
				}
				l.Errorf("查询推广链接失败: %v", err)
				// 即使查询失败，也继续重定向，避免影响用户体验
			}
		}
	}
	// 系统简化：移除邀请码验证功能

	// 4. 构建重定向URL
	redirectURL := shortLink.TargetPath
	if redirectURL == "" {
		return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "短链目标地址为空")
	}

	// 如果 target_path 是相对路径，需要拼接正式域名
	// 如果 target_path 已经是完整URL，则直接使用
	if !strings.HasPrefix(redirectURL, "http://") && !strings.HasPrefix(redirectURL, "https://") {
		// 相对路径，需要拼接正式域名
		officialDomain := l.svcCtx.Config.Promotion.OfficialDomain
		if officialDomain == "" {
			// 如果没有配置正式域名，使用当前请求的域名（向后兼容）
			scheme := "http"
			if r.TLS != nil {
				scheme = "https"
			}
			officialDomain = fmt.Sprintf("%s://%s", scheme, r.Host)
		}
		// 确保正式域名不以 / 结尾
		officialDomain = strings.TrimSuffix(officialDomain, "/")
		// 确保 target_path 以 / 开头
		if !strings.HasPrefix(redirectURL, "/") {
			redirectURL = "/" + redirectURL
		}
		redirectURL = officialDomain + redirectURL
	}

	// 5. 执行重定向（302临时重定向）
	linkIdentifierStr := ""
	if shortLink.LinkIdentifier.Valid {
		linkIdentifierStr = shortLink.LinkIdentifier.String
	}
	l.Infof("短链重定向: shortCode=%s, type=%d, linkIdentifier=%s, redirectURL=%s", shortCode, shortLink.Type, linkIdentifierStr, redirectURL)
	http.Redirect(w, r, redirectURL, http.StatusFound)

	return nil
}
