package contract

import (
	"time"

	"github.com/google/uuid"
)

type CreateUserRequest struct {
	OrganizationID uuid.UUID              `json:"organization_id"`
	OutletID       *uuid.UUID             `json:"outlet_id,omitempty"`
	Name           string                 `json:"name" validate:"required,min=1,max=255"`
	Email          string                 `json:"email" validate:"required,email"`
	Password       string                 `json:"password" validate:"required,min=6"`
	Role           string                 `json:"role" validate:"required,oneof=admin manager cashier waiter"`
	Permissions    map[string]interface{} `json:"permissions,omitempty"`
}

type UpdateUserRequest struct {
	Name        *string                 `json:"name,omitempty" validate:"omitempty,min=1,max=255"`
	Email       *string                 `json:"email,omitempty" validate:"omitempty,email"`
	Role        *string                 `json:"role,omitempty" validate:"omitempty,oneof=admin manager cashier waiter"`
	OutletID    *uuid.UUID              `json:"outlet_id,omitempty"`
	IsActive    *bool                   `json:"is_active,omitempty"`
	Permissions *map[string]interface{} `json:"permissions,omitempty"`
}

type ChangePasswordRequest struct {
	CurrentPassword string `json:"current_password" validate:"required"`
	NewPassword     string `json:"new_password" validate:"required,min=6"`
}

type UpdateUserOutletRequest struct {
	OutletID uuid.UUID `json:"outlet_id" validate:"required"`
}

type LoginRequest struct {
	Email    string `json:"email" validate:"required,email"`
	Password string `json:"password" validate:"required"`
}

type LoginResponse struct {
	Token     string       `json:"token"`
	ExpiresAt time.Time    `json:"expires_at"`
	User      UserResponse `json:"user"`
}

type UserResponse struct {
	ID             uuid.UUID              `json:"id"`
	OrganizationID uuid.UUID              `json:"organization_id"`
	OutletID       *uuid.UUID             `json:"outlet_id"`
	Name           string                 `json:"name"`
	Email          string                 `json:"email"`
	Role           string                 `json:"role"`
	Permissions    map[string]interface{} `json:"permissions"`
	IsActive       bool                   `json:"is_active"`
	CreatedAt      time.Time              `json:"created_at"`
	UpdatedAt      time.Time              `json:"updated_at"`
}

type ListUsersRequest struct {
	Page           int        `json:"page" validate:"min=1"`
	Limit          int        `json:"limit" validate:"min=1,max=100"`
	Role           *string    `json:"role,omitempty"`
	OutletID       *uuid.UUID `json:"outlet_id,omitempty"`
	IsActive       *bool      `json:"is_active,omitempty"`
	OrganizationID *uuid.UUID `json:"organization_id,omitempty"`
}

type ListUsersResponse struct {
	Users      []UserResponse     `json:"users"`
	Pagination PaginationResponse `json:"pagination"`
}
