package usecase

import (
	"context"

	"backend/pkg/member/domain/member"
)

// AccountUseCase 定義了帳號服務的操作方法
type AccountUseCase interface {
	MemberUseCase
	BindingMemberUseCase
	VerifyMemberUseCase
	UIDGenerateUseCase
}

type MemberUseCase interface {
	// CreateUserAccount 創建用戶帳號
	CreateUserAccount(ctx context.Context, req CreateLoginUserRequest) error
	// GetUIDByAccount 通過帳號取得 UID
	GetUIDByAccount(ctx context.Context, req GetUIDByAccountRequest) (GetUIDByAccountResponse, error)
	// GetUserAccountInfo 取得用戶帳號資訊
	GetUserAccountInfo(ctx context.Context, req GetUIDByAccountRequest) (GetAccountInfoResponse, error)
	// UpdateUserToken 更新用戶 Token （密碼）
	UpdateUserToken(ctx context.Context, req UpdateTokenRequest) error
	// UpdateUserInfo 更新用戶資訊
	UpdateUserInfo(ctx context.Context, req *UpdateUserInfoRequest) error
	// UpdateStatus 更新用戶狀態
	UpdateStatus(ctx context.Context, req UpdateStatusRequest) error
	// GetUserInfo 取得用戶資訊
	GetUserInfo(ctx context.Context, req GetUserInfoRequest) (UserInfo, error)
	// ListMember 取得會員列表
	ListMember(ctx context.Context, req ListUserInfoRequest) (ListUserInfoResponse, error)
	// FindLoginIDByUID 取得login id
	FindLoginIDByUID(ctx context.Context, uid string) (BindingUser, error)
}

type BindingMemberUseCase interface {
	// BindUserInfo 綁定用戶信息
	BindUserInfo(ctx context.Context, req CreateUserInfoRequest) error
	// BindAccount 綁定帳號到 UID
	BindAccount(ctx context.Context, req BindingUser) (BindingUser, error)
	// BindVerifyEmail 驗證Email 後綁定到會員
	BindVerifyEmail(ctx context.Context, uid, email string) error
	// BindVerifyPhone 驗證 Phone 後綁定到會員
	BindVerifyPhone(ctx context.Context, uid, phone string) error
}

// CreateUserInfoRequest 用於創建用戶詳細信息
type CreateUserInfoRequest struct {
	UID               string           `json:"uid"`                    // 用戶 UID
	AvatarURL         *string          `json:"avatar_url,omitempty"`   // 頭像 URL（可選）
	FullName          *string          `json:"full_name,omitempty"`    // 用戶全名
	Nickname          *string          `json:"nickname,omitempty"`     // 暱稱（可選）
	GenderCode        *int64           `json:"gender_code,omitempty"`  // 性別代碼
	Birthdate         *int64           `json:"birthdate,omitempty"`    // 生日 (格式: 19930417)
	PhoneNumber       *string          `json:"phone_number,omitempty"` // 電話
	Email             *string          `json:"email,omitempty"`        // 電話
	Address           *string          `json:"address,omitempty"`      // 地址
	AlarmCategory     member.AlarmType `json:"alarm_category"`         // 警報類型
	UserStatus        member.Status    `json:"user_status"`            // 用戶狀態
	PreferredLanguage string           `json:"preferred_language"`     // 使用語言
	Currency          string           `json:"currency"`               // 使用幣種
}

type UserInfo struct {
	CreateUserInfoRequest
	CreateTime int64 `json:"create_time"` // 創建時間
	UpdateTime int64 `json:"update_time"` // 更新時間
}

type UpdateUserInfoRequest struct {
	UID               string            `json:"uid"`                          // 用戶 UID
	AvatarURL         *string           `json:"avatar_url,omitempty"`         // 頭像 URL（可選）
	FullName          *string           `json:"full_name,omitempty"`          // 用戶全名
	Nickname          *string           `json:"nickname,omitempty"`           // 暱稱（可選）
	GenderCode        *int8             `json:"gender_code,omitempty"`        // 性別代碼
	Birthdate         *int64            `json:"birthdate,omitempty"`          // 生日 (格式: 19930417)
	Address           *string           `json:"address,omitempty"`            // 地址
	AlarmCategory     *member.AlarmType `json:"alarm_category,omitempty"`     // 警報類型
	UserStatus        *member.Status    `json:"user_status,omitempty"`        // 用戶狀態
	PreferredLanguage *string           `json:"preferred_language,omitempty"` // 使用語言
	Currency          *string           `json:"currency,omitempty"`           // 使用幣種
}

type CreateLoginUserRequest struct {
	LoginID  string          `json:"login_id"` // 登錄 ID
	Platform member.Platform `json:"platform"` // 平台類型
	Token    string          `json:"token"`    // 驗證 Token
}

// BindingUser 用於綁定用戶帳號
type BindingUser struct {
	UID     string             `json:"uid"`      // 用戶 UID
	LoginID string             `json:"login_id"` // 登錄 ID
	Type    member.AccountType `json:"type"`     // 綁定類型
}

// GetUIDByAccountRequest 用於通過帳號獲取用戶 UID
type GetUIDByAccountRequest struct {
	Account string `json:"account"` // 帳號
}

// GetUIDByAccountResponse 用於返回帳號對應的 UID 信息
type GetUIDByAccountResponse struct {
	UID     string `json:"uid"`     // 用戶 UID
	Account string `json:"account"` // 帳號
}

// GetAccountInfoResponse 用於返回用戶帳號信息
type GetAccountInfoResponse struct {
	Data CreateLoginUserRequest `json:"data"` // 登錄用戶信息
}

// UpdateTokenRequest 用於更新用戶 Token
type UpdateTokenRequest struct {
	Account  string `json:"account"`  // 帳號
	Token    string `json:"token"`    // 新 Token
	Platform int64  `json:"platform"` // 平台類型
}

// GenerateRefreshCodeRequest 用於請求產生刷新代碼
type GenerateRefreshCodeRequest struct {
	LoginID  string                  `json:"login_id"`  // 帳號
	CodeType member.GenerateCodeType `json:"code_type"` // 代碼類型
}

// VerifyCode 用於表示驗證代碼
type VerifyCode struct {
	VerifyCode string `json:"verify_code"` // 驗證碼
}

// GenerateRefreshCodeResponse 用於返回生成的驗證代碼
type GenerateRefreshCodeResponse struct {
	Data VerifyCode `json:"data"` // 驗證碼數據
}

// VerifyRefreshCodeRequest 用於驗證刷新代碼
type VerifyRefreshCodeRequest struct {
	LoginID    string                  `json:"Login_id"`    // 帳號
	CodeType   member.GenerateCodeType `json:"code_type"`   // 代碼類型
	VerifyCode string                  `json:"verify_code"` // 驗證碼
}

// UpdateStatusRequest 用於更新用戶狀態
type UpdateStatusRequest struct {
	UID    string        `json:"uid"`    // 用戶 UID
	Status member.Status `json:"status"` // 用戶狀態
}

// GetUserInfoRequest 用於請求取得用戶詳細信息
type GetUserInfoRequest struct {
	UID      string `json:"uid,omitempty"`       // 用戶 UID
	NickName string `json:"nick_name,omitempty"` // 暱稱（可選）
}

// GetUserInfoResponse 用於返回用戶詳細信息
type GetUserInfoResponse struct {
	Data UserInfo `json:"data"` // 用戶信息
}

// ListUserInfoRequest 用於查詢符合條件的用戶列表
type ListUserInfoRequest struct {
	VerificationType *member.AccountType `json:"verification_type,omitempty"` // 驗證類型（可選）
	AlarmCategory    *member.AlarmType   `json:"alarm_category,omitempty"`    // 警報類型（可選）
	UserStatus       *member.Status      `json:"user_status,omitempty"`       // 用戶狀態（可選）
	CreateStartTime  *int64              `json:"create_start_time,omitempty"` // 創建開始時間（可選）
	CreateEndTime    *int64              `json:"create_end_time,omitempty"`   // 創建結束時間（可選）
	PageSize         int64               `json:"page_size"`                   // 每頁大小
	PageIndex        int64               `json:"page_index"`                  // 當前頁索引
}

// ListUserInfoResponse 用於返回查詢的用戶列表及分頁信息
type ListUserInfoResponse struct {
	Data []UserInfo `json:"data"` // 用戶列表
	Page Pager      `json:"page"` // 分頁信息
}

// VerifyAuthResultRequest 用於請求驗證授權結果
type VerifyAuthResultRequest struct {
	Token   string `json:"token"`   // 驗證 Token
	Account string `json:"account"` // 帳號
}

// VerifyAuthResultResponse 用於返回授權驗證結果
type VerifyAuthResultResponse struct {
	Status bool `json:"status"` // 驗證結果狀態
}

// TwitterAccessTokenResponse 用於返回 Twitter 授權令牌
type TwitterAccessTokenResponse struct {
	Token string `json:"token"` // 授權 Token
}

type GoogleTokenInfo struct {
	Iss           string `json:"iss"`            // 發行者 (issuer) 通常為 "https://accounts.google.com"
	Sub           string `json:"sub"`            // 使用者唯一 ID
	Aud           string `json:"aud"`            // Audience，應該與你的 Client ID 匹配
	Exp           string `json:"exp"`            // 過期時間 (UNIX timestamp)
	Iat           string `json:"iat"`            // 發行時間 (UNIX timestamp)
	Email         string `json:"email"`          // 使用者的電子郵件
	EmailVerified string `json:"email_verified"` // 郵件是否已驗證
	Name          string `json:"name"`           // 使用者的名稱
	Picture       string `json:"picture"`        // 使用者的頭像 URL
}

type LineAccessTokenResponse struct {
	AccessToken  string `json:"access_token"`
	IDToken      string `json:"id_token"`
	ExpiresIn    int    `json:"expires_in"`
	TokenType    string `json:"token_type"`
	Scope        string `json:"scope"`
	RefreshToken string `json:"refresh_token"`
}

type LineUserProfile struct {
	UserID        string `json:"userId"`
	DisplayName   string `json:"displayName"`
	PictureURL    string `json:"pictureUrl"`
	StatusMessage string `json:"statusMessage"`
}
