import { InjectRepository } from '@nestjs/typeorm';
import { Tip } from './entities/tip.entity';
import { Repository } from 'typeorm';
import { getCompleteUrl } from 'src/common/helper';

export class TipsRepository {
  @InjectRepository(Tip)
  private readonly tipsRepository: Repository<Tip>;

  async findAll(
    take: number,
    skip: number,
    categoryId?: string,
    headers?: any,
  ): Promise<any> {
    let query = this.tipsRepository
      .createQueryBuilder('tip')
      .leftJoinAndSelect('tip.category', 'category')
      .leftJoinAndSelect('tip.tips_medias', 'media')
      .orderBy('tip.created_at', 'DESC')
      .skip(skip)
      .take(take);

    if (headers && headers['device-type'] === 'mobile') {
      query = query.andWhere('tip.status = :status', { status: 1 });
    }

    if (categoryId) {
      query = query.andWhere('tip.category_id = :categoryId', { categoryId });
    }

    const [data, count] = await query.getManyAndCount();

    if (data) {
      data.forEach((tip) => {
        tip?.tips_medias.forEach((media) => {
          media.media = getCompleteUrl(media?.media);
        });
      });
    }

    return {
      count,
      data,
    };
  }

  async findOne(id: string) {
    const data = await this.tipsRepository.findOne({
      where: {
        id,
      },
      relations: ['category', 'tips_medias'],
    });

    if (data && data.tips_medias) {
      data?.tips_medias.forEach((image) => {
        image.media = getCompleteUrl(image?.media);
      });
    }

    return data;
  }

  async findOneById(id: string) {
    const data = await this.tipsRepository.findOne({
      where: {
        id,
      },
      relations: ['tips_medias'],
    });

    const response = {
      ...data,
    };

    return response;
  }
}
