package models

import (
	"fmt"
	"time"

	"go.mongodb.org/mongo-driver/v2/bson"
)

const (
	RoleIDSuperAdmin = 9527 // 超级管理员（后台登录）
	RoleIDSuperUser  = 0    // 超级用户（role_id=0 且 role=admin，可配置短信平台）
	RoleIDUser       = 1    // 普通用户
)

// FlexDate 可解码 BSON DateTime 或 string，统一以 string 输出（兼容库中既有日期类型又有字符串的情况）
type FlexDate string

func (d *FlexDate) UnmarshalBSONValue(typ byte, data []byte) error {
	rv := bson.RawValue{Type: bson.Type(typ), Value: data}
	switch bson.Type(typ) {
	case bson.TypeDateTime:
		if dt, ok := rv.DateTimeOK(); ok {
			*d = FlexDate(time.UnixMilli(dt).Format("2006-01-02"))
		}
		return nil
	case bson.TypeString:
		if s, ok := rv.StringValueOK(); ok {
			*d = FlexDate(s)
		}
		return nil
	case bson.TypeNull, bson.TypeUndefined:
		*d = ""
		return nil
	default:
		return fmt.Errorf("FlexDate: cannot decode type %v", typ)
	}
}

type User struct {
	ID             bson.ObjectID `bson:"_id,omitempty" json:"id,omitempty"`
	Username       string        `bson:"username" json:"username"`
	Mobile         string        `bson:"mobile,omitempty" json:"mobile,omitempty"`
	Email          string        `bson:"email" json:"email"`
	Password       string        `bson:"password" json:"-"` // 不返回给前端
	Role           string        `bson:"role" json:"role"`
	RoleID         int           `bson:"role_id,omitempty" json:"role_id"` // 9527=超级管理员 1=普通用户
	IsBeta         bool          `bson:"is_beta,omitempty" json:"is_beta"`
	TrialStartDate FlexDate      `bson:"trial_start_date,omitempty" json:"trial_start_date,omitempty"`
	TrialEndDate   FlexDate      `bson:"trial_end_date,omitempty" json:"trial_end_date,omitempty"`
	LastLogin      string        `bson:"lastLogin,omitempty" json:"last_login,omitempty"`
	LLM            string        `bson:"llm,omitempty" json:"llm,omitempty"`
}

type UserCreateInput struct {
	Username      string `json:"username" binding:"required"`
	Email         string `json:"email" binding:"required"`
	Password      string `json:"password" binding:"required"`
	Role          string `json:"role"`
	RoleID        int    `json:"role_id"` // 9527=超级管理员 1=普通用户
	IsBeta        bool   `json:"is_beta"`
	TrialStartDate string `json:"trial_start_date"`
	TrialEndDate   string `json:"trial_end_date"`
	LLM           string `json:"llm"`
}

type UserUpdateInput struct {
	Username       *string `json:"username"`
	Email          *string `json:"email"`
	Password       *string `json:"password"` // 若提供则更新
	Role           *string `json:"role"`
	RoleID         *int   `json:"role_id"`
	IsBeta         *bool   `json:"is_beta"`
	TrialStartDate *string `json:"trial_start_date"`
	TrialEndDate   *string `json:"trial_end_date"`
	LLM            *string `json:"llm"`
}
