package mservice

import "github.com/tech/sendico/pkg/merrors"

type Type = string

const (
	Accounts            Type = "accounts"               // Represents user accounts in the system
	Amplitude           Type = "amplitude"              // Represents analytics integration with Amplitude
	Site                Type = "site"                   // Represents public site endpoints
	Automations         Type = "automation"             // Represents automation workflows
	Changes             Type = "changes"                // Tracks changes made to resources
	Clients             Type = "clients"                // Represents client information
	Comments            Type = "comments"               // Represents comments on tasks or other resources
	ChainGateway        Type = "chain_gateway"          // Represents chain gateway microservice
	FXOracle            Type = "fx_oracle"              // Represents FX oracle microservice
	FeePlans            Type = "fee_plans"              // Represents fee plans microservice
	FilterProjects      Type = "filter_projects"        // Represents comments on tasks or other resources
	Invitations         Type = "invitations"            // Represents invitations sent to users
	Invoices            Type = "invoices"               // Represents invoices
	Logo                Type = "logo"                   // Represents logos for organizations or projects
	Ledger              Type = "ledger"                 // Represents ledger microservice
	LedgerAccounts      Type = "ledger_accounts"        // Represents ledger accounts microservice
	LedgerBalances      Type = "ledger_balances"        // Represents ledger account balances microservice
	LedgerEntries       Type = "ledger_journal_entries" // Represents ledger journal entries microservice
	LedgerOutbox        Type = "ledger_outbox"          // Represents ledger outbox microservice
	LedgerParties       Type = "ledger_parties"         // Represents ledger account owner parties microservice
	LedgerPlines        Type = "ledger_posting_lines"   // Represents ledger journal posting lines microservice
	PaymentOrchestrator Type = "payment_orchestrator"   // Represents payment orchestration microservice
	ChainWallets        Type = "chain_wallets"          // Represents managed chain wallets
	ChainWalletBalances Type = "chain_wallet_balances"  // Represents managed chain wallet balances
	ChainTransfers      Type = "chain_transfers"        // Represents chain transfers
	ChainDeposits       Type = "chain_deposits"         // Represents chain deposits
	Notifications       Type = "notifications"          // Represents notifications sent to users
	Organizations       Type = "organizations"          // Represents organizations in the system
	Payments            Type = "payments"               // Represents payments service
	Permissions         Type = "permissions"            // Represents permissiosns service
	Policies            Type = "policies"               // Represents access control policies
	PolicyAssignements  Type = "policy_assignments"     // Represents policy assignments database
	Priorities          Type = "priorities"             // Represents object properties
	PriorityGroups      Type = "priority_groups"        // Represents task or project priorities
	Projects            Type = "projects"               // Represents projects managed in the system
	PropertyBindings    Type = "property_bindings"      // Represents properties bindings of resources
	PropertySchemas     Type = "property_schemas"       // Represents properties or attributes of resources
	Properties          Type = "properties"             // Represents property values of the propertites of specific objects
	Reactions           Type = "reactions"              // Represents comment reactions
	RefreshTokens       Type = "refresh_tokens"         // Represents refresh tokens for authentication
	Roles               Type = "roles"                  // Represents roles in access control
	Statuses            Type = "statuses"               // Represents statuses of tasks or projects
	StatusGroups        Type = "status_groups"          // Represents status groups
	Steps               Type = "steps"                  // Represents steps in workflows or processes
	Storage             Type = "storage"                // Represents statuses of tasks or projects
	Tags                Type = "tags"                   // Represents tags managed in the system
	Tasks               Type = "tasks"                  // Represents tasks managed in the system
	Teams               Type = "teams"                  // Represents teams managed in the system
	Tenants             Type = "tenants"                // Represents tenants managed in the system
	Workflows           Type = "workflows"              // Represents workflows for tasks or projects
	Workspaces          Type = "workspaces"             // Represents workspaces containing projects and teams
)

func StringToSType(s string) (Type, error) {
	switch Type(s) {
	case Accounts, Amplitude, Site, Automations, Changes, Clients, Comments, ChainGateway, ChainWallets, ChainWalletBalances,
		ChainTransfers, ChainDeposits, FXOracle, FeePlans, FilterProjects, Invitations, Invoices, Logo, Ledger,
		LedgerAccounts, LedgerBalances, LedgerEntries, LedgerOutbox, LedgerParties, LedgerPlines, Notifications,
		Organizations, Payments, PaymentOrchestrator, Permissions, Policies, PolicyAssignements, Priorities,
		PriorityGroups, Projects, PropertyBindings, PropertySchemas, Properties, Reactions, RefreshTokens, Roles,
		Statuses, StatusGroups, Steps, Storage, Tags, Tasks, Teams, Tenants, Workflows, Workspaces:
		return Type(s), nil
	default:
		return "", merrors.DataConflict("invalid service type: " + s)
	}
}
