import { Injectable } from '@nestjs/common';
import { DataSource } from 'typeorm';
import axios from "axios";


import PaginationDto from './dtos/pagination.dto';
import { AddPackagesDto } from './dtos/app-packages.dto';
import { UpdatePackagesDto } from './dtos/update-package.dto';
import { AddPackageCategoriesDto, EditPackageCategoriesDto } from './dtos/add-package-categories.dto';

@Injectable()
export class OpHubPackagesService {
    constructor(private readonly connection: DataSource) { }

    async createPackageCategory(addPackageCategoriesDto: AddPackageCategoriesDto) {

        try {
            const [getBaseURL] = await this.connection.query(
                `SELECT op_hub_base_url FROM hospitals WHERE plenome_id = ?`,
                [addPackageCategoriesDto.hospital_id]
            );

            if (!getBaseURL) {
                throw new Error("Hospital base URL not found");
            }
            addPackageCategoriesDto.created_source = 'op-hub'
            const apiURL = `${getBaseURL.op_hub_base_url}/package-categories`;
            const result = await axios.post(apiURL, addPackageCategoriesDto);
            return result.data;
        } catch (error) {
            console.log(error)
            return {
                status: 'failed',
                message: 'Failed to add package category',
            };
        }
    }

    async updatePackageCategory(
        package_category_id: number,
        editPackageCategoriesDto: EditPackageCategoriesDto,
    ) {
        try {
            const [getBaseURL] = await this.connection.query(
                `SELECT op_hub_base_url FROM hospitals WHERE plenome_id = ?`,
                [editPackageCategoriesDto.hospital_id],
            );

            if (!getBaseURL || !getBaseURL.op_hub_base_url) {
                throw new Error('Hospital base URL not found');
            }
            const apiURL = `${getBaseURL.op_hub_base_url}/package-categories/${package_category_id}`;

            const result = await axios.put(apiURL, editPackageCategoriesDto);

            return result.data

        } catch (error) {
            console.error('Update Package Category Error:', error?.message);

            return {
                status: 'failed',
                message: 'Failed to update package category',
                error: error?.response?.data || error?.message,
            };
        }
    }


    async findById(id: number, hospital_id: number) {
        try {
            const [getBaseURL] = await this.connection.query(
                `SELECT op_hub_base_url FROM hospitals WHERE plenome_id = ?`,
                [hospital_id],
            );

            if (!getBaseURL || !getBaseURL.op_hub_base_url) {
                throw new Error("Hospital base URL not found");
            }
            const apiURL = `${getBaseURL.op_hub_base_url}/package-categories/${id}`;
            const result = await axios.get(apiURL);
            return result.data;

        } catch (error) {
            return {
                status: "failed",
                message: "Failed to fetch package category",
            };
        }
    }

    async findAll(paginationDto: PaginationDto) {
        try {
            let { page = 1, limit = 10, search = "" } = paginationDto;

            const [getBaseURL] = await this.connection.query(
                `SELECT op_hub_base_url FROM hospitals WHERE plenome_id = ?`,
                [paginationDto.hospital_id],
            );

            if (!getBaseURL?.op_hub_base_url) {
                throw new Error("Hospital base URL not found");
            }

            const apiURL = `${getBaseURL.op_hub_base_url}/package-categories`;
            const params: any = {
                page,
                limit,
            };
            if (search && search != '') {
                params.search = search;
            }
            const result = await axios.get(apiURL, { params });
            return result.data;

        } catch (error) {
            console.error("Find All Error:", error?.message);

            return {
                status: "failed",
                message: "Failed to fetch package categories list",
            };
        }
    }

    async delete(package_category_id: number, hospital_id: number) {
        try {
            const [getBaseURL] = await this.connection.query(
                `SELECT op_hub_base_url FROM hospitals WHERE plenome_id = ?`,
                [hospital_id]
            );

            if (!getBaseURL?.op_hub_base_url) {
                throw new Error("Hospital base URL not found");
            }

            const apiURL = `${getBaseURL.op_hub_base_url}/package-categories/${package_category_id}/${hospital_id}`;

            const result = await axios.delete(apiURL);
            return result.data

        } catch (error) {
            console.error("Delete Error:", error);

            return {
                status: 'failed',
                message: 'Failed to delete package category',
            };
        }
    }

    async createPackage(addPackagesDto: AddPackagesDto) {
        try {
            const [getBaseURL] = await this.connection.query(
                `SELECT op_hub_base_url FROM hospitals WHERE plenome_id = ?`,
                [addPackagesDto.hospital_id]
            );

            if (!getBaseURL) {
                throw new Error("Hospital base URL not found");
            }
            addPackagesDto.created_source = 'op-hub'
            const apiURL = `${getBaseURL.op_hub_base_url}/app-packages`;
            const result = await axios.post(apiURL, addPackagesDto);
            return result.data;
        } catch (error) {
            console.log(error)
            return {
                status: 'failed',
                message: 'Failed to add packages ',
            };
        }
    }

    async packageUpdate(
        package_id: number,
        updatePackagesDto: UpdatePackagesDto,
    ) {
        try {
            const [getBaseURL] = await this.connection.query(
                `SELECT op_hub_base_url FROM hospitals WHERE plenome_id = ?`,
                [updatePackagesDto.hospital_id],
            );

            if (!getBaseURL || !getBaseURL.op_hub_base_url) {
                throw new Error('Hospital base URL not found');
            }

            const apiURL = `${getBaseURL.op_hub_base_url}/app-packages/${package_id}`;

            const result = await axios.put(apiURL, updatePackagesDto);

            return result.data

        } catch (error) {
            console.error('Update Packages Error:', error?.message);

            return {
                status: 'failed',
                message: 'Failed to update packages',
            };
        }
    }

    async findPackagesList(paginationDto: PaginationDto) {
        try {
            const { page = 1, limit = 10, search = "", package_status = '' } = paginationDto;

            const [getBaseURL] = await this.connection.query(
                `SELECT op_hub_base_url FROM hospitals WHERE plenome_id = ?`,
                [paginationDto.hospital_id],
            );

            if (!getBaseURL?.op_hub_base_url) {
                throw new Error("Hospital base URL not found");
            }

            const apiURL = `${getBaseURL.op_hub_base_url}/app-packages/v2/getPackagesList`;
            const params: any = {
                page,
                limit,
            };
            if (search && search != '') {
                params.search = search;
            }
            if (package_status && package_status != '') {
                params.package_status = package_status;
            }
            const result = await axios.get(apiURL, { params });
            return result.data;

        } catch (error) {
            console.error("Find All Error:", error);

            return {
                status: "failed",
                message: "Failed to fetch packages list",
            };
        }
    }

    async getPackageDetails(package_id: number, hospital_id: number) {
        try {
            const [getBaseURL] = await this.connection.query(
                `SELECT op_hub_base_url FROM hospitals WHERE plenome_id = ?`,
                [hospital_id],
            );

            if (!getBaseURL || !getBaseURL.op_hub_base_url) {
                throw new Error("Hospital base URL not found");
            }

            const apiURL = `${getBaseURL.op_hub_base_url}/app-packages/${package_id}`;
            const result = await axios.get(apiURL);
            return result.data;

        } catch (error) {
            console.error("Find By ID Error:", error);
            return {
                status: "failed",
                message: "Failed to fetch package details",
            };
        }
    }

    async deletePackages(package_id: number, hospital_id: number) {
        try {
            const [getBaseURL] = await this.connection.query(
                `SELECT op_hub_base_url FROM hospitals WHERE plenome_id = ?`,
                [hospital_id]
            );

            if (!getBaseURL?.op_hub_base_url) {
                throw new Error("Hospital base URL not found");
            }

            const apiURL = `${getBaseURL.op_hub_base_url}/app-packages/${package_id}`;

            const result = await axios.delete(apiURL);

            return result.data

        } catch (error) {
            console.error("Delete Error:", error?.message);
            return {
                status: 'failed',
                message: 'Failed to delete packages',
            };
        }
    }
}
