import moment from "moment";
import CONSTANTS from "../config/constants";
import activityLogsDB from "../models/activityLogs.model";
import clientDB from "../models/client.model";
import flatDB from "../models/flat.model";
import moveOutDB from "../models/moveOut.model";
import occupancyDB from "../models/occupancy.model";
import propertyDB from "../models/property.model";
import roomDB from "../models/room.model";
import staffDB from "../models/staff.model";
import tenantDB from "../models/tenant.model";
import expenseDB from "../models/expense.model";
import log from "../config/log";
import vendor from "../controllers/vendors.controller";
import vendorDB from "../models/vendor.model";
import getModeName from "./getModeName";
import getDueName from "./getDueName";
import landlordDB from "../models/landlord.model";
import bankDB from "../models/bank.model";
import propertyLeaseDB from "../models/propertyLease.model";
import leadDB from "../models/lead.model";
import leadActivityLogsDB from "../models/leadActivityLogs.model";

export const logLeadActivity = async (
  userType: number,
  id: number,
  parentId: number,
  device: number,
  leadId: number,
  activity: number,
  status: number,
  arg1: any,
) => {
  const U = "logLeadActivity";
  const F = "logLeadActivity";
  try {
    let clientId = id;
    let doneBy = parentId;
    let userName = "";
    let staff = null;
    let client = null;
    if (userType === CONSTANTS.USER_TYPE.STAFF) {
      staff = await staffDB.getById({ id: id });
      userName = staff.name;
      clientId = staff.clientId;
      doneBy = id;
    } else {
      client = await clientDB.getById({ id: parentId });
      userName = client.name;
    }

    const lead = await leadDB.getById({ id: leadId });
    if (!lead) {
      log.info(`[${U}], [${F}], Lead Id [${leadId}], No Lead Found With Id`);
      return;
    }

    let description = "";
    if (activity === CONSTANTS.LEAD_ACTIVITY_TYPES.ADD) {
        description = `${userName} has added a new lead(${lead?.name}, ${lead?.mobile})`;
    } else if (activity === CONSTANTS.LEAD_ACTIVITY_TYPES.CONTACTED) {
        description = `${userName} has contacted ${lead?.name}`;
    } else if (activity === CONSTANTS.LEAD_ACTIVITY_TYPES.CONTACTED) {
        description = `${userName} has contacted ${lead?.name}`;
    } else if (activity === CONSTANTS.LEAD_ACTIVITY_TYPES.CONVERTED) {
        description = `${userName} has booked ${lead?.name} on ${moment().format("YYYY-MM-DD")}`;
    } else if (activity === CONSTANTS.LEAD_ACTIVITY_TYPES.FOLLOW_UP) {
        description = `${userName} has scheduled a follow up with ${lead?.name}`;
    } else if (activity === CONSTANTS.LEAD_ACTIVITY_TYPES.INTERESTED) {
        description = `${userName} has contacted ${lead?.name} and marked him as interested`;
    } else if (activity === CONSTANTS.LEAD_ACTIVITY_TYPES.INVALID) {
        description = `${userName} tried to contact ${lead?.name}, but the contact details were invalid`;
    } else if (activity === CONSTANTS.LEAD_ACTIVITY_TYPES.LOST) {
        description = `${userName} lost ${lead?.name} as a lead`;
    } else if (activity === CONSTANTS.LEAD_ACTIVITY_TYPES.MOVED_IN) {
        description = `${userName} has moved-in ${lead?.name} as a tenant`;
    } else if (activity === CONSTANTS.LEAD_ACTIVITY_TYPES.NOT_ANSWERED) {
        description = `${userName} tried to contact ${lead?.name}, but could not reach him`;
    } else if (activity === CONSTANTS.LEAD_ACTIVITY_TYPES.NOT_INTERESTED) {
        description = `${userName} has contacted ${lead?.name} and marked him as not interested`;
    } else if (activity === CONSTANTS.LEAD_ACTIVITY_TYPES.ONHOLD) {
        description = `${userName} has put ${lead?.name} on hold`;
    } else if (activity === CONSTANTS.LEAD_ACTIVITY_TYPES.STAFF_ASSIGNED) {
        description = `${userName} has assigned ${arg1} to pursue ${lead?.name} as lead`;
    } else if (activity === CONSTANTS.LEAD_ACTIVITY_TYPES.VISIT_DONE) {
        description = `${userName} has shown interested property to ${lead?.name}`;
    } else if (activity === CONSTANTS.LEAD_ACTIVITY_TYPES.VISIT_SCHEDULED) {
        description = `${userName} has scheduled a visit for ${lead?.name} for ${moment(arg1).format("YYYY-MM-DD")}`;
    }

    let doneByRole = 0;
    if (userType === CONSTANTS.USER_TYPE.STAFF) {
      doneByRole = staff?.role;
    }

    await leadActivityLogsDB.logActivity({
      leadId: leadId,
      clientId,
      status: status,
      doneByUserType: userType,
      doneBy: doneBy,
      doneByName: userName,
      doneByRole: doneByRole,
      activity: activity,
      description: description,
      device: device || 0,
    });
  } catch (error: any) {
    log.info(`[${U}], [${F}], Error: ${error?.message || error}`);
  }
};