import { Injectable, HttpException, HttpStatus } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import axios from 'axios';
import { channel } from 'diagnostics_channel';
const moment = require('moment');
import { env } from 'process';
import { Notifications, RedirectType } from 'src/entities/notifications.entity';
import { KeyType, Settings } from 'src/entities/settings.entity';
import { SocialMediaPosts } from 'src/entities/social-media-posts.entity';
import { SocialMedias, SocialType } from 'src/entities/social-medias.entity';
import { TikTokProfiles } from 'src/entities/tiktok-profile.entity';
import { TikTokVideos } from 'src/entities/tiktok-videos.entity';
import { Users } from 'src/entities/users.entity';
import { YoutubeChannels } from 'src/entities/youtube-channel.entity';
import { YoutubeVideos } from 'src/entities/youtube-videos.entity';
import { responseMessages } from 'src/messages/response-messages';
import { Repository } from 'typeorm';
import { SocketGateway } from '../socket/socket.gateway';

@Injectable()
export class NotificationService {

    constructor(
        private socketGateway: SocketGateway,
        @InjectRepository(Users)
        private Users: Repository<Users>,

        @InjectRepository(Notifications)
        private Notifications: Repository<Notifications>,

    ) { }
    async save(notification: any) {
        await this.Notifications.save(notification);

        let data = { is_notification: true }
        if (notification.redirect_type == RedirectType.JOB_INPROGRESS) {
            data['job_inprogress'] = true
        }
        if (notification.redirect_type == RedirectType.AI_REPORT) {
            data['ai_report'] = true
        }
        // SEND SOCKET TRIGGER
        this.socketGateway.handleMessage(data, notification.receiver.id);
        return;
    }

    async get(queryParam, auth) {
        const reqPage = queryParam.page ? queryParam.page : 0
        const page = queryParam.page - 1
        const pageSize = queryParam.per_page ? queryParam.per_page : 10
        const offset = page * pageSize
        const nextPage = page + 1
        const nextOffset = nextPage * pageSize

        let query = this.Notifications.createQueryBuilder('notification').withDeleted()
            .leftJoin('notification.sender', 'sender')
            .leftJoin('notification.receiver', 'receiver')
            .select(['notification',
                "sender.id", "sender.slug", "sender.first_name", "sender.last_name", "sender.email", "sender.image",
                "receiver.id", "receiver.slug", "receiver.first_name", "receiver.last_name", "receiver.email", "receiver.image",
            ])
            .where('notification.receiver_id = :receiver_id', { receiver_id: auth.id })
            .orderBy('notification.created_at', 'DESC');


        query = query.skip(offset).take(pageSize)

        const [results, total] = await query.getManyAndCount()

        const isUnread = await this.Notifications.createQueryBuilder('notification')
            .withDeleted()
            .where('notification.receiver_id = :receiver_id', { receiver_id: auth.id })
            .andWhere('notification.is_read = :is_read', { is_read: false })
            .getExists();

        return {
            is_unread: isUnread,
            data: results,
            total: total,
            hasMoreResults: total > nextOffset ? 1 : 0
        }
    }

    async readNotification(userId: string, query: any) {
        const whereCondition = query.id ? { id: query.id, receiver: { id: userId } } : { receiver: { id: userId } };
        return await this.Notifications.update(whereCondition, { is_read: true });
    }
}
