package domain

type EnchantedLinkInitRequest struct {
	LoginID  string `json:"loginId"`
	URI      string `json:"uri,omitempty"`    // Redirect URI (optional for polling flow)
	Method   string `json:"method,omitempty"` // "email" or "sms"
	CodeOnly bool   `json:"codeOnly,omitempty"`
	DryRun   bool   `json:"dryRun,omitempty"`
	DrySend  bool   `json:"drySend,omitempty"`
}

type EnchantedLinkInitResponse struct {
	LinkID      string `json:"linkId"`
	PendingRef  string `json:"pendingRef"`
	MaskedEmail string `json:"maskedEmail"`
}

type EnchantedLinkPollRequest struct {
	PendingRef string `json:"pendingRef"`
}

type EnchantedLinkPollResponse struct {
	SessionToken string `json:"sessionToken"` // JWT
	RefreshToken string `json:"refreshToken"`
	UserID       string `json:"userId,omitempty"`
}

type MagicLinkVerifyRequest struct {
	Token      string `json:"token"`
	VerifyOnly bool   `json:"verifyOnly,omitempty"`
}

type QRInitResponse struct {
	QRCode     string `json:"qrCode"` // Base64 or URL
	PendingRef string `json:"pendingRef"`
	ExpiresIn  int    `json:"expiresIn"`
}

// Signup Flow Models

type CheckEmailRequest struct {
	Email string `json:"email"`
}

type SendSignupCodeRequest struct {
	Target string `json:"target"` // Email or Phone
	Type   string `json:"type"`   // "email" or "phone"
}

type VerifySignupCodeRequest struct {
	Target string `json:"target"` // Email or Phone
	Type   string `json:"type"`   // "email" or "phone"
	Code   string `json:"code"`
}

type SignupRequest struct {
	Email           string  `json:"email"`
	LoginID         string  `json:"loginId,omitempty"`
	Password        string  `json:"password"`
	Name            string  `json:"name"`
	Phone           string  `json:"phone"`
	AffiliationType string  `json:"affiliationType"` // "AFFILIATE" or "GENERAL"
	TenantSlug      string  `json:"tenantSlug,omitempty"`
	CompanyCode     string  `json:"companyCode,omitempty"`
	Department      string  `json:"department"`
	Metadata        JSONMap `json:"metadata,omitempty"`
	TermsAccepted   bool    `json:"termsAccepted"`
}

// User Profile Models

type UserProfileResponse struct {
	ID                     string         `json:"id"`
	Email                  string         `json:"email"`
	LoginID                string         `json:"loginId,omitempty"`
	Name                   string         `json:"name"`
	Phone                  string         `json:"phone"`
	Role                   string         `json:"role"` // 추가
	SessionAuthenticatedAt string         `json:"sessionAuthenticatedAt,omitempty"`
	Department             string         `json:"department"`
	AffiliationType        string         `json:"affiliationType"`
	CompanyCode            string         `json:"companyCode,omitempty"`
	TenantID               *string        `json:"tenantId,omitempty"`        // 추가
	SessionTenantID        *string        `json:"sessionTenantId,omitempty"` // [New] 로그인에 사용된 식별자 기반 테넌트
	RelyingPartyID         *string        `json:"relyingPartyId,omitempty"`  // 추가
	Metadata               map[string]any `json:"metadata,omitempty"`
	Tenant                 *Tenant        `json:"tenant,omitempty"`
	ManageableTenants      []Tenant       `json:"manageableTenants,omitempty"` // 추가: 관리 가능한 테넌트 목록
	JoinedTenants          []Tenant       `json:"joinedTenants,omitempty"`     // [New] 다중 소속 테넌트 목록
}

type UpdateUserRequest struct {
	Name             string         `json:"name"`
	Phone            string         `json:"phone"`
	Department       string         `json:"department"`
	VerificationCode string         `json:"verificationCode,omitempty"` // For phone change
	Metadata         map[string]any `json:"metadata,omitempty"`
}

// PasswordResetInitiateRequest is the request body for initiating a password reset.
type PasswordResetInitiateRequest struct {
	LoginID string `json:"loginId"`
	DryRun  bool   `json:"dryRun,omitempty"`
	DrySend bool   `json:"drySend,omitempty"`
}

// PasswordResetCompleteRequest is the request body for completing a password reset.
type PasswordResetCompleteRequest struct {
	LoginID     string `json:"loginId"`
	NewPassword string `json:"newPassword"`
}

// PasswordChangeRequest는 로그인 상태에서 비밀번호 변경 요청을 표현합니다.
type PasswordChangeRequest struct {
	CurrentPassword string `json:"currentPassword"`
	NewPassword     string `json:"newPassword"`
}

type CheckLoginIDRequest struct {
	LoginID     string `json:"loginId"`
	TenantSlug  string `json:"tenantSlug,omitempty"`
	CompanyCode string `json:"companyCode,omitempty"`
}
