import CONSTANTS from "../config/constants";
import log from "../config/log";
import { REDIS_CHANNEL, redisSubscriber } from "../config/redis/redis";
import clientDB from "../models/client.model";
import clientConfigDB from "../models/clientConfig.model";
import complaintDB from "../models/complaint.model";
import flatDB from "../models/flat.model";
import occupancyDB from "../models/occupancy.model";
import propertyDB from "../models/property.model";
import settingsDB from "../models/settings.model";
import staffDB from "../models/staff.model";
import tenantDB from "../models/tenant.model";
import whatsappPendingMessagesDB from "../models/whatsappPendingMessages.model";
import { getClientWhatsappCredentialsMessageCentral } from "./getClientWhatsappCredentials";
import { logActivity } from "./logActivity";
import sendNotification from "./sendNotification";
import sendSMS from "./sendSMS";
import sendWhatsappMC from "./sendWhatsappMessageCentral";
import {
  sendWhatsappAssignedNewPropComplaintStaff,
  sendWhatsappAssignedStaff,
  sendWhatsappAssignedStaffNew,
  sendWhatsappAssignedTenant,
} from "./sendWhatsappWithConfig";

const autoAssignComplaint = async (
  clientId: number,
  complaintId: number,
  staffId: number,
  complaintFor: number,
) => {
  const U = "Auto Assign Complaint";
  const F = "autoAssignComplaint";

  try {

    log.info(
      `[${U}], [${F}], Client Id [${clientId}], Complaint Id [${complaintId}], Staff Id [${staffId}], Complaint For [${complaintFor}]`
    );

    let complaint;
    if (Number(complaintFor) === CONSTANTS.COMPLAIN_FOR.ROOM) {
      complaint = await complaintDB.getById({ id: complaintId });
    } else {
      complaint = await complaintDB.getByIdForProp({ id: complaintId });
    }

    if (!complaint) {
      log.info(
        `[${U}], [${F}], Client Id [${clientId}], Staff Id [${staffId}], Complaint Id [${complaintId}], No Complaint Found`
      );
      return false;
    }

    const client = await clientDB.getById({ id: clientId });

    if (!client) {
      log.info(
        `[${U}], [${F}], Client Id [${clientId}], Staff Id [${staffId}], Complaint Id [${complaintId}], No Client Found`
      );

      return false;
    }

    const staff = await staffDB.getById({ id: staffId });
    if (!staff) {
      log.info(
        `[${U}], [${F}], Client Id [${clientId}], Staff Id [${staffId}], Complaint Id [${complaintId}], No Staff Found`
      );
      return false;
    }

    await complaintDB.assignStaffDB({
      id: complaintId,
      assignedTo: staffId,
      status: CONSTANTS.COMPLAINT_STATUS.ASSIGNED,
    });

    const property = await propertyDB.getById({ id: complaint.propId });
    let tenant;
    if (Number(complaintFor) === CONSTANTS.COMPLAIN_FOR.ROOM) {
      tenant = await tenantDB.getById({ id: complaint.tenantId });
      let isNotiSent = false;
      if (tenant.regId) {
        isNotiSent = await sendNotification({
          title: `Your complaint assigned to ${staff.name}`,
          message: `Your complaint has been acknowledged and assigned. They will be working to resolve it as quickly as possible. We appreciate your patience.`,
          regId: tenant.regId,
          userId: tenant.id,
          userType: CONSTANTS.USER_TYPE.TENANT,
          notiCategory: CONSTANTS.NOTIFICATION_CATEGORY.COMPLAIN,
          clientId: clientId,
        });
      } else {
        log.info(
          `[${U}], [${F}], Client Id [${clientId}], Staff Id [${staffId}], Complaint Id [${complaintId}], Tenant Id [${tenant.id}], No Tenant's RegId Found`
        );
      }
    }

    let isNotiSent2 = false;
    if (staff.regId) {
      isNotiSent2 = await sendNotification({
        title: `A new complaint assigned to you`,
        message: `${client.name} has assigned you a new complaint for property ${property.name}. Kindly look at it and do needful.`,
        regId: staff.regId,
        userId: staff.id,
        userType: CONSTANTS.USER_TYPE.STAFF,
        notiCategory: CONSTANTS.NOTIFICATION_CATEGORY.COMPLAIN,
        clientId: clientId,
      });
    } else {
      log.info(
        `[${U}], [${F}], Client Id [${clientId}], Staff Id [${staffId}], Complaint Id [${complaintId}], No Staff's RegId Found`
      );
    }

    const propSettings = await settingsDB.getByClientIdAndPropId({
      clientId,
      propId: complaint.propId,
    });

    if (propSettings) {
      if (propSettings.whatsApp === 1) {
        log.info(
          `[${U}], [${F}], Client Id [${clientId}], WhatsApp Notification enabled`
        );
        let footerText = propSettings.footer || "The Kipinn Team";
        if (Number(complaintFor) === CONSTANTS.COMPLAIN_FOR.ROOM) {
          log.info(
            `[${U}], [${F}], Client Id [${clientId}], Complaint for room`
          );
          /** Notify Staff **/
          // log.info(JSON.stringify(staff));
          // log.info(JSON.stringify(property));
          // log.info(JSON.stringify(tenant));
          const staffBodyVal = [staff.name, property.name, tenant.name, tenant.mobile, complaint.title,footerText.replace("Team", "").trim()];
          //log.info(JSON.stringify(staffBodyVal));
          await whatsappPendingMessagesDB.add ({
            clientId,
            propId: complaint.propId,
            userType: CONSTANTS.USER_TYPE.STAFF,
            userId: staff?.id,
            userName: staff?.name,
            userMobile: staff?.mobile,
            templateType: CONSTANTS.WHATSAPP_TEMPLATE_TYPES.STAFF.COMPLAINT_ASSIGNED,
            payload : JSON.stringify(staffBodyVal),
            file: null,
          });

          /** Notify Tenant **/
          const tenantBodyVal = [tenant?.name, complaint.title, staff.name, footerText.replace("Team", "").trim()];
          //log.info(JSON.stringify(tenantBodyVal));
          await whatsappPendingMessagesDB.add ({
            clientId,
            propId: complaint.propId,
            userType: CONSTANTS.USER_TYPE.TENANT,
            userId: complaint.tenantId,
            userName: tenant?.name,
            userMobile: tenant?.mobile,
            templateType: CONSTANTS.WHATSAPP_TEMPLATE_TYPES.TENANT.COMPLAINT_ASSIGNED,
            payload : JSON.stringify(tenantBodyVal),
            file: null,
          });

          
          // let whatsappAgreegrator = await clientConfigDB.getClientConfig({
          //   clientId,
          //   provider: CONSTANTS.CLIENT_CONFIG_PROVIDER.INTERNAL,
          //   type: CONSTANTS.CLIENT_CONFIG_TYPE.INTERNAL.WHATSAPP_AGGREGATOR
          // });

          //let complaintAssignedStaff = await getClientWhatsappCredentialsMessageCentral(Number(clientId), property?.id, CONSTANTS.WHATSAPP_TEMPLATE_TYPES.STAFF.COMPLAINT_ASSIGNED, CONSTANTS.USER_TYPE.STAFF);
          // if(whatsappAgreegrator && Number(whatsappAgreegrator?.value)  === CONSTANTS.CLIENT_CONFIG_PROVIDER.MESSAGE_CENTRAL && complaintAssignedStaff) {
          //   log.info(
          //     `[${U}], [${F}], Client Id [${clientId}], Staff Id [${staffId}], Complaint Id [${complaintId}], Sending through message central to staff`
          //   );
          //   let flatName = "";
          //     let occupancy = await occupancyDB.getByTenantIdAndClientId({
          //       clientId: clientId,
          //       tenantId: complaint?.tenantId,
          //     });
          //     if (property.type === CONSTANTS.PROPERTY_TYPE.FLAT) {
          //       const { name } = await flatDB.getById({ id: occupancy.flatId });
          //       flatName = name;
          //     } else {
          //       flatName =
          //         occupancy.floor === "G" ? "Ground Floor" : "Floor " + occupancy.floor;
          //     }
          //   const bodyValues: Record<string, string> = {
          //     body_1: `${staff?.name}`,
          //     body_2: `${property?.name}`,
          //     body_3: `${flatName} (${complaint?.roomNum})`,
          //     body_4: `${tenant?.name}`,
          //     body_5: `${tenant?.mobile}`,
          //     body_6: `${complaint?.title}`,
          //     body_7: `${footerText.replace("Team", "").trim()}`
          //   };
          //   log.info(
          //     `[${U}], [${F}], Client Id [${clientId}], Staff Id [${staffId}], Complaint Id [${complaintId}], ${JSON.stringify(bodyValues)}`
          //   );
          //   sendWhatsappMC(
          //     staff.mobile,
          //     Number(clientId),
          //     Number(property.id),
          //     bodyValues,
          //     CONSTANTS.WHATSAPP_TEMPLATE_TYPES.STAFF.COMPLAINT_ASSIGNED,
          //     CONSTANTS.USER_TYPE.STAFF,
          //     CONSTANTS.CLIENT_CONFIG_PROVIDER.MESSAGE_CENTRAL
          //   );
          // } else {
          //   log.info(
          //     `[${U}], [${F}], Client Id [${clientId}], Staff Id [${staffId}], Complaint Id [${complaintId}], Sending through intrakt to staff`
          //   ); 
          //   if(519 === clientId) {
          //     sendWhatsappAssignedStaff(
          //       staff.mobile,
          //       staff.name,
          //       property.name,
          //       tenant.name,
          //       tenant.mobile,
          //       complaint.title,
          //       footerText,
          //       Number(clientId)
          //     );
          //   } else {
          //     let flatName = "";
          //     let occupancy = await occupancyDB.getByTenantIdAndClientId({
          //       clientId: clientId,
          //       tenantId: complaint?.tenantId,
          //     });
          //     if (property.type === CONSTANTS.PROPERTY_TYPE.FLAT) {
          //       const { name } = await flatDB.getById({ id: occupancy.flatId });
          //       flatName = name;
          //     } else {
          //       flatName =
          //         occupancy.floor === "G" ? "Ground Floor" : "Floor " + occupancy.floor;
          //     }
          //     sendWhatsappAssignedStaffNew(
          //       staff.mobile,
          //       staff.name,
          //       property.name,
          //       `${flatName} (${complaint?.roomNum})`,
          //       tenant.name,
          //       tenant.mobile,
          //       complaint.title,
          //       footerText,
          //       Number(clientId)
          //     );
          //   }
          // }
          // let complaintAssignedTenant = await getClientWhatsappCredentialsMessageCentral(Number(clientId), property?.id, CONSTANTS.WHATSAPP_TEMPLATE_TYPES.TENANT.COMPLAINT_ASSIGNED, CONSTANTS.USER_TYPE.TENANT); 
          // if(whatsappAgreegrator && Number(whatsappAgreegrator?.value)  === CONSTANTS.CLIENT_CONFIG_PROVIDER.MESSAGE_CENTRAL && complaintAssignedTenant) {
          //   log.info(
          //     `[${U}], [${F}], Client Id [${clientId}], Staff Id [${staffId}], Complaint Id [${complaintId}], Sending through message central to tenant`
          //   );
          //   const bodyValues: Record<string, string> = {
          //     body_1: `${tenant?.name}`,
          //     body_2: `${complaint.title}`,
          //     body_3: `${staff.name}`,
          //     body_4: `${footerText.replace("Team", "").trim()}`
          //   };
          //   sendWhatsappMC(
          //     tenant?.mobile,
          //     Number(clientId),
          //     Number(property.id),
          //     bodyValues,
          //     CONSTANTS.WHATSAPP_TEMPLATE_TYPES.TENANT.COMPLAINT_ASSIGNED,
          //     CONSTANTS.USER_TYPE.TENANT,
          //     CONSTANTS.CLIENT_CONFIG_PROVIDER.MESSAGE_CENTRAL
          //   );
          // } else {
          //   log.info(
          //     `[${U}], [${F}], Client Id [${clientId}], Staff Id [${staffId}], Complaint Id [${complaintId}], Sending through intrakt to tenant`
          //   );
          //   sendWhatsappAssignedTenant(
          //     tenant.mobile,
          //     tenant.name,
          //     complaint.title,
          //     staff.name,
          //     footerText,
          //     Number(clientId)
          //   );
          // }
        } else {
          log.info(
            `[${U}], [${F}], Client Id [${clientId}], Complaint for property`
          );
          // sendWhatsappAssignedStaff(
          //   staff.mobile,
          //   staff.name,
          //   property.name,
          //   client.name,
          //   client.mobile,
          //   complaint.title,
          //   footerText,
          //   Number(clientId)
          // );
          sendWhatsappAssignedNewPropComplaintStaff(
            staff.mobile,
            staff.name,
            property.name,
            complaint.title,
            footerText, 
            Number(clientId),
          );
        }
      }
    }

    // if (complaintFor === CONSTANTS.COMPLAIN_FOR.ROOM) {
    //   await logActivity(
    //     userType,
    //     Number(req.id!),
    //     Number(req.platform),
    //     tenant.id,
    //     CONSTANTS.ACTIVITY_TYPES.ASSIGN_TENANT_COMPLAINT,
    //     complaint.title,
    //     staff.name,
    //     null,
    //     null,
    //     null
    //   );
    // }

    log.info(
      `[${U}], [${F}], Client Id [${clientId}], Staff Id [${staffId}], Complaint Id [${complaintId}], Assigned Staff Successfully`
    );

    return true;
  } catch (error: any) {
    log.info(`[${U}], [${F}], Error: ${error?.message || error}`);
    return false;
  }
};

export default autoAssignComplaint;
