import { z } from 'zod';

// ── Auth ──────────────────────────────────────────────────────────────────────

export const signinSchema = z.object({
  email: z.string().email('Email non valida').max(255),
  password: z.string().min(1, 'Password obbligatoria').max(128),
});

export const signupSchema = z.object({
  email: z.string().email('Email non valida').max(255),
  password: z.string().min(6, 'La password deve essere di almeno 6 caratteri').max(128),
  name: z.string().max(50).optional(),
  // Company creation mode - if true, creates company with user as owner
  createCompany: z.boolean().default(false),
  companyName: z.string().min(1).max(200).optional(),
  companyPackage: z.enum(['starter', 'professional', 'enterprise']).default('starter').optional(),
});

// ── User ──────────────────────────────────────────────────────────────────────

export const profileUpdateSchema = z.object({
  name: z.string().min(2).max(50).optional(),
  email: z.string().email('Email non valida').max(255).optional(),
}).refine((d) => d.name || d.email, { message: 'At least one field required' });

export const passwordChangeSchema = z.object({
  currentPassword: z.string().min(1).max(128),
  newPassword: z.string().min(6, 'La password deve essere di almeno 6 caratteri').max(128),
});

// ── Projects ──────────────────────────────────────────────────────────────────

export const createProjectSchema = z.object({
  id: z.string().min(1).max(100),
  name: z.string().min(1, 'Nome obbligatorio').max(200),
  description: z.string().min(1, 'Descrizione obbligatoria').max(2000),
  sourceLanguage: z.string().min(1).max(50),
  targetLanguage: z.string().min(1).max(50),
  repoUrl: z.string().url().max(500).optional().or(z.literal('')),
  tags: z.array(z.string().max(50)).max(20).optional(),
  team: z.array(z.object({
    name: z.string().max(100),
    role: z.string().max(100),
    avatar: z.string().max(10).optional(),
  })).max(50).optional(),
  status: z.enum(['draft', 'analyzing', 'converting', 'validating', 'completed', 'failed']).optional(),
  config: z.record(z.unknown()).optional(),
});

export const updateProjectSchema = z.object({
  maxReachedStep: z.number().int().min(0).max(10).optional(),
  currentStep: z.number().int().min(0).max(10).optional(),
  status: z.enum(['draft', 'analyzing', 'converting', 'validating', 'completed', 'failed']).optional(),
  repoUrl: z.string().url().max(500).optional().or(z.literal('')),
  totalFiles: z.number().int().min(0).optional(),
  totalLines: z.number().int().min(0).optional(),
  convertedFiles: z.number().int().min(0).optional(),
  accuracy: z.number().min(0).max(100).optional(),
  testCoverage: z.number().min(0).max(100).optional(),
  completedAt: z.coerce.date().nullable().optional(),
  config: z.record(z.unknown()).optional(),
}).refine((d) => Object.keys(d).length > 0, { message: 'At least one field required' });

export const stepProgressSchema = z.object({
  stepNumber: z.number().int().min(0).max(8),
  status: z.enum(['pending', 'in_progress', 'completed', 'failed']),
  maxReachedStep: z.number().int().min(0).max(10).optional(),
  metadata: z.record(z.unknown()).optional(),
});

/** Client → POST …/notifications/enqueue (migration lifecycle; delivery is async later). */
export const migrationNotifyEnqueueSchema = z.object({
  event: z.enum(['complete', 'warning', 'failure']),
  detail: z.string().max(4000).optional(),
});

// ── Companies ─────────────────────────────────────────────────────────────────

export const createCompanySchema = z.object({
  name: z.string().min(1, 'Company name is required').max(200),
  package: z.enum(['starter', 'professional', 'enterprise']).default('starter'),
  // Optional initial owner email (if not provided, creator becomes owner)
  ownerEmail: z.string().email().optional(),
  // Financial data (optional on creation)
  financialData: z.object({
    billingAddress: z.string().max(500).optional(),
    taxId: z.string().max(50).optional(),
    vatNumber: z.string().max(50).optional(),
    billingEmail: z.string().email().max(255).optional(),
  }).optional(),
  // Payment method (optional on creation) - simplified for company creation
  paymentMethod: z.object({
    type: z.enum(['card', 'sepa_debit', 'sepa', 'paypal', 'link', 'apple_pay', 'google_pay']),
    last4: z.string().max(4).optional(),
    brand: z.string().max(50).optional(),
    expiryMonth: z.number().int().min(1).max(12).optional(),
    expiryYear: z.number().int().optional(),
    email: z.string().email().max(255).optional(), // For PayPal
    accountHolderName: z.string().max(200).optional(),
    bankCode: z.string().max(50).optional(),
    country: z.string().max(2).optional(),
    stripePaymentMethodId: z.string().max(255).optional(),
  }).optional(),
});

export const updateCompanySchema = z.object({
  name: z.string().min(1).max(200).optional(),
  package: z.enum(['starter', 'professional', 'enterprise']).optional(),
  maxUsers: z.number().int().min(1).max(1000).optional(),
}).refine((d) => Object.keys(d).length > 0, { message: 'At least one field required' });

export const updateFinancialDataSchema = z.object({
  billingAddress: z.string().max(500).optional(),
  taxId: z.string().max(50).optional(),
  vatNumber: z.string().max(50).optional(),
  billingEmail: z.string().email().max(255).optional(),
}).refine((d) => Object.keys(d).length > 0, { message: 'At least one field required' });

export const updatePaymentMethodSchema = z.object({
  type: z.enum(['card', 'sepa_debit', 'sepa', 'paypal', 'link', 'apple_pay', 'google_pay']),
  last4: z.string().max(4).optional(),
  brand: z.string().max(50).optional(),
  expiryMonth: z.number().int().min(1).max(12).optional(),
  expiryYear: z.number().int().optional(),
  // PayPal
  email: z.string().email().max(255).optional(),
  // SEPA / bank account
  accountHolderName: z.string().max(200).optional(),
  bankCode: z.string().max(50).optional(),
  country: z.string().max(2).optional(),
  // Stripe payment method ID
  stripePaymentMethodId: z.string().max(500).optional(),
  // Legacy
  paymentToken: z.string().max(500).optional(),
});

export const changeOwnerSchema = z.object({
  newOwnerId: z.string().min(1, 'New owner ID is required'),
});

// Schema for creating a user within a company (owner only)
export const createCompanyUserSchema = z.object({
  email: z.string().email('Email non valida').max(255),
  password: z.string().min(6, 'La password deve essere di almeno 6 caratteri').max(128),
  name: z.string().max(50).optional(),
  role: z.enum(['client', 'admin']).default('client'),
});
