import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Between, Repository } from 'typeorm';
import { AppUsersStep } from './entities/app_users_step.entity';
import { AppUserRepository } from 'src/app_users/app_users.repository';
import * as moment from 'moment';
import { isEmpty } from 'class-validator';

@Injectable()
export class AppUserStepsRepository {
  constructor(
    @InjectRepository(AppUsersStep)
    private readonly appUserRepository: Repository<AppUsersStep>,
    private readonly userRepository: AppUserRepository,
  ) {}

  async findUserStepsById(
    userId: string,
    fromDate?: string,
    today: boolean = false,
  ): Promise<AppUsersStep[]> {
    let whereCondition: any = { app_user_id: userId };

    if (!isEmpty(fromDate)) {
      // Convert fromDate to UTC and include time up to the end of the day

      const fromDateUTC =
        today === true
          ? moment.utc(fromDate).startOf('day').toDate()
          : moment.utc(fromDate).startOf('day').add(1, 'day').toDate();

      // Create a condition to find records from fromDateUTC to current date
      whereCondition.created_at = Between(fromDateUTC, new Date());
    }

    const data = await this.appUserRepository.find({
      where: whereCondition,
    });

    return data;
  }

  async findAll(take: number, skip: number) {
    const [data, count] = await this.appUserRepository.findAndCount({
      relations: ['app_user'],
      skip,
      take,
      order: { created_at: 'DESC' },
    });

    const response = {
      count,
      data,
    };

    return response;
  }

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

    return data;
  }

  async findUserById(app_user_id: string) {
    const data: any = await this.userRepository.getUserWithGroupCount(
      app_user_id,
    );

    return data;
  }

  async findLastRecord(app_user_id: string) {
    const data = await this.appUserRepository.findOne({
      where: { app_user_id },
      order: { created_at: 'DESC' },
    });

    if (isEmpty(data)) {
      return null;
    }

    const response = {
      last_date: moment(data.created_at).format('YYYY-MM-DD HH:mm:ss'),
    };

    return response;
  }
}
