import { Injectable } from "@nestjs/common"
import { CreateCategoryDto } from "./dto/create-category.dto"
import { UpdateCategoryDto } from "./dto/update-category.dto"
import { CategoryRepository } from "./repositories/category.repository"
import { errorMessage, isEmpty, successMessage } from "../../utils/helpers"
import {
  failureResponse,
  successResponse,
} from "../../common/response/response"
import { code } from "../../common/response/response.code"
import { messageKey } from "../../constants/message-keys"
import { Category } from "./entities/category.entity"

@Injectable()
export class CategoriesService {
  constructor(private readonly categoryRepository: CategoryRepository) {}

  async create(createCategoryDto: CreateCategoryDto) {
    let category: any = new Category()
    category = { ...createCategoryDto }
    category.status = 1

    await this.categoryRepository.save(category)

    return successResponse(
      code.SUCCESS,
      successMessage(messageKey.data_add, { ":data": "Category" }),
    )
  }

  async findAll() {
    const categories: any = await this.categoryRepository.getByParams({
      where: {
        status: 1,
      },
    })

    if (isEmpty(categories)) {
      return failureResponse(
        code.SUCCESS,
        errorMessage(messageKey.data_not_found, { ":data": "Category" }),
      )
    }

    return successResponse(
      code.SUCCESS,
      successMessage(messageKey.data_retrieve, { ":data": "Category" }),
      categories,
    )
  }

  findOne(id: number) {
    return `This action returns a #${id} category`
  }

  update(id: number, updateCategoryDto: UpdateCategoryDto) {
    console.log("updateCategoryDto================", updateCategoryDto)
    return `This action updates a #${id} category`
  }

  remove(id: number) {
    return `This action removes a #${id} category`
  }

  async checkCategoryExist(categoryName: string) {
    const category = await this.categoryRepository.getByParams({
      where: {
        name: categoryName,
      },
    })

    if (isEmpty(category)) {
      return false
    }

    return true
  }
}
