import { z } from 'zod';
import { Uuid, DecimalString } from './common';
import { TENANT_STATUS, SUBSCRIPTION_STATUS } from '../enums';

export const PlanLimitsSchema = z.object({
  maxWarehouses: z.number().int().min(1).default(1),
  maxUsers: z.number().int().min(1).default(10),
  maxStorers: z.number().int().min(1).default(5),
  maxOrdersPerMonth: z.number().int().min(0).default(5000),
  maxApiCallsPerDay: z.number().int().min(0).default(50000),
  aiTokensPerMonth: z.number().int().min(0).default(0),
});
export type PlanLimits = z.infer<typeof PlanLimitsSchema>;

export const CreatePlanSchema = z.object({
  code: z.string().trim().min(1).max(30).regex(/^[A-Z0-9_]+$/),
  name: z.string().min(1).max(100),
  description: z.string().max(1000).optional(),
  monthlyPrice: DecimalString.default('0'),
  currency: z.string().length(3).default('USD'),
  limits: PlanLimitsSchema.default({}),
  features: z.array(z.string()).default([]),
  active: z.boolean().default(true),
});
export type CreatePlanDto = z.infer<typeof CreatePlanSchema>;
export const UpdatePlanSchema = CreatePlanSchema.partial();

/** Provisioning a tenant creates: tenant, system roles, admin user, first warehouse, default sequences and reason codes. */
export const ProvisionTenantSchema = z.object({
  code: z.string().trim().min(2).max(40).regex(/^[a-z0-9][a-z0-9-]*$/, 'lowercase letters, digits, hyphen'),
  name: z.string().min(1).max(200),
  planCode: z.string().min(1),
  timezone: z.string().default('Asia/Kuwait'),
  currency: z.string().length(3).default('KWD'),
  locale: z.string().default('en'),
  adminEmail: z.string().email(),
  adminName: z.string().min(1).max(120),
  adminPassword: z.string().min(10).max(200),
  firstWarehouse: z.object({
    code: z.string().min(1).max(20),
    name: z.string().min(1).max(120),
    timezone: z.string().optional(),
  }),
  trialDays: z.number().int().min(0).max(365).default(30),
});
export type ProvisionTenantDto = z.infer<typeof ProvisionTenantSchema>;

export const UpdateTenantSchema = z.object({
  name: z.string().min(1).max(200).optional(),
  status: z.enum(TENANT_STATUS).optional(),
  timezone: z.string().optional(),
  currency: z.string().length(3).optional(),
  locale: z.string().optional(),
  settings: z.record(z.unknown()).optional(),
  branding: z.record(z.unknown()).optional(),
});
export type UpdateTenantDto = z.infer<typeof UpdateTenantSchema>;

export const UpdateSubscriptionSchema = z.object({
  planCode: z.string().optional(),
  status: z.enum(SUBSCRIPTION_STATUS).optional(),
  endsAt: z.string().datetime({ offset: true }).nullable().optional(),
  seats: z.number().int().min(1).optional(),
  notes: z.string().max(1000).optional(),
});

export const SetFeatureFlagSchema = z.object({
  key: z.string().min(1).max(100),
  enabled: z.boolean(),
  config: z.record(z.unknown()).default({}),
});

export const FEATURE_KEYS = {
  'ai.document_intake': 'AI: create ASN/orders from documents',
  'ai.anomaly_detection': 'AI: anomaly detection',
  'ai.nl_query': 'AI: natural-language queries',
  'ai.slotting': 'AI: slotting recommendations',
  'ai.forecast': 'AI: workload forecast',
  'billing.3pl': '3PL billing module',
  'integrations.webhooks': 'Outbound webhooks',
  'integrations.sap': 'SAP IDoc adapter',
  'integrations.api': 'Public REST API',
  'outbound.waves': 'Wave planning',
  'inventory.serials': 'Serial number tracking',
  'customer_portal': 'Storer portal access',
} as const;
export type FeatureKey = keyof typeof FEATURE_KEYS;

export const UsageMetricSchema = z.enum([
  'ORDERS_SHIPPED', 'ASN_RECEIVED', 'ACTIVE_USERS', 'API_CALLS', 'STORAGE_CBM', 'AI_TOKENS', 'TASKS_COMPLETED',
]);
export type UsageMetric = z.infer<typeof UsageMetricSchema>;

export const UsageQuerySchema = z.object({
  tenantId: Uuid.optional(),
  from: z.string().regex(/^\d{4}-\d{2}-\d{2}$/),
  to: z.string().regex(/^\d{4}-\d{2}-\d{2}$/),
  metric: UsageMetricSchema.optional(),
});
