package domain

import (
	"time"

	"github.com/google/uuid"
)

// User represents a user in the system
type User struct {
	ID                   uuid.UUID  `json:"id" db:"id"`
	TenantID             *uuid.UUID `json:"tenant_id,omitempty" db:"tenant_id"`
	Email                string     `json:"email" db:"email"`
	Password             string     `json:"-" db:"password_hash"`
	Name                 string     `json:"name" db:"first_name"`
	Role                 string     `json:"role" db:"role"` // SUPERADMIN, ADMIN_AGENCIA, CLIENTE
	AgencyRole           string     `json:"agency_role" db:"agency_role"` // owner or collaborator (only for ADMIN_AGENCIA)
	CreatedBy            *uuid.UUID `json:"created_by,omitempty" db:"created_by"` // Which owner created this collaborator
	CollaboratorCreatedAt *time.Time `json:"collaborator_created_at,omitempty" db:"collaborator_created_at"` // When collaborator was added
	CreatedAt            time.Time  `json:"created_at" db:"created_at"`
	UpdatedAt            time.Time  `json:"updated_at" db:"updated_at"`
}

// CreateUserRequest represents the request to create a new user
type CreateUserRequest struct {
	Email    string `json:"email"`
	Password string `json:"password"`
	Name     string `json:"name"`
	Role     string `json:"role,omitempty"` // Optional, defaults to CLIENTE
}

// RegisterAgencyRequest represents agency registration (SUPERADMIN only)
type RegisterAgencyRequest struct {
	// Agência
	AgencyName  string `json:"agencyName"`
	Subdomain   string `json:"subdomain"`
	CNPJ        string `json:"cnpj"`
	RazaoSocial string `json:"razaoSocial"`
	Description string `json:"description"`
	Website     string `json:"website"`
	Industry    string `json:"industry"`
	Phone       string `json:"phone"`
	TeamSize    string `json:"teamSize"`
	
	// Endereço
	CEP          string `json:"cep"`
	State        string `json:"state"`
	City         string `json:"city"`
	Neighborhood string `json:"neighborhood"`
	Street       string `json:"street"`
	Number       string `json:"number"`
	Complement   string `json:"complement"`
	
	// Personalização
	PrimaryColor      string `json:"primaryColor"`
	SecondaryColor    string `json:"secondaryColor"`
	LogoURL           string `json:"logoUrl"`
	LogoHorizontalURL string `json:"logoHorizontalUrl"`
	
	// Admin da Agência
	AdminEmail    string `json:"adminEmail"`
	AdminPassword string `json:"adminPassword"`
	AdminName     string `json:"adminName"`
}

// PublicRegisterAgencyRequest represents the public signup payload
type PublicRegisterAgencyRequest struct {
	// User
	Email    string `json:"email"`
	Password string `json:"password"`
	FullName string `json:"fullName"`
	Newsletter bool `json:"newsletter"`

	// Company
	CompanyName string `json:"companyName"`
	CNPJ        string `json:"cnpj"`
	RazaoSocial string `json:"razaoSocial"`
	Description string `json:"description"`
	Website     string `json:"website"`
	Industry    string `json:"industry"`
	TeamSize    string `json:"teamSize"`

	// Address
	CEP          string `json:"cep"`
	State        string `json:"state"`
	City         string `json:"city"`
	Neighborhood string `json:"neighborhood"`
	Street       string `json:"street"`
	Number       string `json:"number"`
	Complement   string `json:"complement"`
	
	// Contacts (simplified for now, taking the first one as phone if available)
	Contacts []struct {
		ID       int    `json:"id"`
		Whatsapp string `json:"whatsapp"`
	} `json:"contacts"`

	// Domain
	Subdomain string `json:"subdomain"`

	// Branding
	PrimaryColor   string `json:"primaryColor"`
	SecondaryColor string `json:"secondaryColor"`
	LogoURL        string `json:"logoUrl"`
}

// RegisterClientRequest represents client registration (ADMIN_AGENCIA only)
type RegisterClientRequest struct {
	Email    string `json:"email"`
	Password string `json:"password"`
	Name     string `json:"name"`
}

// LoginRequest represents the login request
type LoginRequest struct {
	Email    string `json:"email"`
	Password string `json:"password"`
}

// LoginResponse represents the login response
type LoginResponse struct {
	Token     string  `json:"token"`
	User      User    `json:"user"`
	Subdomain *string `json:"subdomain,omitempty"`
}
