package api

type MeResponse struct {
	Account            AccountResponse `json:"account"`
	RateLimitPerMinute int             `json:"rate_limit_per_minute"`
	ActiveSession      any             `json:"active_session"`
	Product            *ProductMeInfo  `json:"product"`
}

type AccountResponse struct {
	ID        int64       `json:"id"`
	Email     string      `json:"email"`
	IsActive  bool        `json:"is_active"`
	CreatedAt APIDateTime `json:"created_at"`
}

type ProductMeInfo struct {
	Name         *string          `json:"name"`
	Role         string           `json:"role"`
	Status       string           `json:"status"`
	Subscription SubscriptionInfo `json:"subscription"`
	Limits       LimitsInfo       `json:"limits"`
	Access       AccessInfo       `json:"access"`
}

type SubscriptionInfo struct {
	Plan     string     `json:"plan"`
	PlanName string     `json:"plan_name"`
	Status   string     `json:"status"`
	EndsAt   *APIDateTime `json:"ends_at"`
}

type LimitsInfo struct {
	MaxActiveLeads    int  `json:"max_active_leads"`
	ActiveLeadsCount  int  `json:"active_leads_count"`
	SlotsRemaining    int  `json:"slots_remaining"`
	MaxAddPerDay      *int `json:"max_add_per_day"`
	AddedToday        int  `json:"added_today"`
	CanExport         bool `json:"can_export"`
	ExportsToday      int  `json:"exports_today"`
	MaxExportPerDay   int  `json:"max_export_per_day"`
	MaxSearchPageSize int  `json:"max_search_page_size"`
}

type AccessInfo struct {
	CanUseApp bool    `json:"can_use_app"`
	Reason    *string `json:"reason"`
}

type MaskedCompanyOut struct {
	CNPJMasked     string  `json:"cnpj_masked"`
	CNPJ           *string `json:"cnpj"`
	CompanyName    *string `json:"company_name"`
	City           *string `json:"city"`
	UF             *string `json:"uf"`
	CNAEPrincipal  *string `json:"cnae_principal"`
	HasPhone       bool    `json:"has_phone"`
	HasEmail       bool    `json:"has_email"`
	HasWhatsApp    bool    `json:"has_whatsapp"`
	AlreadyWorking bool    `json:"already_working"`
}

type MaskedSearchOut struct {
	Items      []MaskedCompanyOut `json:"items"`
	Total      *int               `json:"total"`
	NextCursor *string            `json:"next_cursor"`
	HasMore    bool               `json:"has_more"`
}

type KanbanBoardOut struct {
	Columns map[string][]KanbanCardOut `json:"columns"`
	Meta    KanbanMetaOut              `json:"meta"`
}

type LeadTagOut struct {
	ID    int64  `json:"id"`
	Name  string `json:"name"`
	Color string `json:"color"`
}

type KanbanCardOut struct {
	ID              int64        `json:"id"`
	CNPJ            string       `json:"cnpj"`
	CompanyName     *string      `json:"company_name"`
	City            *string      `json:"city"`
	UF              *string      `json:"uf"`
	HasPhone        bool         `json:"has_phone"`
	HasEmail        bool         `json:"has_email"`
	ResponsibleName *string      `json:"responsible_name"`
	Temperature     *int         `json:"temperature"`
	Phones          []string     `json:"phones"`
	Emails          []string     `json:"emails"`
	Tags            []LeadTagOut `json:"tags"`
	Notes           *string      `json:"notes"`
	WorkedAt        APIDateTime  `json:"worked_at"`
	StageChangedAt  APIDateTime  `json:"stage_changed_at"`
	Stage           string       `json:"stage,omitempty"`
}

type KanbanMetaOut struct {
	ActiveCount    int `json:"active_count"`
	SlotsRemaining int `json:"slots_remaining"`
}

type LeadCardOut struct {
	ID              int64        `json:"id"`
	CNPJ            string       `json:"cnpj"`
	CompanyName     *string      `json:"company_name"`
	City            *string      `json:"city"`
	UF              *string      `json:"uf"`
	HasPhone        bool         `json:"has_phone"`
	HasEmail        bool         `json:"has_email"`
	ResponsibleName *string      `json:"responsible_name"`
	Temperature     *int         `json:"temperature"`
	Phones          []string     `json:"phones"`
	Emails          []string     `json:"emails"`
	Tags            []LeadTagOut `json:"tags"`
	Stage           string       `json:"stage"`
	WorkedAt        APIDateTime  `json:"worked_at"`
	StageChangedAt  APIDateTime  `json:"stage_changed_at"`
	Notes           *string      `json:"notes"`
}

type LeadListOut struct {
	Items []LeadCardOut `json:"items"`
}

type LeadDetailOut struct {
	Lead            LeadCardOut              `json:"lead"`
	Estabelecimento EstabelecimentoDetailOut `json:"estabelecimento"`
}

type LeadWorkRequest struct {
	CNPJ string `json:"cnpj"`
}

type LeadWorkResponse struct {
	Lead            LeadCardOut              `json:"lead"`
	Estabelecimento EstabelecimentoDetailOut `json:"estabelecimento"`
}

type LeadStageUpdate struct {
	Stage string `json:"stage"`
}

type LeadUpdateNotes struct {
	Notes *string `json:"notes"`
}

type LeadUpdate struct {
	Notes           *string  `json:"notes,omitempty"`
	CompanyName     *string  `json:"company_name,omitempty"`
	City            *string  `json:"city,omitempty"`
	UF              *string  `json:"uf,omitempty"`
	ResponsibleName *string  `json:"responsible_name,omitempty"`
	Temperature     *int     `json:"temperature,omitempty"`
	PhonesOverride  *[]string `json:"phones_override,omitempty"`
	EmailsOverride  *[]string `json:"emails_override,omitempty"`
	TagIDs          []int64  `json:"tag_ids,omitempty"`
}

type TagOut struct {
	ID    int64  `json:"id"`
	Name  string `json:"name"`
	Color string `json:"color"`
}

type TagCreate struct {
	Name  string `json:"name"`
	Color string `json:"color"`
}

type TagUpdate struct {
	Name  *string `json:"name,omitempty"`
	Color *string `json:"color,omitempty"`
}

type LeadHistoryEntry struct {
	Stage     string      `json:"stage"`
	ChangedAt APIDateTime `json:"changed_at"`
}

type LeadHistoryOut struct {
	Items []LeadHistoryEntry `json:"items"`
}

type TemplateOut struct {
	ID        int64     `json:"id"`
	Name      string    `json:"name"`
	Body      string    `json:"body"`
	IsDefault bool      `json:"is_default"`
	CreatedAt APIDateTime `json:"created_at"`
	UpdatedAt APIDateTime `json:"updated_at"`
}

type TemplateCreate struct {
	Name      string `json:"name"`
	Body      string `json:"body"`
	IsDefault bool   `json:"is_default"`
}

type TemplateUpdate struct {
	Name      *string `json:"name,omitempty"`
	Body      *string `json:"body,omitempty"`
	IsDefault *bool   `json:"is_default,omitempty"`
}

type ExportJobOut struct {
	ID        int64     `json:"id"`
	RowCount  int       `json:"row_count"`
	CreatedAt APIDateTime `json:"created_at"`
}

type ExportListOut struct {
	Items []ExportJobOut `json:"items"`
}

type ExportCreateRequest struct {
	LeadIDs []int64 `json:"lead_ids"`
}

type StatsOverviewOut struct {
	ActiveLeads     int     `json:"active_leads"`
	FinishedLeads   int     `json:"finished_leads"`
	SlotsRemaining  int     `json:"slots_remaining"`
	AddedToday      int     `json:"added_today"`
	ContactsToday   int     `json:"contacts_today"`
	ConversionRate  float64 `json:"conversion_rate"`
}

type ContactWhatsAppOut struct {
	URL     string  `json:"url"`
	Message string  `json:"message"`
	Phone   *string `json:"phone"`
}

type ContactWhatsAppRequest struct {
	TemplateID *int64 `json:"template_id"`
	PhoneIndex int    `json:"phone_index"`
}

type ContactEmailOut struct {
	MailtoURL *string `json:"mailto_url"`
	Email     string  `json:"email"`
	Subject   string  `json:"subject"`
	Body      string  `json:"body"`
}

type ContactEmailRequest struct {
	TemplateID *int64 `json:"template_id"`
	EmailIndex int    `json:"email_index"`
}

type AdminUserOut struct {
	ID                 int64     `json:"id"`
	Email              string    `json:"email"`
	Name               *string   `json:"name"`
	Role               string    `json:"role"`
	Status             string    `json:"status"`
	IsActive           bool      `json:"is_active"`
	PlanSlug           *string   `json:"plan_slug"`
	SubscriptionStatus *string   `json:"subscription_status"`
	CreatedAt          APIDateTime `json:"created_at"`
}

type AdminUserListOut struct {
	Items []AdminUserOut `json:"items"`
}

type AdminMetricsOut struct {
	TotalUsers          int `json:"total_users"`
	ActiveSubscriptions int `json:"active_subscriptions"`
	LeadsAddedToday     int `json:"leads_added_today"`
	ExportsToday        int `json:"exports_today"`
}

type AdminPlanOut struct {
	ID              int64 `json:"id"`
	Slug            string `json:"slug"`
	Name            string `json:"name"`
	MaxActiveLeads  int   `json:"max_active_leads"`
	MaxAddPerDay    *int  `json:"max_add_per_day"`
	MaxExportPerDay int   `json:"max_export_per_day"`
	CanExport       bool  `json:"can_export"`
	PriceCents      int   `json:"price_cents"`
	IsActive        bool  `json:"is_active"`
}

type AdminStatusUpdate struct {
	Status string `json:"status"`
}

type AdminSubscriptionUpdate struct {
	PlanSlug string `json:"plan_slug"`
	Status   string `json:"status"`
}

type UpdateMeRequest struct {
	Name *string `json:"name"`
}

type ProductErrorBody struct {
	Error struct {
		Code    string `json:"code"`
		Message string `json:"message"`
	} `json:"error"`
}
