import { HttpException, HttpStatus, Inject, Injectable, NotFoundException } from '@nestjs/common';
import { TypeOrmQueryService } from '@nestjs-query/query-typeorm';
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 { CreateAssignTaskDto,CreateTaskDto,UpdateAssignTaskDto,UpdateTaskDto } from './dto/task.dto';
import { Task } from './task.entity';

@Injectable()
export class TaskService extends TypeOrmQueryService<Task>{
    constructor(
        @InjectRepository(Task)
        private readonly taskRepository: Repository<Task>,
        private readonly jwtService: JwtService,
        private readonly config: ConfigService,
        @Inject(REQUEST) private readonly request: Request,
        @InjectConnection() private readonly connection: Connection
      ) {
        super(taskRepository, { useSoftDelete: true });
      }
      
      async getTasks() {
        try {
          var query = await this.taskRepository.find();
          return query;
         
        } catch (ex) {
          throw ex;
        }
      }

      async getTaskById(id: number) {

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

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

      }


      async add(data: CreateTaskDto) {
        try {
            const task:Task = new Task();
            task.task_name = data.task_name;
            task.project_id = data.project_id;
            task.client_id =data.client_id;
            task.start_date = data.start_date;
            task.end_date = data.end_date;
            task.custom_attribute = data.custom_attribute;
            
            task.created_at = data.created_at;
            var execute= await this.taskRepository.save(task);
            return "Task has been created";
        } catch (err) {
          throw err
        }
      }

      async update(id: number, data: UpdateTaskDto) {
        try {
            const task:Task = new Task();
            task.task_name = data.task_name;
            task.project_id = data.project_id;
            task.client_id =data.client_id;
            task.start_date = data.start_date;
            task.end_date = data.end_date;
            task.custom_attribute = data.custom_attribute;
            task.updated_at = data.updated_at;
            return await this.taskRepository.update(id,task);
      
        } catch (ex) {
          throw ex;
        }
      }

      
      async delete(id: number) {
        try {
          var delete_query = "Update task 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;
        }
      }


            //Assigned Team and Task

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

    async getAssignedTaskById(id: number) {

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

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

    }

    async assignedTask(data: CreateAssignTaskDto) {
      try {
                                       
          var insert_query = "insert into assigned(team_id,task_id) Values ('"+data.team_id+"','"+data.task_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 updateAssignedTask(id: number, data: UpdateAssignTaskDto) {
      try {
  
          var insert_attachment_query = "UPDATE assigned set team_id= '" + data.team_id + "', task_id= '" + data.task_id + "' where id=" + id + " ";
          console.log(insert_attachment_query)
          var attachement_execute_query = await this.connection.query(insert_attachment_query);
          return "Task Assignment has been updated"         
   
      } catch (ex) {
        throw ex;
      }
    }

    async deleteAssignedTask(id: number) {
      try {
        var delete_query = "Update assigned 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;
      }
    }

}
