import { NextRequest, NextResponse } from 'next/server';
import { dbConnect } from '@/lib/dbConnect';
import { Lesson } from '@/models/Lesson';
import { Course } from '@/models/Course';
import { Order } from '@/models/Order';
import { Student } from '@/models/Student';
import { Admin } from '@/models/Admin';
import { extractFilename } from '@/lib/media';

export async function GET(req: NextRequest) {
  try {
    await dbConnect();

    let updatedLessons = 0;
    let updatedCourses = 0;
    let updatedOrders = 0;
    let updatedStudents = 0;
    let updatedAdmins = 0;

    // 1. Fix Lessons
    const lessons = await Lesson.find({});
    for (const lesson of lessons) {
      let modified = false;
      if (lesson.videoReference) {
        const clean = extractFilename(lesson.videoReference);
        if (clean !== lesson.videoReference) {
          lesson.videoReference = clean;
          modified = true;
        }
      }
      if (lesson.scriptFileUrl) {
        const clean = extractFilename(lesson.scriptFileUrl);
        if (clean !== lesson.scriptFileUrl) {
          lesson.scriptFileUrl = clean;
          modified = true;
        }
      }
      if (lesson.homeworkFileUrl) {
        const clean = extractFilename(lesson.homeworkFileUrl);
        if (clean !== lesson.homeworkFileUrl) {
          lesson.homeworkFileUrl = clean;
          modified = true;
        }
      }
      if (modified) {
        await lesson.save();
        updatedLessons++;
      }
    }

    // 2. Fix Courses & embedded chapters
    const courses = await Course.find({});
    for (const course of courses) {
      let modified = false;
      if (course.thumbnailUrl) {
        const clean = extractFilename(course.thumbnailUrl);
        if (clean !== course.thumbnailUrl) {
          course.thumbnailUrl = clean;
          modified = true;
        }
      }
      if (Array.isArray(course.chapters)) {
        for (const ch of course.chapters) {
          if (ch.videoReference) {
            const clean = extractFilename(ch.videoReference);
            if (clean !== ch.videoReference) {
              ch.videoReference = clean;
              modified = true;
            }
          }
          if (ch.scriptFileUrl) {
            const clean = extractFilename(ch.scriptFileUrl);
            if (clean !== ch.scriptFileUrl) {
              ch.scriptFileUrl = clean;
              modified = true;
            }
          }
          if (ch.homeworkFileUrl) {
            const clean = extractFilename(ch.homeworkFileUrl);
            if (clean !== ch.homeworkFileUrl) {
              ch.homeworkFileUrl = clean;
              modified = true;
            }
          }
        }
      }
      if (modified) {
        await course.save();
        updatedCourses++;
      }
    }

    // 3. Fix Orders bank transfer details
    const orders = await Order.find({});
    for (const order of orders) {
      if (order.bankTransferDetails && order.bankTransferDetails.proofOfPaymentUrl) {
        const clean = extractFilename(order.bankTransferDetails.proofOfPaymentUrl);
        if (clean !== order.bankTransferDetails.proofOfPaymentUrl) {
          order.bankTransferDetails.proofOfPaymentUrl = clean;
          await order.save();
          updatedOrders++;
        }
      }
    }

    // 4. Fix Students avatarUrl (if present)
    const students = await Student.find({});
    for (const student of students) {
      const studentObj = student as any;
      if (studentObj.avatarUrl) {
        const clean = extractFilename(studentObj.avatarUrl);
        if (clean !== studentObj.avatarUrl) {
          studentObj.avatarUrl = clean;
          await student.save();
          updatedStudents++;
        }
      }
    }

    // 5. Fix Admins avatarUrl
    const admins = await Admin.find({});
    for (const admin of admins) {
      if (admin.avatarUrl) {
        const clean = extractFilename(admin.avatarUrl);
        if (clean !== admin.avatarUrl) {
          admin.avatarUrl = clean;
          await admin.save();
          updatedAdmins++;
        }
      }
    }

    return NextResponse.json({
      success: true,
      message: 'Database file paths cleaned up successfully to store pure filenames',
      details: {
        updatedLessons,
        updatedCourses,
        updatedOrders,
        updatedStudents,
        updatedAdmins,
      },
    });
  } catch (error: any) {
    return NextResponse.json(
      { success: false, error: error.message || 'Error running database path fix' },
      { status: 500 }
    );
  }
}

export const POST = GET;
