import {
  Controller,
  Get,
  Post,
  Body,
  Patch,
  Param,
  Delete,
  Query,
} from "@nestjs/common";
import { NewBillingService } from "./new-billing.service";
import { CreateNewBillingDto } from "./dto/create-new-billing.dto";
import { UpdateNewBillingDto } from "./dto/update-new-billing.dto";
import { SkipThrottle } from "@nestjs/throttler";
import { phrupdatepaymentdetails } from "./entities/new-billing.entity";

@Controller("phr-new-billing")
export class NewBillingController {
  constructor(private readonly newBillingService: NewBillingService) {}

  @SkipThrottle()
  @Get("billing-summary-bills")
  findAll(
    @Query("hospital_id") hospital_id: number,
    @Query("aayush_unique_id") aayush_unique_id: string,
    @Query("payment_module") payment_module: string,
    @Query("bill_type") bill_type: string,
    @Query("limit") limit: number,
    @Query("page") page: number,
    @Query("search_text") search_text: string
  ) {
    return this.newBillingService.phrfindAll(
      hospital_id,
      aayush_unique_id,
      payment_module,
      bill_type,
      limit || 10,
      page || 1,
      search_text
    );
  }

  @SkipThrottle()
  @Get("transaction-list")
  async findOne(
    @Query("hospital_id") hospital_id: number,
    @Query("aayush_unique_id") aayush_unique_id: string,
    @Query("payment_module") payment_module: string,
    @Query("limit") limit: number,
    @Query("page") page: number
  ) {
    if (!aayush_unique_id) {
      return {
        status: "failed",
        status_code: 400,
        message: "aayush_unique_id is required",
      };
    }
    return this.newBillingService.findtransactiondetails(
      hospital_id,
      aayush_unique_id,
      payment_module,
      limit || 10,
      page || 1
    );
  }

  @SkipThrottle()
  @Post("patient-wallet")
  update(@Query("aayush_unique_id") aayush_unique_id: string) {
    return this.newBillingService.phr_patient_wallet(aayush_unique_id);
  }

  @SkipThrottle()
  @Post("coins-used")
  coins_used(
    @Query("hospital_id") hospital_id: number,
    @Query("aayush_unique_id") aayush_unique_id: string,
    @Query("coins_used") coins_used: number
  ) {
    if (!aayush_unique_id || !coins_used) {
      return {
        status: "failed",
        status_code: 400,
        message: "aayush_unique_id and coins_used is required",
      };
    }
    return this.newBillingService.coins_used(
      hospital_id,
      aayush_unique_id,
      coins_used
    );
  }

  @SkipThrottle()
  @Post("add-in-overallcharge")
  Addchargedata(
    @Query("aayush_unique_id") aayush_unique_id: string,
    @Query("hospital_id") hospital_id: number,
    @Body() body: any
  ) {
    if (!aayush_unique_id || !hospital_id) {
      return {
        status: "failed",
        status_code: 400,
        message: "aayush_unique_id, hospital_id are required",
      };
    }
    if (
      Number(body.total_tax_amount) + Number(body.overall_subtotal_amount) !=
      Number(body.total_billed_amount)
    ) {
      return {
        status: "failed",
        status_code: 400,
        message:
          "sum of subtotal and tax amount must be equal to billed amount",
      };
    }
    return this.newBillingService.add_overall_charges(
      aayush_unique_id,
      hospital_id,
      body
    );
  }

  @SkipThrottle()
  @Post("update-in-overallcharge")
  Updatechargedata(
    @Query("aayush_unique_id") aayush_unique_id: string,
    @Query("hospital_id") hospital_id: number,
    @Body() body: any
  ) {
    if (!aayush_unique_id || !hospital_id) {
      return {
        status: "failed",
        status_code: 400,
        message: "aayush_unique_id, hospital_id are required",
      };
    }

    return this.newBillingService.update_overall_charges(
      aayush_unique_id,
      hospital_id,
      body
    );
  }

  @SkipThrottle()
  @Get("phr-wallet-transactions")
  async phr_wallet_transactions(
    @Query("aayush_unique_id") aayush_unique_id: string,
    @Query("transaction_status") transaction_status: string
  ) {
    if (!aayush_unique_id) {
      return {
        status: "failed",
        status_code: 400,
        message: "aayush_unique_id is required",
      };
    }
    return this.newBillingService.phr_wallet_credit_transactions(
      aayush_unique_id,
      transaction_status
    );
  }

  @Post("/update/paymentdata")
  updatepaymentdetails(
    @Query("transaction_id") transaction_id: string,
    @Query("hospital_id") hospital_id: number,
    @Body() updatePhrAppointmentDto: phrupdatepaymentdetails
  ) {
    return this.newBillingService.phr_update_paymentdata(
      transaction_id,
      hospital_id,
      updatePhrAppointmentDto
    );
  }

  @SkipThrottle()
  @Get("invoice-data")
  async invoice_data(
    @Query("hos_transaction_id") hos_transaction_id: string,
    @Query("hospital_id") hospital_id: number
  ) {
    if (!hospital_id || !hos_transaction_id) {
      return {
        status: "failed",
        status_code: 400,
        message: "hospital_id, hos_transaction_id are required",
      };
    }
    return this.newBillingService.invoice_data(hos_transaction_id, hospital_id);
  }
}
