import type { MedusaRequest, MedusaResponse } from "@medusajs/framework/http"
import type CompanyReviewModuleService from "../../../../modules/company-review/service"
import { COMPANY_REVIEW_MODULE } from "../../../../modules/company-review"

function getCreatedAtValue(input: { created_at?: Date | string | null }) {
  const raw = input.created_at
  if (!raw) {
    return 0
  }

  const date = raw instanceof Date ? raw : new Date(raw)
  return Number.isNaN(date.getTime()) ? 0 : date.getTime()
}

export async function GET(req: MedusaRequest, res: MedusaResponse) {
  const companyReviewModuleService = req.scope.resolve<CompanyReviewModuleService>(COMPANY_REVIEW_MODULE)
  const reviews = await companyReviewModuleService.listCompanyReviews({})
  const sortedReviews = [...reviews].sort((a, b) => getCreatedAtValue(b) - getCreatedAtValue(a))

  res.json({ reviews: sortedReviews })
}

export async function POST(req: MedusaRequest, res: MedusaResponse) {
  const body = req.body as {
    author_name?: string
    rating?: number
    body?: string
    is_published?: boolean
  }

  const authorName = typeof body.author_name === "string" ? body.author_name.trim() : ""
  const rating = Number(body.rating)
  const reviewBody = typeof body.body === "string" ? body.body.trim() : ""

  if (!authorName || !Number.isInteger(rating) || rating < 1 || rating > 5 || !reviewBody) {
    return res.status(400).json({
      message: "author_name, une note entiere entre 1 et 5, et body sont requis.",
    })
  }

  const companyReviewModuleService = req.scope.resolve<CompanyReviewModuleService>(COMPANY_REVIEW_MODULE)
  const createdReview = await companyReviewModuleService.createCompanyReviews({
    author_name: authorName,
    rating,
    body: reviewBody,
    is_published: body.is_published !== false,
  })

  res.status(201).json({ review: createdReview })
}
