import { HttpException, HttpStatus, Inject, Injectable, NotFoundException } from '@nestjs/common';
import { TypeOrmQueryService } from '@nestjs-query/query-typeorm';
import {  Team  } from './team.entity';
import { InjectConnection, InjectRepository } from '@nestjs/typeorm';
import { Connection, Not, Repository } from 'typeorm';
import { REQUEST } from '@nestjs/core';
import { Request } from 'express';
import { TokenPayload } from 'src/types/token-payload.type';
import { ConfigService } from 'nestjs-config';
import { JwtService } from '@nestjs/jwt';
import {  CreateTeamDto, CreateTeamMemberDto, UpdateTeamDto, UpdateTeamMemberDto} from './dto/team.dto';

@Injectable()
export class TeamService extends TypeOrmQueryService<Team> {

    constructor(
        @InjectRepository(Team)
        private readonly teamRepository: Repository<Team>,
        private readonly jwtService: JwtService,
        private readonly config: ConfigService,
        @Inject(REQUEST) private readonly request: Request,
        @InjectConnection() private readonly connection: Connection
      ) {
        super(teamRepository, { useSoftDelete: true });
      }
      
      async getTeams() {
        try {
          var query = await this.teamRepository.find();
          return query;
         
        } catch (ex) {
          throw ex;
        }
      }

      async getTeamById(id: number) {

        try {
          var selectQuery = 'SELECT team.* from team where team.id ='+id;
          var team = await this.connection.query(selectQuery);
          
          if (!team) {
            throw new NotFoundException(`Team #${id} not found`);
          }

          return team;
          
         
        } catch (ex) {
          throw ex;
        }

      }


      async add(data: CreateTeamDto) {
        try {
            const team:Team = new Team();
            team.team_name = data.team_name;
            var execute= await this.teamRepository.save(team);
            return "Team has been created";
        } catch (err) {
          throw err
        }
      }

      async update(id: number, data: UpdateTeamDto) {
        try {
          const team:Team = new Team();
          team.team_name = data.team_name;
            return await this.teamRepository.update(id, team);
      
        } catch (ex) {
          throw ex;
        }
      }

      
      async delete(id: number) {
        try {
          var delete_query = "Update team set status = 0 where id = "+id;
          var delete_query_execute = await this.connection.query(delete_query);
          if(delete_query_execute){
            return "deleted";
          }
        } catch (ex) {
          throw ex;
        }
      }


    //Team Member

    async getTeamMembers() {
        try {
          const teamMember = "SELECT * FROM pmt_tool.teammember;"
          var query = await this.connection.query(teamMember);
          return query;
         
        } catch (ex) {
          throw ex;
        }
      }

      async getTeamMemberById(id: number) {

        try {
          var selectQuery = 'SELECT teammember.* from teammember where teammember.id ='+id;
          var teammember = await this.connection.query(selectQuery);
          
          if (!teammember) {
            throw new NotFoundException(`Department #${id} not found`);
          }

          return teammember;
          
         
        } catch (ex) {
          throw ex;
        }

      }

      async addTeamMember(data: CreateTeamMemberDto) {
        try {
                                         
            var insert_query = "insert into teammember(team_id,user_id,project_id) Values ('"+data.team_id+"','"+data.user_id+"','"+data.project_id+"')";
            var inserted_query = await this.connection.query(insert_query);
            if(inserted_query){
              var last_inserted_id = inserted_query.insertId;
              
        
          }
          return inserted_query;
        } catch (err) {
          throw err
        }
      }

      async updateTeamMember(id: number, data: UpdateTeamMemberDto) {
        try {
    
            var insert_attachment_query = "UPDATE teammember set team_id= '" + data.team_id + "'AND user_id= '" + data.user_id + "' AND project_id='"+data.project_id+"' where id=" + id + " ";
            var attachement_execute_query = await this.connection.query(insert_attachment_query);
            return "Team Member has been updated"         
     
        } catch (ex) {
          throw ex;
        }
      }

}
