import { Router } from "express";
import client from "../controllers/client.controller";
import room from "../controllers/room.controller";
import authorize from "../middlewares/authorization.middleware";
import validateData from "../middlewares/validation.middleware";
import {
  cancelRemoveTenantSchema,
  extendStaySchema,
  initiateRemoveTenantSchema,
  loginSchema,
  onBoardingSchema,
  otpVerificationSchema,
  removeTenantNowSchema,
  UpdateRegIdSchema,
  RenewRentAgreementSchema,
  EditRentSchema,
  EditSecuritySchema,
  EditFineSchema,
  EditGracePeriodSchema,
  EditMoveInDateSchema,
  EditAgreementPeriodSchema,
  EditTenantNameSchema,
  EditMoveOutDateSchema,
} from "../schemas/client.schema";
import { multerArrayFn, multerSingleFn } from "../middlewares/multer.middleware";

const router = Router();

router.post("/login", validateData(loginSchema), client.Login);
router.post("/switch", authorize, client.LoginWithPartnerOrPersonalProp);
router.post("/staff/switch", authorize, client.StaffLoginWithParticularClient);
router.post("/internal/login", validateData(loginSchema), client.InternalLogin);
router.post(
  "/otp/verify",
  validateData(otpVerificationSchema),
  client.OTPVerify
);

// PROTECTED ROUTES
router.post(
  "/onboarding",
  authorize,
  validateData(onBoardingSchema),
  client.OnBoarding
);

router.get("/dashboard", authorize, client.Dashboard);
router.get("/dashboard/income", authorize, client.DashboardIncome);
router.get("/pendingrent", authorize, client.PendingRent);
router.get("/pendingrent/month/daily", authorize, client.PendingRentX);
router.get("/net/profit/loss", authorize, client.GetNetProfitLossData);
router.get("/request/list", authorize, client.GetRequestList);
//Approve or Reject Guest Request
router.post("/request/guest/consent", authorize, client.ConsentToGuestRequest);
//Approve or Reject Movement Request
router.post("/request/movement/consent", authorize, client.ConsentToMovementRequest);
//Approve or Reject Refund Request
router.post("/request/refund/consent", authorize, client.ConsentToRefundRequest);
router.post("/reminded-tenant", authorize, client.UpdateTenantLastReminded);

router.post("/send-reminder", authorize, client.SendBulkReminders);

/*
  Gets CLient Graph Based On Type and Term
*/
router.get("/graph", authorize, client.Graph);

router.post(
  "/tenant/remove",
  authorize,
  validateData(initiateRemoveTenantSchema),
  client.InitiateRemovalOfTenant
);

router.post(
  "/tenant/remove/cancel",
  authorize,
  validateData(cancelRemoveTenantSchema),
  client.CancelRemovalOfTenant
);

router.post(
  "/tenant/remove/now",
  authorize,
  validateData(removeTenantNowSchema),
  client.RemoveTenantNow
);

router.post(
  "/tenant/extend/stay",
  authorize,
  validateData(extendStaySchema),
  client.ExtendStay
);

router.post(
  "/regid/update",
  authorize,
  validateData(UpdateRegIdSchema),
  client.UpdateRegId
);

router.get(
  "/tenant/agreement-expiring",
  authorize,
  client.GetTenantWhoseAgrementExpiring
);

router.post(
  "/agreement/renew",
  authorize,
  validateData(RenewRentAgreementSchema),
  client.RenewRentAgreement
);

router.post(
  "/rent/update",
  authorize,
  validateData(EditRentSchema),
  client.EditRent
);

router.post(
  "/tenantname/update",
  authorize,
  validateData(EditTenantNameSchema),
  client.EditTenantName
);

router.post(
  "/security/update",
  authorize,
  validateData(EditSecuritySchema),
  client.EditSecurity
);

router.post(
  "/moveindate/update",
  authorize,
  validateData(EditMoveInDateSchema),
  client.EditMoveInDate
);

router.post(
  "/moveoutdate/update",
  authorize,
  validateData(EditMoveOutDateSchema),
  client.EditMoveOutDate
);

router.post(
  "/agreementperiod/update",
  authorize,
  validateData(EditAgreementPeriodSchema),
  client.EditAgreementPeriod
);

router.post(
  "/fine/update",
  authorize,
  validateData(EditFineSchema),
  client.EditFine
);
router.post(
  "/grace-period/update",
  authorize,
  validateData(EditGracePeriodSchema),
  client.EditGracePeriod
);

router.post("/fine/toggle", authorize, client.ToggleFine);

router.post("/onlinepayment/toggle", authorize, client.ToggleOnlinePayment);
router.post("/gst/toggle", authorize, client.ToggleGst);

router.post(
  "/kyc/upload/id",
  authorize,
  (req, res, next) => multerArrayFn(req, res, next, 2),
  client.UploadID
);

router.post(
  "/kyc/upload/document",
  authorize,
  (req, res, next) => multerArrayFn(req, res, next, 2),
  client.UploadDocument
);

router.get(
  "/list/staff/attendance/:date",
  authorize,
  client.ListStaffAttendance
);

router.get(
  "/list/particular/staff/attendance/:staffId",
  authorize,
  client.ListParticularStaffAttendance
);

router.post(
  "/manage/staff/permissions",
  authorize,
  client.ManageStaffPermissions
);

router.get(
  "/list/staff/permission/:staffId",
  authorize,
  client.ListStaffPermissions
);

router.get(
  "/list/bed/stats",
  authorize,
  client.GetBedsStats
);

router.get(
  "/analytics",
  authorize,
  client.Analytics
);

router.get(
  "/analytics/profit/loss",
  authorize,
  client.ProfitLossAnalytics
);

router.post(
  "/landlord/docs/upload",
  authorize,
  (req, res, next) => multerArrayFn(req, res, next, 2),
  client.UploadLandlordDocs
);

router.post(
  "/add/partner",
  authorize,
  client.AddPartner,
);

router.post(
  "/edit/partner",
  authorize,
  client.EditPartner,
);

router.get(
  "/list/partners",
  authorize,
  client.ListPartners,
);

router.get(
  "/list/tenants/missing/rent",
  authorize,
  client.ListTenantsWithMissingRent,
);

router.post(
  "/add/landlord/bank",
  authorize,
  multerSingleFn,
  client.AddLandlordBankDetails
);

router.post(
  "/edit/landlord/bank",
  authorize,
  multerSingleFn,
  client.EditLandlordBankDetails
);

router.get(
  "/list/landlord/banks",
  authorize,
  client.ListLandlordBankDetails
);

router.post(
  "/delete/landlord/bank",
  authorize,
  client.DeleteLandlordBankDetails
);

router.post(
  "/delete/tenant",
  authorize,
  client.DeleteTenant
);

router.get(
  "/pending/tasks",
  authorize,
  client.PendingTasks
);

router.post(
  "/update/occupancy",
  authorize,
  room.UpdateRoomOcccupancy
);

router.post(
  "/update/occupancy/fully",
  authorize,
  room.OccupyFullRoom
);

router.get(
  "/rent/renewal/setting/list",
  authorize,
  client.ListRentAgreementRenewalSetting
);

router.post(
  "/rent/renewal/setting/edit",
  authorize,
  client.EditRentAgreementRenewalSetting
);

router.get(
  "/tenant/onboarding/setting/list",
  authorize,
  client.ListTenantOnboardingSetting
);

router.post(
  "/tenant/onboarding/setting/edit",
  authorize,
  client.EditTenantOnboardingSetting
);

router.get(
  "/finance/setting/list",
  authorize,
  client.ListFinanceSetting
);

router.post(
  "/finance/setting/edit",
  authorize,
  client.EditFinanceSetting
);

router.get(
  "/eviction/setting/list",
  authorize,
  client.ListEvictionSetting
);

router.post(
  "/eviction/setting/edit",
  authorize,
  client.EditEvictionSetting
);

router.get(
  "/receipt/terms/list",
  authorize,
  client.ListReceiptTerms
);

router.post(
  "/receipt/terms/edit",
  authorize,
  client.EditReceiptTerms
);

router.get(
  "/tally/sync",
  authorize,
  client.TallySync
);

router.get(
  "/tally/setting/list",
  authorize,
  client.ListTallySettings
);

router.post(
  "/tally/setting/edit",
  authorize,
  client.UpdateTallySettings
);

router.get(
  "/global/setting/list",
  authorize,
  client.ListGlobalConfiguration
);

router.post(
  "/global/setting/edit",
  authorize,
  client.EditGlobalConfiguration
);

router.post(
  "/edit/profile",
  authorize,
  client.EditProfile
);
router.get(
  "/stamp/list",
  authorize,
  client.ListStampPapers
);
router.post("/stamp/shift", authorize, client.ShiftStamps);
// router.post("/add/beneficiary", authorize, client.AddBeneficiary);
// router.get("/list/beneficiary", authorize, client.ListBeneficiaries);

router.get(
  "/tenant/qrCode/data",
  authorize,
  client.GetTenantDataForQRCode
);

export default router;
