export interface TrainingCategory {
  id: string;
  name: string;
  description: string | null;
  color: string | null;
  is_mandatory: boolean;
  sort_order: number;
  is_active: boolean;
  programs_count?: number;
  created_at: string;
  updated_at: string;
}

export interface CreateTrainingCategoryPayload {
  name: string;
  description?: string | null;
  color?: string | null;
  is_mandatory?: boolean;
  sort_order?: number;
  is_active?: boolean;
}

export interface UpdateTrainingCategoryPayload extends Partial<CreateTrainingCategoryPayload> {
  id: string;
}

export interface DeleteTrainingCategoryPayload {
  message: string;
  id?: string;
}

export interface TrainingProvider {
  id: string;
  name: string;
  contact_person: string | null;
  email: string | null;
  phone: string | null;
  address: string | null;
  website: string | null;
  specialization: string | null;
  is_active: boolean;
  programs_count?: number;
  created_at: string;
  updated_at: string;
}

export interface CreateTrainingProviderPayload {
  name: string;
  contact_person?: string | null;
  email?: string | null;
  phone?: string | null;
  address?: string | null;
  website?: string | null;
  specialization?: string | null;
  is_active?: boolean;
}

export interface UpdateTrainingProviderPayload extends Partial<CreateTrainingProviderPayload> {
  id: string;
}

export interface DeleteTrainingProviderPayload {
  message: string;
  id?: string;
}

export interface TrainingProgram {
  id: string;
  title: string;
  code: string;
  description: string | null;
  training_category_id: string | null;
  training_provider_id: string | null;
  delivery_method: 'classroom' | 'online' | 'blended' | 'on_the_job' | 'workshop' | 'seminar' | 'conference' | 'self_paced';
  duration_hours: number | null;
  is_recurring: boolean;
  recurrence_interval_months: number | null;
  max_participants: number | null;
  estimated_cost_per_person: string | null;
  learning_objectives: string | null;
  prerequisites: string | null;
  target_audience: string | null;
  is_active: boolean;
  category?: TrainingCategory | null;
  provider?: TrainingProvider | null;
  sessions_count?: number;
  created_at: string;
  updated_at: string;
}

export interface CreateTrainingProgramPayload {
  title: string;
  code: string;
  description?: string | null;
  training_category_id?: string | null;
  training_provider_id?: string | null;
  delivery_method: 'classroom' | 'online' | 'blended' | 'on_the_job' | 'workshop' | 'seminar' | 'conference' | 'self_paced';
  duration_hours?: number | null;
  is_recurring?: boolean;
  recurrence_interval_months?: number | null;
  max_participants?: number | null;
  estimated_cost_per_person?: number | null;
  learning_objectives?: string | null;
  prerequisites?: string | null;
  target_audience?: string | null;
  is_active?: boolean;
}

export interface UpdateTrainingProgramPayload extends Partial<CreateTrainingProgramPayload> {
  id: string;
}

export interface DeleteTrainingProgramPayload {
  message: string;
  id?: string;
}

export interface TrainingSession {
  id: string;
  training_program_id: string;
  title: string;
  instructor_name: string | null;
  instructor_id: string | null;
  start_date: string;
  end_date: string;
  start_time: string | null;
  end_time: string | null;
  venue_type: 'onsite' | 'offsite' | 'virtual' | 'hybrid';
  venue: string | null;
  virtual_link: string | null;
  max_participants: number | null;
  min_participants: number | null;
  status: 'planned' | 'open_for_enrollment' | 'in_progress' | 'completed' | 'canceled';
  actual_cost: string | null;
  canceled_reason: string | null;
  completed_at: string | null;
  branch_id: string | null;
  notes: string | null;
  program?: TrainingProgram | null;
  instructor?: {
    employee_id: string;
    firstname: string;
    lastname: string;
  } | null;
  branch?: {
    id: string;
    name: string;
  } | null;
  enrollments_count?: number;
  created_at: string;
  updated_at: string;
}

export interface CreateTrainingSessionPayload {
  training_program_id: string;
  title: string;
  instructor_name?: string | null;
  instructor_id?: string | null;
  start_date: string;
  end_date: string;
  start_time?: string | null;
  end_time?: string | null;
  venue_type: 'onsite' | 'offsite' | 'virtual' | 'hybrid';
  venue?: string | null;
  virtual_link?: string | null;
  max_participants?: number | null;
  min_participants?: number | null;
  status?: 'planned' | 'open_for_enrollment';
  actual_cost?: number | null;
  branch_id?: string | null;
  notes?: string | null;
}

export interface UpdateTrainingSessionPayload extends Partial<CreateTrainingSessionPayload> {
  id: string;
}

export interface DeleteTrainingSessionPayload {
  message: string;
  id?: string;
}

export interface TrainingEnrollment {
  id: string;
  training_session_id: string;
  employee_id: string;
  enrollment_type: 'admin_enrolled' | 'self_enrolled' | 'mandatory' | 'nominated';
  enrollment_date: string;
  status: 'enrolled' | 'confirmed' | 'completed' | 'no_show' | 'canceled';
  enrolled_by: string | null;
  manager_approved: boolean;
  approved_by: string | null;
  approved_at: string | null;
  withdrawal_reason: string | null;
  completion_date: string | null;
  score: number | null;
  grade: string | null;
  session?: TrainingSession | null;
  employee?: {
    employee_id: string;
    firstname: string;
    lastname: string;
    email?: string;
  } | null;
  enrolled_by_employee?: {
    employee_id: string;
    firstname: string;
    lastname: string;
  } | null;
  created_at: string;
  updated_at: string;
}

export interface CreateTrainingEnrollmentPayload {
  training_session_id: string;
  employee_id: string;
  enrollment_type: 'admin_enrolled' | 'self_enrolled' | 'mandatory' | 'nominated';
  enrolled_by?: string;
  enrollment_date?: string;
}

export interface BulkEnrollPayload {
  training_session_id: string;
  employee_ids: string[];
  enrollment_type: 'admin_enrolled' | 'self_enrolled' | 'mandatory' | 'nominated';
}

export interface DeleteTrainingEnrollmentPayload {
  message: string;
  id?: string;
}

export interface TrainingAttendance {
  id: string;
  training_session_id: string;
  employee_id: string;
  date: string;
  status: 'present' | 'absent' | 'excused';
  notes: string | null;
  recorded_by: string | null;
  employee?: {
    employee_id: string;
    firstname: string;
    lastname: string;
  } | null;
  session?: TrainingSession | null;
  created_at: string;
  updated_at: string;
}

export interface CreateTrainingAttendancePayload {
  training_session_id: string;
  employee_id: string;
  date: string;
  status: 'present' | 'absent' | 'excused';
  notes?: string | null;
  recorded_by?: string | null;
}

export interface MarkBulkAttendancePayload {
  training_session_id: string;
  date: string;
  attendance: {
    employee_id: string;
    status: 'present' | 'absent' | 'excused';
    notes?: string | null;
  }[];
}

export interface DeleteTrainingAttendancePayload {
  message: string;
  id?: string;
}

export interface Certification {
  id: string;
  name: string;
  issuing_body: string | null;
  description: string | null;
  is_mandatory: boolean;
  validity_months: number | null;
  training_program_id: string | null;
  is_active: boolean;
  training_program?: TrainingProgram | null;
  employee_certifications_count?: number;
  created_at: string;
  updated_at: string;
}

export interface CreateCertificationPayload {
  name: string;
  issuing_body?: string | null;
  description?: string | null;
  is_mandatory?: boolean;
  validity_months?: number | null;
  training_program_id?: string | null;
  is_active?: boolean;
}

export interface UpdateCertificationPayload extends Partial<CreateCertificationPayload> {
  id: string;
}

export interface DeleteCertificationPayload {
  message: string;
  id?: string;
}

export interface EmployeeCertification {
  id: string;
  employee_id: string;
  certification_id: string;
  certificate_number: string | null;
  issue_date: string;
  expiry_date: string | null;
  status: 'active' | 'expired' | 'revoked' | 'suspended';
  issuing_authority: string | null;
  renewal_session_id: string | null;
  verified_by: string | null;
  verified_at: string | null;
  notes: string | null;
  employee?: {
    employee_id: string;
    firstname: string;
    lastname: string;
    email?: string;
  } | null;
  certification?: Certification | null;
  created_at: string;
  updated_at: string;
}

export interface CreateEmployeeCertificationPayload {
  employee_id: string;
  certification_id: string;
  certificate_number?: string | null;
  issue_date: string;
  expiry_date?: string | null;
  status?: 'active' | 'expired' | 'revoked' | 'suspended';
  issuing_authority?: string | null;
  renewal_session_id?: string | null;
  verified_by?: string | null;
  verified_at?: string | null;
  notes?: string | null;
}

export interface UpdateEmployeeCertificationPayload extends Partial<CreateEmployeeCertificationPayload> {
  id: string;
}

export interface DeleteEmployeeCertificationPayload {
  message: string;
  id?: string;
}

export interface SessionCapacity {
  max_participants: number | null;
  enrolled_count: number;
  available_spots: number | null;
}

export interface CancelSessionPayload {
  id: string;
  reason: string;
}

export interface ApproveEnrollmentPayload {
  id: string;
}

export interface WithdrawEnrollmentPayload {
  id: string;
  reason: string;
}

export interface CompleteEnrollmentPayload {
  id: string;
  score?: number | null;
  grade?: string | null;
}

export interface TrainingEvaluation {
  id: string;
  training_session_id: string;
  employee_id: string;
  overall_satisfaction: number;
  content_relevance: number;
  instructor_effectiveness: number;
  materials_quality: number;
  venue_facilities: number | null;
  pace_appropriateness: number;
  would_recommend: boolean;
  most_valuable_aspect: string | null;
  improvement_suggestions: string | null;
  additional_comments: string | null;
  submitted_at: string | null;
  average_score?: number;
  session?: TrainingSession | null;
  employee?: { employee_id: string; firstname: string; lastname: string } | null;
  created_at: string;
  updated_at: string;
}

export interface CreateTrainingEvaluationPayload {
  training_session_id: string;
  employee_id: string;
  overall_satisfaction: number;
  content_relevance: number;
  instructor_effectiveness: number;
  materials_quality: number;
  venue_facilities?: number | null;
  pace_appropriateness: number;
  would_recommend: boolean;
  most_valuable_aspect?: string | null;
  improvement_suggestions?: string | null;
  additional_comments?: string | null;
}

export interface UpdateTrainingEvaluationPayload extends Partial<CreateTrainingEvaluationPayload> {
  id: string;
}

export interface DeleteTrainingEvaluationPayload {
  message: string;
  id?: string;
}

export interface SessionEvaluationReport {
  average_overall_satisfaction: number;
  average_content_relevance: number;
  average_instructor_effectiveness: number;
  average_materials_quality: number;
  average_venue_facilities: number | null;
  average_pace_appropriateness: number;
  would_recommend_percentage: number;
  response_count: number;
  total_enrolled: number;
}
