package account

import (
	"time"
	"api_yal/internal/models"
)

// ==================== Request DTOs ====================

// CreateAccountRequest - DTO для создания нового аккаунта
type CreateAccountRequest struct {
	Email     string `json:"email" validate:"required,email"`
	Password  string `json:"password" validate:"required,min=6"`
	FullName  string `json:"full_name" validate:"required"`
	FirstName string `json:"first_name" validate:"required"`
	LastName  string `json:"last_name" validate:"required"`
	Phone     string `json:"phone"`
	City      string `json:"city"`

	// Бизнес информация
	OrganizationForm  string `json:"organization_form"`
	OrganizationName  string `json:"organization_name"`
	OrganizationShort string `json:"organization_short"`
	INN               string `json:"inn"`
	PersonalINN       string `json:"personal_inn"`
}

// UpdateAccountRequest - DTO для обновления аккаунта
type UpdateAccountRequest struct {
	FullName  string `json:"full_name"`
	FirstName string `json:"first_name"`
	LastName  string `json:"last_name"`
	Phone     string `json:"phone"`
	City      string `json:"city"`

	// Бизнес информация
	OrganizationForm  string `json:"organization_form"`
	OrganizationName  string `json:"organization_name"`
	OrganizationShort string `json:"organization_short"`
	INN               string `json:"inn"`
	PersonalINN       string `json:"personal_inn"`
}

// ChangePasswordRequest - DTO для смены пароля
type ChangePasswordRequest struct {
	CurrentPassword string `json:"current_password" validate:"required"`
	NewPassword     string `json:"new_password" validate:"required,min=6"`
}

// ForgotPasswordRequest - DTO для запроса сброса пароля
type ForgotPasswordRequest struct {
	Email string `json:"email" validate:"required,email"`
}

// ResetPasswordRequest - DTO для сброса пароля по токену
type ResetPasswordRequest struct {
	Token       string `json:"token" validate:"required"`
	NewPassword string `json:"new_password" validate:"required,min=6"`
}

// VerifyAccountRequest - DTO для верификации аккаунта (админ)
type VerifyAccountRequest struct {
	IsVerified bool `json:"is_verified"`
}

// UpdateAccountStatusRequest - DTO для изменения статуса аккаунта (админ)
type UpdateAccountStatusRequest struct {
	IsActive bool   `json:"is_active"`
	Role     string `json:"role" validate:"omitempty,oneof=user admin moderator"`
}

// ListAccountsRequest - DTO для фильтрации списка аккаунтов
type ListAccountsRequest struct {
	Page     int    `form:"page" validate:"min=1"`
	PageSize int    `form:"page_size" validate:"min=1,max=100"`
	Search   string `form:"search"`
	Role     string `form:"role" validate:"omitempty,oneof=user admin moderator"`
	IsActive *bool  `form:"is_active"`
}

// ==================== Response DTOs ====================

// AccountResponse - базовый DTO для ответа с данными аккаунта (без чувствительной информации)
type AccountResponse struct {
	ID        uint      `json:"id"`
	CreatedAt time.Time `json:"created_at"`
	UpdatedAt time.Time `json:"updated_at"`

	// Основная информация
	Email     string `json:"email"`
	FullName  string `json:"full_name"`
	FirstName string `json:"first_name"`
	LastName  string `json:"last_name"`
	Phone     string `json:"phone"`
	City      string `json:"city"`

	// Бизнес информация
	OrganizationForm  string `json:"organization_form,omitempty"`
	OrganizationName  string `json:"organization_name,omitempty"`
	OrganizationShort string `json:"organization_short,omitempty"`
	INN               string `json:"inn,omitempty"`
	PersonalINN       string `json:"personal_inn,omitempty"`

	// Статус
	IsActive   bool   `json:"is_active"`
	IsVerified bool   `json:"is_verified"`
	Role       string `json:"role"`
}

// AccountWithObjectsResponse - DTO с объектами аккаунта
type AccountWithObjectsResponse struct {
	AccountResponse
	Objects []ObjectBriefResponse `json:"objects,omitempty"`
}

// ObjectBriefResponse - краткая информация об объекте для вложенных ответов
type ObjectBriefResponse struct {
	ID        uint   `json:"id"`
	ShortName string `json:"short_name"`
	LongName  string `json:"long_name"`
	Type      string `json:"type"`
	IsActive  bool   `json:"is_active"`
	Address   string `json:"address"`
}

// AccountListResponse - DTO для списка аккаунтов с пагинацией
type AccountListResponse struct {
	Items      []AccountResponse `json:"items"`
	Total      int64             `json:"total"`
	Page       int               `json:"page"`
	PageSize   int               `json:"page_size"`
	TotalPages int               `json:"total_pages"`
}

// AccountProfileResponse - DTO для личного кабинета (более детальная информация)
type AccountProfileResponse struct {
	AccountResponse
	Stats AccountStats `json:"stats"`
}

// AccountStats - статистика аккаунта
type AccountStats struct {
	ObjectsCount   int `json:"objects_count"`
	FeedbacksCount int `json:"feedbacks_count"`
	CommentsCount  int `json:"comments_count"`
	RatingsCount   int `json:"ratings_count"`
	AppealsCount   int `json:"appeals_count"`
}

// AuthResponse - DTO для ответа при авторизации
type AuthResponse struct {
	Token     string          `json:"token"`
	TokenType string          `json:"token_type"`
	ExpiresAt int64           `json:"expires_at"`
	Account   AccountResponse `json:"account"`
}

// PasswordResetResponse - DTO для ответа о сбросе пароля
type PasswordResetResponse struct {
	Message string `json:"message"`
	Token   string `json:"token,omitempty"` // только при создании, не для продакшена
}

// ==================== Helper functions ====================

// ToAccountResponse преобразует модель Account в AccountResponse
func ToAccountResponse(account *models.Account) AccountResponse {
	return AccountResponse{
		ID:                account.ID,
		CreatedAt:         account.CreatedAt,
		UpdatedAt:         account.UpdatedAt,
		Email:             account.Email,
		FullName:          account.FullName,
		FirstName:         account.FirstName,
		LastName:          account.LastName,
		Phone:             account.Phone,
		City:              account.City,
		OrganizationForm:  account.OrganizationForm,
		OrganizationName:  account.OrganizationName,
		OrganizationShort: account.OrganizationShort,
		INN:               account.INN,
		PersonalINN:       account.PersonalINN,
		IsActive:          account.IsActive,
		IsVerified:        account.IsVerified,
		Role:              account.Role,
	}
}

// ToAccountWithObjectsResponse преобразует модель Account в AccountWithObjectsResponse
func ToAccountWithObjectsResponse(account *models.Account) AccountWithObjectsResponse {
	resp := AccountWithObjectsResponse{
		AccountResponse: ToAccountResponse(account),
		Objects:         make([]ObjectBriefResponse, 0, len(account.Objects)),
	}

	for _, obj := range account.Objects {
		resp.Objects = append(resp.Objects, ObjectBriefResponse{
			ID:        obj.ID,
			ShortName: obj.ShortName,
			LongName:  obj.LongName,
			Type:      obj.Type,
			IsActive:  obj.IsActive,
			Address:   obj.Address,
		})
	}

	return resp
}

// ToObjectBriefResponse преобразует модель Object в ObjectBriefResponse
func ToObjectBriefResponse(object *models.Object) ObjectBriefResponse {
	return ObjectBriefResponse{
		ID:        object.ID,
		ShortName: object.ShortName,
		LongName:  object.LongName,
		Type:      object.Type,
		IsActive:  object.IsActive,
		Address:   object.Address,
	}
}