import { Injectable } from '@nestjs/common';
import { CreateUserCommunicationAddressDto } from './dto/create-user-communication-address.dto';
import { UpdateUserCommunicationAddressDto } from './dto/update-user-communication-address.dto';
import { DataSource } from 'typeorm';
import { UserCommunicationAddress } from './entities/user-communication-address.entity';

@Injectable()
export class UserCommunicationAddressService {
  constructor(private readonly connection: DataSource,
  ) { }
  async create(createUserCommunicationAddressDto: UserCommunicationAddress) {
    await this.connection.query(`insert into user_address(user_id,lattitude,longitude,house_no,area_name,nearest_landmark,pincode,address_type) values(?,?,?,?,?,?,?,?)`, [
      createUserCommunicationAddressDto.user_id,
      createUserCommunicationAddressDto.latitude,
      createUserCommunicationAddressDto.longitude,
      createUserCommunicationAddressDto.house_no,
      createUserCommunicationAddressDto.area_name,
      createUserCommunicationAddressDto.nearest_landmark,
      createUserCommunicationAddressDto.pincode,
      createUserCommunicationAddressDto.address_type,
    ])
    return {
      message: "User Communication Address created successfully",
      status: "Success",
      statusCode: 201
    };
  }

  async findAll(user_id?: number) {
    let address = await this.connection.query(`select * from user_address where user_id=?`, [user_id]);
    return {
      data: address,
      message: "User Communication Address fetched successfully",
      status: "Success",
      statusCode: 200
    }
  }

  findOne(id: number) {
    return `This action returns a #${id} userCommunicationAddress`;
  }

  async update(id: number, updateUserCommunicationAddressDto: UserCommunicationAddress) {
    let updateAddress = await this.connection.query(`update user_address set
      lattitude=?,
      longitude=?,
      house_no=?,
      area_name=?,
      nearest_landmark=?,
      pincode=?,
      address_type=?
      where id=?`, [
      updateUserCommunicationAddressDto.latitude,
      updateUserCommunicationAddressDto.longitude,
      updateUserCommunicationAddressDto.house_no,
      updateUserCommunicationAddressDto.area_name,
      updateUserCommunicationAddressDto.nearest_landmark,
      updateUserCommunicationAddressDto.pincode,
      updateUserCommunicationAddressDto.address_type,
      id
    ])
    return {
      message: "User Communication Address updated successfully",
      status: "Success",
      statusCode: 200,
      data: await this.connection.query(`select * from user_address where id=?`, [id])
    }
  }

  async remove(id: number) {
    const [getUser_id] = await this.connection.query(`select user_id from user_address where id=?`, [id]);
    const [getUserIdCount] = await this.connection.query(`select count(*) as count from user_address where user_id=?`, [getUser_id.user_id]);
    if (getUserIdCount.count <= 1) {
      return {
        message: "Atleast one address is required for the user",
        status: "Failed",
        statusCode: 400
      }
    }
    await this.connection.query(`delete from user_address where id=?`, [id]);
    return {
      message: "User Communication Address deleted successfully",
      status: "Success",
      statusCode: 200
    }
  }
}
