import { User } from "@/lib/types/auth";
export type CourseLevel = "Beginner" | "Intermediate" | "Advanced";
export type StepType = "text" | "video" | "teleprompter";
export type CoursePublishedStatus = 'draft' | 'pending' | 'published' | 'rejected';
export type Trainer = {
  id: number;
  email: string;
  password?: string;
  phone?: string | null;
  name?: string | null;
  gender?: string | null;
  role?: string;
  resetToken?: string | null;
};

export type Course = {
  id: number;
  title: string;
  description: string;
  duration: string;
  price: string;
  discountPrice: string;
  level: CourseLevel;
  isPublished: boolean;
  publishStatus: CoursePublishedStatus;
  trainer: Trainer;
  progress?: {
    completed: boolean;
  };
  action?: PayButtonType;
  courseImage?: string;
  courseVideo?: string;
};

export interface CourseWithLessons extends Course {
  lessons: LessonItem[];
}

export interface TrainerCoursesResponse {
  total: number;
  items: CourseWithLessons[];
}

export interface getCourseByIdForWatchingResponse {
  course: CourseWithLessons;
  ratingAvg: string;
  ratingCount: number;
}

export type StepItem = {
  id: number;
  type: StepType;
  title: string;
  content: string | null;
  teleprompterText: string | null;
  videoPath: string | null;
  videoUrl: string | null;
  questionData: string | null;
};

export type LessonItem = {
  id: number;
  title: string;
  description: string;
  steps: StepItem[];
};

export interface CreateCourseRequest {
  title: string;
  description: string;
  duration: string;
  level: CourseLevel;
  price: number;
  discountPrice: number;
  isPublished: boolean;
  courseImage?: string;
  courseVideo?: string;
}

export interface ReorderItem {
  stepId: number;
  order: number;
}

export interface ReorderDataRequest {
  lesson_id: number;
  order: ReorderItem[];
}

export interface CreateCourseResponse {
  id: number;
  title: string;
  description: string;
  duration: string;
  price: number;
  discountPrice: number;
  level: string;
  isPublished: boolean;
  trainer: {
    id: number;
  };
  courseImage?: string;
  courseVideo?: string;
}

export interface UpdateCourseRequest {
  id: number;
  title: string;
  description: string;
  duration: string;
  level: CourseLevel;
  price: number;
  discountPrice: number;
  isPublished: boolean;
  courseImage?: string;
  courseVideo?: string;
}

export interface UpdateCourseResponse {
  id: number;
  title: string;
  description: string;
  duration: string;
  price: number;
  discountPrice: number;
  level: string;
  isPublished: boolean;
  trainer: {
    id: number;
  };
  courseImage?: string;
  courseVideo?: string;
}

export interface CreateLessonRequest {
  course_id: number;
  title: string;
  description: string;
}

export interface UpdateLessonRequest {
  course_id: number;
  lesson_id: number;
  title: string;
  description: string;
}
export interface CreateStepRequest {
  lesson_id: number;
  type: StepType;
  title: string;
  content?: string;
  teleprompterText?: string;
}
export interface UpdateVideoStepRequest {
  lesson_id: number;
  step_id: number;
  title: string;
  file?: File;
  type?: StepType;
  teleprompterText?: string;
}

export interface CreateVideoStepRequest {
  lesson_id: number;
  title: string;
  file: File;
  type?: StepType;
  teleprompterText?: string;
}

export interface UpdateStepRequest {
  step_id: number;
  lesson_id: number;
  type: StepType;
  title: string;
  content?: string;
  teleprompterText?: string;
}

export interface LocalLesson extends Omit<CreateLessonRequest, "course_id"> {
  steps: CreateStepRequest[];
}

export interface CreateLessonResponse {
  id: number;
  title: string;
  description: string;
  course: Course;
}

export interface CreateCourseDialogProps {
  isCourseDialogOpen: boolean;
  setIsCourseDialogOpen: (isOpen: boolean) => void;
  newCourse: CreateCourseRequest;
  setNewCourse: (course: CreateCourseRequest) => void;
  lessons: LocalLesson[];
  addLesson: () => void;
  addStep: (lessonIndex: number, type: StepType) => void;
  handleLessonChange: (index: number, field: string, value: string) => void;
  handleStepChange: (
    lessonIndex: number,
    stepIndex: number,
    field: string,
    value: string
  ) => void;
  handleCreateCourse: () => void;
}
export interface CourseProgress {
  lastLesson: {
    id: number;
    title?: string;
  };
  lastStep: {
    id: number;
    title?: string;
  } | null;
  percent: number;
  completed: boolean;
  updatedAt: string;
}
export interface MyCourseProgress extends CourseProgress {
  id: number;
  user: User;
  course: Course;
}

export interface BillingCheckoutResponse {
  url: string;
}

export interface MyCourse {
  course: Course;
  subscribedAt: string;
  status: string;
  user: User;
  progress: MyCourseProgress;
}
export type PayButtonType = "pay" | "startCourse" | "continueWatching";
export interface EnrollmentData {
  status: string;
  subscribedAt: string;
}
export interface GetCourseByIdResponse {
  course: CourseWithLessons;
  action: PayButtonType;
}

export interface GetCourseByIdForCurrentUserResponse {
  enrollment: EnrollmentData;
  progress: CourseProgress;
  course: CourseWithLessons;
}

export interface UpdatePublishStatusResponse {
  message: string;
  status: 'pending' | 'success';
}
