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

export class ChallengesRepository {
  constructor(
    @InjectRepository(Challenge)
    private readonly challengesRepository: Repository<Challenge>,
  ) {}

  async findAll(
    take: number,
    skip: number,
    search: string,
    headers: any,
  ): Promise<any> {
    let query = this.challengesRepository.createQueryBuilder('challenge');

    if (search) {
      query = query.where(
        '(challenge.description_short ILIKE :search OR challenge.description_long ILIKE :search)',
        { search: `%${search}%` },
      );
    }

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

    const [data, count] = await query
      .leftJoinAndSelect('challenge.challenges_media', 'media')
      .orderBy('challenge.created_at', 'DESC')
      .skip(skip)
      .take(take)
      .getManyAndCount();

    data &&
      data.map((challenges) => {
        challenges.challenges_media.forEach((image) => {
          if (image.media_type === 'video') {
            image.thumbnail = getCompleteUrl(image.thumbnail);
          }
          image.media = getCompleteUrl(image.media);
        });
      });

    const response = {
      count,
      data,
    };

    return response;
  }

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

    if (data && data.challenges_media) {
      data.challenges_media.forEach((image) => {
        if (image.media_type === 'video') {
          image.thumbnail = getCompleteUrl(image.thumbnail);
        }
        image.media = getCompleteUrl(image.media);
      });
    }

    return data;
  }

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

    const response = {
      ...data,
    };

    return response;
  }
}
