import Joi from 'joi';
import { MODULE_KEYS, type ModuleKey } from '../config/modules.js';

export const ORGANIZATION_STATUSES = ['pending', 'trial', 'active', 'suspended'] as const;
export type OrganizationStatus = (typeof ORGANIZATION_STATUSES)[number];

export const SUSPENSION_REASONS = ['payment_overdue', 'contract_ended', 'security', 'other'] as const;
export type SuspensionReason = (typeof SUSPENSION_REASONS)[number];

export interface UsageLimits {
  maxUsers: number;
  maxProjects: number;
  storageGb: number;
}

export interface TenantAdminInput {
  name: string;
  email: string;
  phone?: string;
}

// POST /organizations — the onboarding wizard's payload, matching
// blenaxis-super-admin's CreateOrganizationRequest exactly.
export interface CreateOrganizationBody {
  name: string;
  slug: string;
  legalName?: string;
  contactEmail: string;
  contactPhone?: string;
  country: string;
  city?: string;
  planId: string;
  moduleKeys: ModuleKey[];
  limits: UsageLimits;
  tenantAdmin: TenantAdminInput;
  activateNow: boolean;
}

const limitsSchema = Joi.object<UsageLimits>({
  maxUsers: Joi.number().integer().min(1).required(),
  maxProjects: Joi.number().integer().min(1).required(),
  storageGb: Joi.number().integer().min(1).required(),
}).required();

const tenantAdminSchema = Joi.object<TenantAdminInput>({
  name: Joi.string().trim().min(2).required(),
  email: Joi.string().trim().lowercase().email().max(254).required(),
  phone: Joi.string().trim().optional(),
}).required();

export const createOrganizationSchema = Joi.object<CreateOrganizationBody>({
  name: Joi.string().trim().min(2).max(150).required(),
  slug: Joi.string().trim().lowercase().regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/).max(60).required()
    .messages({ 'string.pattern.base': 'Use lowercase letters, numbers and hyphens' }),
  legalName: Joi.string().trim().max(150).optional(),
  contactEmail: Joi.string().trim().lowercase().email().max(254).required(),
  contactPhone: Joi.string().trim().max(30).optional(),
  country: Joi.string().trim().min(2).max(60).required(),
  city: Joi.string().trim().max(100).optional(),
  planId: Joi.string().required(),
  moduleKeys: Joi.array().items(Joi.string().valid(...MODULE_KEYS)).required(),
  limits: limitsSchema,
  tenantAdmin: tenantAdminSchema,
  activateNow: Joi.boolean().required(),
}).required();

// Basic profile fields only — plan/modules/limits go through
// updateSubscriptionSchema below, which requires an audited `reason`.
export interface UpdateOrganizationBody {
  name?: string;
  legalName?: string;
  contactEmail?: string;
  contactPhone?: string;
  country?: string;
  city?: string;
  description?: string;
}

export const updateOrganizationSchema = Joi.object<UpdateOrganizationBody>({
  name: Joi.string().trim().min(2).max(150),
  legalName: Joi.string().trim().max(150),
  contactEmail: Joi.string().trim().lowercase().email().max(254),
  contactPhone: Joi.string().trim().max(30),
  country: Joi.string().trim().min(2).max(60),
  city: Joi.string().trim().max(100),
  description: Joi.string().trim().max(255).allow(''),
}).min(1).required();

// PATCH /organizations/:id/status
export type UpdateStatusBody =
  | { status: 'suspended'; reason: SuspensionReason; note?: string; notifyAdmin: boolean }
  | { status: 'active' };

export const updateStatusSchema = Joi.alternatives<UpdateStatusBody>([
  Joi.object({
    status: Joi.string().valid('suspended').required(),
    reason: Joi.string().valid(...SUSPENSION_REASONS).required(),
    note: Joi.string().trim().max(500).optional(),
    notifyAdmin: Joi.boolean().required(),
  }),
  Joi.object({
    status: Joi.string().valid('active').required(),
  }),
]).required();

// PATCH /organizations/:id/subscription
export interface UpdateSubscriptionBody {
  planId: string;
  moduleKeys: ModuleKey[];
  limits: UsageLimits;
  priceMonthly: number;
  reason: string;
}

export const updateSubscriptionSchema = Joi.object<UpdateSubscriptionBody>({
  planId: Joi.string().required(),
  moduleKeys: Joi.array().items(Joi.string().valid(...MODULE_KEYS)).required(),
  limits: limitsSchema,
  priceMonthly: Joi.number().integer().min(0).required(),
  reason: Joi.string().trim().min(1).max(500).required(),
}).required();

// PUT /organizations/:id/tenant-admin
export type ChangeTenantAdminBody =
  | { mode: 'existing'; userId: number }
  | { mode: 'invite'; name: string; email: string };

export const changeTenantAdminSchema = Joi.alternatives<ChangeTenantAdminBody>([
  Joi.object({ mode: Joi.string().valid('existing').required(), userId: Joi.number().integer().positive().required() }),
  Joi.object({
    mode: Joi.string().valid('invite').required(),
    name: Joi.string().trim().min(2).required(),
    email: Joi.string().trim().lowercase().email().max(254).required(),
  }),
]).required();
