package handlers

import (
	"encoding/json"
	"errors"
	"fmt"
	"github.com/getsentry/sentry-go"
	"net/http"
	"strconv"
	"strings"
	"time"

	//"strconv"
	aes "cf-capital/module_server/handlers/aes"
	"cf-capital/module_server/handlers/auth"
	"cf-capital/module_server/handlers/pdf"
	eloquent "cf-capital/module_server/handlers/eloquent"
	mail "cf-capital/module_server/handlers/email"
	investment "cf-capital/module_server/handlers/investment/statement"
	investmentV1 "cf-capital/module_server/handlers/investment/statement-v1"
	lendbox "cf-capital/module_server/handlers/lendbox"
	razorpay "cf-capital/module_server/handlers/razorpay"
	slack "cf-capital/module_server/handlers/slack"
	testUser "cf-capital/module_server/handlers/test/user"
	mLogin "cf-capital/module_server/handlers/mLogin"
	server_handlers "cf-server/server/handlers"
	commands "cf-capital/module_server/handlers/commands"

	"io/ioutil"
	"text/template"

	"github.com/go-playground/validator/v10"
	log "github.com/rs/zerolog/log"
)

//var decoder = schema.NewDecoder()

type Context struct {
	Title  string
	Name   string
	Fruits [3]string
}

type ApiError struct {
	Status  string `json:"status"`
	Message string `json:"message"`
}

type responseBody struct {
	Status        string `json:"status"`
	Message       string `json:"message"`
	Link          string `json:"link,omitempty"`
	Token         string `json:"token,omitempty"`
	ReferenceCode string `json:"reference_code,omitempty"`
	Data          string `json:"data,omitempty"`
}

type responseBodyPan struct {
	Status  string                         `json:"status"`
	Message string                         `json:"message"`
	Data    eloquent.ValidatePANDataResult `json:"data"`
}

type responseBodyPincode struct {
	Status  string                            `json:"status"`
	Message string                            `json:"message"`
	Data    eloquent.PincodeDetailsDataResult `json:"data"`
}

type responseBodyInvestorBorrowerMapping struct {
	Status  string                           `json:"status"`
	Message string                           `json:"message"`
	Data    eloquent.InvestorBorrowerMapping `json:"data"`
}

type responseBodyPassbook struct {
	Status  string                      `json:"status"`
	Message string                      `json:"message"`
	Data    []investmentV1.PassbookData `json:"data"`
}

type responseBodyAccounts struct {
	Status  string                     `json:"status"`
	Message string                     `json:"message"`
	Data    []investmentV1.AccountData `json:"data"`
}

type responseBodyScheme struct {
	Status  string                    `json:"status"`
	Message string                    `json:"message"`
	Data    []investmentV1.SchemeData `json:"data"`
}

type responseBodyWithdrawal struct {
	Status  string                        `json:"status"`
	Message string                        `json:"message"`
	Data    []investmentV1.WithdrawalList `json:"data"`
}

type responseBodyTransactions struct {
	Status  string                         `json:"status"`
	Message string                         `json:"message"`
	Data    []investmentV1.TransactionData `json:"data"`
}

type responseBodyInvestors struct {
	Status  string                       `json:"status"`
	Message string                       `json:"message"`
	Data    []investmentV1.InvestorsData `json:"data"`
}

type responseProfile struct {
	Status      string               `json:"status"`
	Message     string               `json:"message"`
	UserDetails eloquent.UserDetails `json:"data"`
}

type responseNominee struct {
	Status  string           `json:"status"`
	Message string           `json:"message"`
	Data    eloquent.Nominee `json:"data"`
}

type responseBank struct {
	Status  string              `json:"status"`
	Message string              `json:"message"`
	Data    []eloquent.BankData `json:"data"`
}

func GenerateOTP() http.HandlerFunc {
	return func(w http.ResponseWriter, req *http.Request) {
		w.Header().Set("Content-Type", "application/json")

		log.Info().Msg("GenerateOTP called")
		sentry.CaptureMessage("GenerateOTP called")
		reqBody, _ := ioutil.ReadAll(req.Body)

		var elo eloquent.OTPManagerTable
		err := json.Unmarshal(reqBody, &elo.Data)

		if err != nil {
			log.Info().Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: "Unable to parse the data"})
			return
		}

		validate := validator.New()
		err = validate.Struct(elo.Data)
		if err != nil {
			log.Info().Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(errorValidation(err))
			return
		}

		_, err = elo.GenerateOTP()
		if err != nil {
			log.Info().Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: err.Error()})
			return
		}

		log.Info().Msg("OTP sent successfully")

		server_handlers.FormatResponse(w, 200)
		_ = json.NewEncoder(w).Encode(responseBody{Status: "OK", Message: "OTP sent successfully"})

	}
}

func VerifyPassword() http.HandlerFunc {
	return func(w http.ResponseWriter, req *http.Request) {
		w.Header().Set("Content-Type", "application/json")

		log.Info().Msg("verify password called")
		sentry.CaptureMessage("verify password called")
		reqBody, _ := ioutil.ReadAll(req.Body)

		var elo eloquent.PasswordManagerTable
		err := json.Unmarshal(reqBody, &elo.Data)

		if err != nil {
			log.Info().Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: "Unable to parse the data"})
			return
		}

		validate := validator.New()
		err = validate.Struct(elo.Data)
		if err != nil {
			log.Info().Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(errorValidation(err))
			return
		}

		res, err := elo.VerifyPassword()
		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: err.Error()})
			return
		}

		log.Print("Successfully loginned")
		server_handlers.FormatResponse(w, 200)
		_ = json.NewEncoder(w).Encode(responseBody{Status: "OK", Message: "Password validated successfully", Token: res.Token})

	}
}

func VerifyOTP() http.HandlerFunc {
	return func(w http.ResponseWriter, req *http.Request) {
		w.Header().Set("Content-Type", "application/json")

		reqBody, _ := ioutil.ReadAll(req.Body)

		var elo eloquent.OTPManagerTable
		err := json.Unmarshal(reqBody, &elo.Data)

		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: "Unable to parse the data"})
			return
		}

		validate := validator.New()
		err = validate.Struct(elo.Data)
		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(errorValidation(err))
			return
		}

		res, err := elo.VerifyOTP()
		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: err.Error()})
			return
		}

		if len(elo.Data.Service.ServiceType) > 0 && len(elo.Data.Service.ReferenceCode) > 0 {
			withdrawal, user := getWithdrawalData(elo.Data.Service.ReferenceCode)
			sendWithdrawalEmail(withdrawal, user, "")
			server_handlers.FormatResponse(w, 200)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "OK", Message: "Withdrawal request verified successfully"})
			return
		}

		server_handlers.FormatResponse(w, 200)
		_ = json.NewEncoder(w).Encode(responseBody{Status: "OK", Message: "OTP validate successfully", Token: res.Token})

	}
}

func ValidatePAN() http.HandlerFunc {
	return func(w http.ResponseWriter, req *http.Request) {
		w.Header().Set("Content-Type", "application/json")

		reqBody, _ := ioutil.ReadAll(req.Body)

		var elo eloquent.ValidatePANDetails
		elo.Auth.ID = auth.GetAuth(req)
		err := json.Unmarshal(reqBody, &elo.Data)

		log.Print("Auth", elo.Auth.ID)
		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: "Unable to parse the data"})
			return
		}

		validate := validator.New()
		err = validate.Struct(elo.Data)
		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(errorValidation(err))
			return
		}

		if len(elo.Data.PAN) != 10 {
			log.Print("Invalid PAN")
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: "Invalid PAN"})
			return
		}

		resDataItem, errCheck, boolV := elo.ValidatePAN()
		if errCheck != nil {
			log.Print(errCheck.Error())
			if boolV == true {

				errMessage := errCheck.Error()
				statusMessage := "OK"
				statusCode := 200
				if resDataItem.Status == "INVALID" {
					errMessage = resDataItem.Status
					statusMessage = "FAIL"
					statusCode = 400

					server_handlers.FormatResponse(w, statusCode)
					_ = json.NewEncoder(w).Encode(responseBody{Status: statusMessage, Message: errMessage})
				}
				server_handlers.FormatResponse(w, statusCode)
				_ = json.NewEncoder(w).Encode(responseBodyPan{Status: statusMessage, Message: errMessage, Data: resDataItem})
			} else {
				server_handlers.FormatResponse(w, 400)
				_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: errCheck.Error()})
			}
			return
		}

		server_handlers.FormatResponse(w, 200)
		_ = json.NewEncoder(w).Encode(responseBodyPan{Status: "OK", Message: "PAN validated successfully", Data: resDataItem})

	}
}

func CreateUser() http.HandlerFunc {
	return func(w http.ResponseWriter, req *http.Request) {
		w.Header().Set("Content-Type", "application/json")
		reqBody, _ := ioutil.ReadAll(req.Body)

		var elo eloquent.User
		elo.Auth.ID = auth.GetAuth(req)
		err := json.Unmarshal(reqBody, &elo.Data)
		elo.Data.Aadhaar = aes.EncryptData(elo.Data.Aadhaar)

		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: "Unable to parse the data"})
			return
		}

		validate := validator.New()
		err = validate.Struct(elo.Data)
		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: err.Error()})
			return
		}

		_, err = elo.CreateUser()
		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: err.Error()})
			return
		}

		currentTime := time.Now()
		dateTime := currentTime.Format("Mon 2006-01-2 15:04:05")

		HtmlBody := "<div style='border-radius:3px;padding:32px 28px;border:1px solid #e9e9e9'>" +

			"<div style='border-bottom-width:1px;border-bottom-color:#f6f6f7;border-bottom-style:solid;color:#6c6c72;font-size:14px;line-height:16px;margin-bottom:16px;padding-bottom:12px;padding-left:0;padding-right:0'><table style='border-collapse:collapse;border-spacing:0;border:0' cellpadding='0' cellspacing='0'><tbody><tr style='font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol'>" +

			"<td style='border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;margin:0;padding:0'>" +

			"<div></div>" +

			"<a>CreditFair Capital</a>" +

			"</td>" +

			"<td style='border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;color:#ddddde;margin:0;padding:0 8px'> ·</td>" +

			"<td style='border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;margin:0;padding:0'>New Registration</td>" +

			"</tr></tbody></table></div>" +

			"<table style='border-collapse:collapse;border-spacing:0;word-wrap:break-word;width:100%;word-break:break-all;border:0' cellpadding='0' cellspacing='0'><tbody><tr style='font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol'>" +

			"<td style='border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;margin:0;padding:0 16px 16px 0'><a style='font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;text-decoration:none;color:#4949e4' target='_blank' data-saferedirecturl='https://www.google.com/url?q=https://links.bugsnag.com/ls/click?upn%3DBIY5nkUQr0HlxeaZ2i147ec0ZxpJpJ2lmwvEwdDBCQaFDwx3WSciDiFGGSEys8ulJPa7NZIyGuyI0ixuPKTSRq7-2Bbydkr4rcsqme0eLPaVcqXDCM3Wt4y8q2cxjw0n9ayRreNGLrg1caOQyjhimJd0c4rdHgcLi9jVeKC2POgn3mCcF6Su5wPTYeok8CnS3JzYR6oDHmxFT-2B7uJ4c1zKEQ-3D-3Dg7c7_dvvvDMjJQYEgbGNoV6RcVxbfjg0XkB-2B-2FbaDq-2FbsQcHbIfo-2BPE5XSsK6jsjnVwhtXgvUW2zU33e7fJFso-2FLYFJUhlf7RvROWcJ-2B-2B51amwlZoWpjfup79Cq1wpDZ5Z9BeYz6LCrDu4iUCNMh-2B3BrajUINEudGl3ztTaV5YjnpZWdaERW2W8ZF4yWocO4PC74LNhou129jkRiflMZy7IxcQSA-3D-3D&amp;source=gmail&amp;ust=1666083924443000&amp;usg=AOvVaw3JD6vqoHitBOTIkCWqzNhr'>" +

			"<div style='color:#636363;font-size:14px'><span style='font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol'>New registration is received from " + elo.Data.FirstName + " " + elo.Data.MiddleName + " " + elo.Data.LastName + "</span></div>" +

			"<div style='color:#959595;font-size:12px;line-height:1.75'><span style='font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol'>" + dateTime + "<span style='font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-feature-settings:&quot;smcp&quot;,&quot;c2sc&quot;,&quot;smcp&quot;,&quot;smcp&quot;;font-size:10px;font-variant:small-caps;font-variant-caps:small-caps'></span></span></div></a></td>" +

			"<td style='border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;margin:0;padding:0' align='right'><table style='border-collapse:collapse;border-spacing:0;line-height:24px;padding-left:32px;white-space:nowrap;border:0' cellpadding='0' cellspacing='0'><tbody><tr style='font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol'>" +

			"<td style='border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;white-space:nowrap;margin:0;padding:0 4px 0 0'></td>" +

			"<td style='border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;white-space:nowrap;color:#ddddde;font-size:18.5px;font-weight:100;margin:0;padding:0 4px'></td>" +

			"<td align='center' height='20' valign='middle' style='border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;white-space:nowrap;margin:0;padding:0'></td>" +

			"</tr></tbody></table></td>" +

			"</tr></tbody></table>" +

			"<div style='margin-bottom:16px'><table style='border-collapse:collapse;border-spacing:0;font-family:Consolas,source code pro,Liberation Mono,Courier,monospace;font-size:14px;width:100%;border:0' bgcolor='#f6f6f7' cellpadding='0' cellspacing='0'><tbody><tr style='font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol'><td style='border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;border-bottom-width:1px;border-bottom-color:#ebebec;border-bottom-style:solid;border-top-width:1px;border-top-color:#ebebec;border-top-style:solid;margin:0;padding:8px 12px'><div style='word-wrap:break-word;word-break:break-all;margin:0'>Registration Summary <span style='font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;color:#ddddde'>·</span></div></td></tr></tbody></table></div>" +

			"<table style='border-collapse:collapse;border-spacing:0;font-family:Consolas,source code pro,Liberation Mono,Courier,monospace;font-size:14px;line-height:16px;width:100%;margin:16px 0;border:0' cellpadding='0' cellspacing='0'>" +

			"<tbody><tr style='font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol'>" +

			"<td style='border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;color:#9d9da1;white-space:nowrap;margin:0;padding:9px 0 8px' align='right'>Name</td>" +

			"<td style='width:99%;border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;color:#48484f;margin:0;padding:9px 16px 8px'>" + elo.Data.FirstName + " " + elo.Data.MiddleName + " " + elo.Data.LastName + "</td>" +

			"</tr>" +
			"<tr style='font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol'>" +

			"<td style='border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;color:#9d9da1;white-space:nowrap;margin:0;padding:9px 0 8px' align='right'>Email</td>" +

			"<td style='width:99%;border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;color:#48484f;margin:0;padding:9px 16px 8px'>" + elo.Data.Email + "</td>" +

			"</tr>" +

			"</tbody></table>" +

			"</div>"

		log.Print("trigger email, new user registration")
		email := ""
		cc := ""
		_, err = mail.Email(HtmlBody, fmt.Sprint(elo.Data.FirstName, " ", elo.Data.MiddleName, " ", elo.Data.LastName, " New User Registration ", dateTime), email, cc)
		if err != nil {
			log.Print("trigger email error")
			log.Print(err.Error())
		}

		params := map[string]interface{}{
			"Name":  fmt.Sprint(elo.Data.FirstName, " ", elo.Data.MiddleName, " ", elo.Data.LastName),
			"email": elo.Data.Email,
			"Date":  dateTime,
		}

		slack.SendSlack("New User Registration", params)

		server_handlers.FormatResponse(w, 200)
		_ = json.NewEncoder(w).Encode(responseBody{Status: "OK", Message: "User successfully registered"})

	}
}

func EsignAgreement() http.HandlerFunc {
	return func(w http.ResponseWriter, req *http.Request) {
		w.Header().Set("Content-Type", "application/json")

		reqBody, _ := ioutil.ReadAll(req.Body)

		var elo eloquent.UserSignAgreement

		user := auth.GetUser(req)
		elo.Auth.ID = user.ID
		elo.Auth.UserType, _ = strconv.ParseInt(user.UserType, 10, 64)
		elo.Data.Name = user.Name
		err := json.Unmarshal(reqBody, &elo.Data)

		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: "Unable to parse the data"})
			return
		}

		validate := validator.New()
		err = validate.Struct(elo.Data)
		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: err.Error()})
			return
		}

		_, err = elo.EsignAgreement()
		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: err.Error()})
			return
		}

		server_handlers.FormatResponse(w, 200)
		_ = json.NewEncoder(w).Encode(responseBody{Status: "OK", Message: "User Agreement signed successfully"})

	}
}

func UploadDocument() http.HandlerFunc {
	return func(w http.ResponseWriter, req *http.Request) {
		w.Header().Set("Content-Type", "application/json")

		reqBody, _ := ioutil.ReadAll(req.Body)

		var elo eloquent.DocumentUpload
		elo.Auth.ID = auth.GetAuth(req)
		err := json.Unmarshal(reqBody, &elo.Data)

		//log.Print(elo.Data)
		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: "Unable to parse the data"})
			return
		}

		validate := validator.New()
		err = validate.Struct(elo.Data)
		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: err.Error()})
			return
		}

		_, err = elo.UploadDocument()
		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: err.Error()})
			return
		}

		server_handlers.FormatResponse(w, 200)
		_ = json.NewEncoder(w).Encode(responseBody{Status: "OK", Message: "Document uploaded successfully"})

	}
}

func GetPincodeDetails() http.HandlerFunc {
	return func(w http.ResponseWriter, req *http.Request) {
		w.Header().Set("Content-Type", "application/json")

		reqBody, _ := ioutil.ReadAll(req.Body)

		log.Print(reqBody)
		log.Print(req.URL.Query()["pincode"])

		for k, v := range req.URL.Query() {
			fmt.Printf("%s: %s\n", k, v)
		}
		var elo eloquent.PincodeDetails
		elo.Auth.ID = auth.GetAuth(req)
		if len(req.URL.Query()["pincode"]) == 0 {
			log.Print("Pincode is required")
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: "Pincode is required"})
			return
		}
		elo.Data.Pincode = req.URL.Query()["pincode"][0]

		validate := validator.New()
		err := validate.Struct(elo.Data)
		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: err.Error()})
			return
		}

		res, errPincode := elo.GetPincodeDetails()
		if errPincode != nil {
			log.Print(errPincode.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: errPincode.Error()})
			return
		}

		server_handlers.FormatResponse(w, 200)
		_ = json.NewEncoder(w).Encode(responseBodyPincode{Status: "OK", Message: "Pincode detailed fetched successfully", Data: res})

	}
}

func AddBank() http.HandlerFunc {
	return func(w http.ResponseWriter, req *http.Request) {
		w.Header().Set("Content-Type", "application/json")

		reqBody, _ := ioutil.ReadAll(req.Body)

		var elo eloquent.Bank
		//elo.Auth.ID = auth.GetAuth(req)
		user := auth.GetUser(req)
		elo.Auth.ID = user.ID
		err := json.Unmarshal(reqBody, &elo.Data)

		log.Print(elo.Data)
		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: "Unable to parse the data"})
			return
		}

		validate := validator.New()
		err = validate.Struct(elo.Data)
		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: err.Error()})
			return
		}

		_, err = elo.AddBank()

		if err != nil {
			if err.Error() != "Bank already updated" {
				log.Error().Err(err).Msg(err.Error())
				server_handlers.FormatResponse(w, 400)
				_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: err.Error()})
				return
			}
		}

		if user.UserType != "3" {

			var lend lendbox.BankDetails
			lend.Auth.ID = elo.Auth.ID
			lend, err = lend.GetLendboxBankDetails()
			if err != nil {
				log.Error().Err(err).Msg(err.Error())
				server_handlers.FormatResponse(w, 400)
				_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: err.Error()})
				return
			}
			log.Print("calling lendbox bank")
			_, err = lend.ShareBankDetails()

			if err != nil {
				log.Error().Err(err).Msg(err.Error())
				server_handlers.FormatResponse(w, 400)
				_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: err.Error()})
				return
			}

			elo.UpdateBankDetailsLendboxFlag()

		}

		server_handlers.FormatResponse(w, 200)
		_ = json.NewEncoder(w).Encode(responseBody{Status: "OK", Message: "Bank added successfully"})

	}
}

func UpdateAddress() http.HandlerFunc {
	return func(w http.ResponseWriter, req *http.Request) {
		w.Header().Set("Content-Type", "application/json")

		reqBody, _ := ioutil.ReadAll(req.Body)

		var elo eloquent.UpdateAddress
		user := auth.GetUser(req)

		if len(user.LbUserId) > 0 {
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: "Address already updated"})
			return
		}

		elo.Auth.ID = user.ID
		err := json.Unmarshal(reqBody, &elo.Data)

		log.Print(elo.Data)
		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: "Unable to parse the data"})
			return
		}

		validate := validator.New()
		err = validate.Struct(elo.Data)
		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: err.Error()})
			return
		}

		_, err = elo.UpdateAddress()
		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: err.Error()})
			return
		}

		if user.UserType != "3" {
			var lend lendbox.InvestorRegistration
			lend.Auth.ID = elo.Auth.ID

			lend, err = lend.GetInvestorRegistrationDetails()
			if err != nil {
				log.Error().Err(err).Msg(err.Error())
				server_handlers.FormatResponse(w, 400)
				_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: err.Error()})
				return
			}

			log.Print("RegisterInvestor : lend.RegisterInvestor()")
			_, err = lend.RegisterInvestor()
			if err != nil {
				log.Error().Err(err).Msg(err.Error())
				server_handlers.FormatResponse(w, 400)
				_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: err.Error()})
				return
			}
		}

		server_handlers.FormatResponse(w, 200)
		_ = json.NewEncoder(w).Encode(responseBody{Status: "OK", Message: "Address updated successfully"})

	}
}

func CreateLendboxUser() http.HandlerFunc {
	return func(w http.ResponseWriter, req *http.Request) {
		w.Header().Set("Content-Type", "application/json")

		type LendBoxUser struct {
			ID string `json:"id"`
		}

		var lendBoxUser LendBoxUser

		var lend lendbox.InvestorRegistration

		reqBody, _ := ioutil.ReadAll(req.Body)

		err := json.Unmarshal(reqBody, &lendBoxUser)

		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: "Unable to parse the data"})
			return
		}

		lend.Auth.ID = lendBoxUser.ID

		lend, err = lend.GetInvestorRegistrationDetails()
		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: err.Error()})
			return
		}

		log.Print("RegisterInvestor : lend.RegisterInvestor()")
		_, err = lend.RegisterInvestor()
		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: err.Error()})
			return
		}

		server_handlers.FormatResponse(w, 200)
		_ = json.NewEncoder(w).Encode(responseBody{Status: "OK", Message: "Address updated successfully"})
	}
}

func CreateLendboxWalletOrderDetails() http.HandlerFunc {
	return func(w http.ResponseWriter, req *http.Request) {
		w.Header().Set("Content-Type", "application/json")

		type LendBoxUser struct {
			TransactionID          string `json:"transaction_id"`
			AccountID              int64  `json:"account_id"`
			PaymentLinkReferenceId string `json:"payment_link_reference_id"`
			PaymentPaymentId       string `json:"payment_payment_id"`
		}

		var lendBoxUser LendBoxUser

		reqBody, _ := ioutil.ReadAll(req.Body)

		err := json.Unmarshal(reqBody, &lendBoxUser)

		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: "Unable to parse the data"})
			return
		}

		//---
		//Wallet Order API Start
		var walletOrder []lendbox.WalletOrderData
		var walletOrderData lendbox.WalletOrderData
		var wallet lendbox.WalletOrderDataResult

		walletOrderData, err = walletOrderData.GetTransactionDetails(lendBoxUser.AccountID, lendBoxUser.TransactionID)
		if err != nil {
			log.Print("lendbox GetTransactionDetails - error", err)
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: "Payment Verification Failed"})
			return
		}

		walletOrder = append(walletOrder, walletOrderData)

		wallet, err = lendbox.InitiateWalletOrder(walletOrder)

		if err != nil {
			log.Print("lendbox wallet order res - error", wallet)
			/*server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: "Payment Verification Failed"})
			return*/
		}

		log.Print("lendbox wallet order res", wallet)
		//Wallet Order API END

		_, err = investmentV1.PaymentTransactionLogsUpdate(lendBoxUser.PaymentLinkReferenceId, lendBoxUser.PaymentPaymentId, "SUCCESS")
		if err != nil {
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: "Payment Verification Failed"})
			return
		}

		server_handlers.FormatResponse(w, 200)
		_ = json.NewEncoder(w).Encode(responseBody{Status: "OK", Message: "Payment Verified Successfully"})
		return
		//---
	}
}

func CreateLendboxUserBankDetails() http.HandlerFunc {
	return func(w http.ResponseWriter, req *http.Request) {
		w.Header().Set("Content-Type", "application/json")

		type LendBoxUser struct {
			ID string `json:"id"`
		}

		var lendBoxUser LendBoxUser
		var elo eloquent.Bank

		var lend lendbox.BankDetails

		reqBody, _ := ioutil.ReadAll(req.Body)

		err := json.Unmarshal(reqBody, &lendBoxUser)

		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: "Unable to parse the data"})
			return
		}

		lend.Auth.ID = lendBoxUser.ID
		lend, err = lend.GetLendboxBankDetails()
		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: err.Error()})
			return
		}
		log.Print("calling lendbox bank")
		_, err = lend.ShareBankDetails()

		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: err.Error()})
			return
		}

		elo.UpdateBankDetailsLendboxFlag()

		server_handlers.FormatResponse(w, 200)
		_ = json.NewEncoder(w).Encode(responseBody{Status: "OK", Message: "Bank added successfully"})
	}
}

func GetUser() http.HandlerFunc {
	return func(w http.ResponseWriter, req *http.Request) {
		w.Header().Set("Content-Type", "application/json")

		var elo eloquent.UserDetails
		ID := auth.GetAuth(req)

		log.Print("USER")
		log.Print(ID)
		profile, err := elo.GetUser(ID)
		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: err.Error()})
			return
		}

		server_handlers.FormatResponse(w, 200)
		_ = json.NewEncoder(w).Encode(responseProfile{Status: "OK", Message: "Profile details fetched", UserDetails: profile})

	}
}

func GetInvestorDetails() http.HandlerFunc {
	return func(w http.ResponseWriter, req *http.Request) {
		w.Header().Set("Content-Type", "application/json")

		var elo eloquent.UserDetails

		var id string
		var _id_int int64

		user := auth.GetUser(req)

		if req.URL.Query()["id"] != nil {
			id = req.URL.Query()["id"][0]
			_id_int, _ = strconv.ParseInt(req.URL.Query()["id"][0], 10, 64)
		}

		if id != "" && user.UserType == "3" {
			investors := investmentV1.GetInvestorListUnderIFA(user.ID)

			if len(investors) == 0 {
				server_handlers.FormatResponse(w, 400)
				_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: "Investor not found"})
				return
			}

			var hasInvestor bool
			for _, _id := range investors {
				if _id == _id_int {
					hasInvestor = true
					break
				}
			}

			if hasInvestor != true {
				server_handlers.FormatResponse(w, 400)
				_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: "Investor not found"})
				return
			}

			profile, err := elo.GetUser(id)
			if err != nil {
				log.Error().Err(err).Msg(err.Error())
				server_handlers.FormatResponse(w, 400)
				_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: err.Error()})
				return
			}

			server_handlers.FormatResponse(w, 200)
			_ = json.NewEncoder(w).Encode(responseProfile{Status: "OK", Message: "Profile details fetched", UserDetails: profile})

		} else {
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: "Please select the investor"})
		}

	}
}

func GetAgreementLink() http.HandlerFunc {
	return func(w http.ResponseWriter, req *http.Request) {
		w.Header().Set("Content-Type", "application/json")

		w.Header().Add("Content Type", "text/html")

		user := auth.GetUser(req)
		agreement := "module_server/handlers/templates/agreement.tmpl"
		if user.UserType == "3" {

			var investorId int64
			if req.URL.Query()["id"] != nil {
				investorId, _ = strconv.ParseInt(req.URL.Query()["id"][0], 10, 64)
			}

			if investorId > 0 {

				if investmentV1.IsInvestorUnderIFA(user.ID, investorId) > 0 {
					user.Name = eloquent.GetInvestor(investorId)
				} else {
					server_handlers.FormatResponse(w, 200)
					_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: "Please select the investor"})
					return
				}
			} else {
				agreement = "module_server/handlers/templates/agreement_ifa.tmpl"
			}
		}

		t, err := template.ParseFiles(agreement)
		if err != nil {
			log.Error().Err(err).Msg(err.Error())
		}
		t.Execute(w, user)

		//         schema := "https://"
		//         if req.TLS == nil {
		//            schema = "http://"
		//        }
		//
		//         id, errChek := strconv.ParseInt(ID, 10, 64)
		//         if errChek != nil {
		//             fmt.Printf(errChek.Error())
		//         }
		//         link := schema + req.Host + "/agreement/" + getEncodedString(id)
		//         server_handlers.FormatResponse(w, 200)
		//         _ = json.NewEncoder(w).Encode(responseBody{Status: "OK", Message: "Agreement link fetched", Link: link})

	}
}

// MakeTransaction
func MakeTransaction() http.HandlerFunc {
	return func(w http.ResponseWriter, req *http.Request) {
		w.Header().Set("Content-Type", "application/json")

		reqBody, _ := ioutil.ReadAll(req.Body)

		var elo eloquent.MakeTransaction
		elo.Auth.ID = auth.GetAuth(req)
		err := json.Unmarshal(reqBody, &elo.Data)

		log.Print(elo.Data)
		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: "Unable to parse the data"})
			return
		}

		validate := validator.New()
		err = validate.Struct(elo.Data)
		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: err.Error()})
			return
		}

		_, err = elo.MakeTransaction()
		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: err.Error()})
			return
		}

		server_handlers.FormatResponse(w, 200)
		_ = json.NewEncoder(w).Encode(responseBody{Status: "OK", Message: "Successfully sent the request for transaction"})

	}
}

func InvestmentWebhookUpdate() http.HandlerFunc {
	return func(w http.ResponseWriter, req *http.Request) {

		w.Header().Set("Content-Type", "application/json")

		reqBody, _ := ioutil.ReadAll(req.Body)

		log.Print(reqBody)

		server_handlers.FormatResponse(w, 200)
		_ = json.NewEncoder(w).Encode(responseBody{Status: "OK", Message: "Payment Verified Successfully"})
		return
	}
}

func InvestmentWebhook() http.HandlerFunc {
	return func(w http.ResponseWriter, req *http.Request) {

		/*var investmentStruct investmentV1.InvestWebhook

		log.Print(req.URL.Query())
		err := decoder.Decode(&investmentStruct, req.URL.Query())
		if err != nil {
			log.Print("Error in GET parameters : ", err)
		} else {
			log.Print("GET parameters : ", investmentStruct)
		}*/

		w.Header().Set("Content-Type", "application/json")

		reqBody, _ := ioutil.ReadAll(req.Body)

		var investmentStruct investmentV1.InvestWebhook
		err := json.Unmarshal(reqBody, &investmentStruct)

		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: "Unable to parse the data"})
			return
		}

		log.Print(investmentStruct)
		if err != nil || investmentStruct.PaymentLinkStatus != "paid" {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: "Payment Verification Failed"})
			return
		}

		params := map[string]interface{}{
			"payment_link_id":           investmentStruct.RazorpayPaymentLinkId,
			"razorpay_payment_id":       investmentStruct.PaymentPaymentId,
			"payment_link_reference_id": investmentStruct.PaymentLinkReferenceId,
			"payment_link_status":       investmentStruct.PaymentLinkStatus,
			"signature":                 investmentStruct.Signature,
		}

		investmentStruct.AccountId = investmentV1.GetAccountIDByReference(investmentStruct.PaymentLinkReferenceId)

		status := razorpay.Verify(params)
		if status && investmentStruct.AccountId > 0 {

			var payments []investmentV1.PaymentConfirmation
			var payment investmentV1.PaymentConfirmation
			payment.TransactionID = investmentStruct.PaymentLinkReferenceId
			payment.AccountId = investmentStruct.AccountId
			payments = append(payments, payment)
			var payment_method = "razorpay"
			investmentV1.UpdatePayment(payments, true, payment_method)
// 			investmentV1.UpdatePayment(payments, true)

			//Wallet Order API Start
			var walletOrder []lendbox.WalletOrderData
			var walletOrderData lendbox.WalletOrderData
			var wallet lendbox.WalletOrderDataResult

			for i := 0; i < len(payments); i++ {

				walletOrderData, err = walletOrderData.GetTransactionDetails(payments[i].AccountId, payments[i].TransactionID)
				if err != nil {
					log.Print("lendbox GetTransactionDetails - error", err)
					break
				}
			}

			walletOrder = append(walletOrder, walletOrderData)

			wallet, err = lendbox.InitiateWalletOrder(walletOrder)

			if err != nil {
				log.Print("lendbox wallet order res - error", wallet)
				/*server_handlers.FormatResponse(w, 400)
				_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: "Payment Verification Failed"})
				return*/
			}

			log.Print("lendbox wallet order res", wallet)
			//Wallet Order API END

			_, err := investmentV1.PaymentTransactionLogsUpdate(investmentStruct.PaymentLinkReferenceId, investmentStruct.PaymentPaymentId, "SUCCESS")
			if err != nil {
				server_handlers.FormatResponse(w, 400)
				_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: "Payment Verification Failed"})
				return
			}

			server_handlers.FormatResponse(w, 200)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "OK", Message: "Payment Verified Successfully"})
			return
		} else {

			if status && investmentStruct.AccountId == 0 {
				log.Print("Payment Already Verified - ", investmentStruct.PaymentLinkReferenceId)
			} else {
				investmentV1.PaymentTransactionLogsUpdate(investmentStruct.PaymentLinkReferenceId, investmentStruct.PaymentPaymentId, "FAILURE")
			}

			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: "Payment Verification Failed"})
			return
		}
	}
}

func Invest() http.HandlerFunc {
	return func(w http.ResponseWriter, req *http.Request) {
		w.Header().Set("Content-Type", "application/json")

		reqBody, _ := ioutil.ReadAll(req.Body)

		var investmentStruct investmentV1.Invest
		user := auth.GetUser(req)
		investmentStruct.Auth.ID = user.ID
		err := json.Unmarshal(reqBody, &investmentStruct)

		log.Print(investmentStruct)
		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: "Unable to parse the data"})
			return
		}

		if user.UserType == "3" {
			if investmentStruct.InvestorID == 0 {
				server_handlers.FormatResponse(w, 400)
				_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: "Please select the investor"})
				return
			}
		}

		if investmentStruct.Amount < 10000 || investmentStruct.Amount > 5000000 {
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: "Amount should not be less than 10K and greater than 50L."})
			return
		}

		if investmentStruct.Auth.ID == "850" {
			investmentStruct.Amount = 10
		}

		validate := validator.New()
		err = validate.Struct(investmentStruct)
		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: err.Error()})
			return
		}

		investmentPayment, errPay := investmentStruct.Invest()
		if errPay != nil {
			log.Print(errPay)
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: errPay.Error()})
			return
		}

		payoutType := "Cumulative"
		if investmentStruct.PayoutType == 1 {
			payoutType = "Monthly"
		}

		paymentGateway := "Offline"
		if investmentStruct.PaymentGateway == 1 {
			paymentGateway = "Razorpay"
		}

		paymentMethod := "Online"
		if investmentStruct.PaymentMethod == 2 {
			paymentMethod = "Offline"
			paymentGateway = "Offline"
		}

		currentTime := time.Now()
		dateTime := currentTime.Format("Mon 2006-01-2 15:04:05")

		schemeName := investmentStruct.GetSchemeDetails()

		var LbUserId = user.LbUserId
		var name = user.Name
		var email = user.Email
		var phone = user.Phone

		if investmentStruct.InvestorID != 0 {
			var id = strconv.Itoa(investmentStruct.InvestorID)
			var userDetails eloquent.UserDetails
			UserDetails, err := userDetails.GetUser(id)
			if err != nil {
				log.Print(err)
				server_handlers.FormatResponse(w, 400)
				_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: "Investor not found"})
				return
			} else {
				LbUserId = UserDetails.PersonalDetails.LbUserId
				name = strings.TrimSpace(UserDetails.PersonalDetails.FirstName + " " + UserDetails.PersonalDetails.MiddleName + " " + UserDetails.PersonalDetails.LastName)
				email = UserDetails.PersonalDetails.Email
				phone = UserDetails.PersonalDetails.Phone
			}
		}

		HtmlBody := "<div style='border-radius:3px;padding:32px 28px;border:1px solid #e9e9e9'>" +

			"<div style='border-bottom-width:1px;border-bottom-color:#f6f6f7;border-bottom-style:solid;color:#6c6c72;font-size:14px;line-height:16px;margin-bottom:16px;padding-bottom:12px;padding-left:0;padding-right:0'><table style='border-collapse:collapse;border-spacing:0;border:0' cellpadding='0' cellspacing='0'><tbody><tr style='font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol'>" +

			"<td style='border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;margin:0;padding:0'>" +

			"<div></div>" +

			"<a>CreditFair Capital</a>" +

			"</td>" +

			"<td style='border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;color:#ddddde;margin:0;padding:0 8px'> ·</td>" +

			"<td style='border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;margin:0;padding:0'>Investment</td>" +

			"</tr></tbody></table></div>" +

			"<table style='border-collapse:collapse;border-spacing:0;word-wrap:break-word;width:100%;word-break:break-all;border:0' cellpadding='0' cellspacing='0'><tbody><tr style='font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol'>" +

			"<td style='border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;margin:0;padding:0 16px 16px 0'><a style='font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;text-decoration:none;color:#4949e4' target='_blank' data-saferedirecturl='https://www.google.com/url?q=https://links.bugsnag.com/ls/click?upn%3DBIY5nkUQr0HlxeaZ2i147ec0ZxpJpJ2lmwvEwdDBCQaFDwx3WSciDiFGGSEys8ulJPa7NZIyGuyI0ixuPKTSRq7-2Bbydkr4rcsqme0eLPaVcqXDCM3Wt4y8q2cxjw0n9ayRreNGLrg1caOQyjhimJd0c4rdHgcLi9jVeKC2POgn3mCcF6Su5wPTYeok8CnS3JzYR6oDHmxFT-2B7uJ4c1zKEQ-3D-3Dg7c7_dvvvDMjJQYEgbGNoV6RcVxbfjg0XkB-2B-2FbaDq-2FbsQcHbIfo-2BPE5XSsK6jsjnVwhtXgvUW2zU33e7fJFso-2FLYFJUhlf7RvROWcJ-2B-2B51amwlZoWpjfup79Cq1wpDZ5Z9BeYz6LCrDu4iUCNMh-2B3BrajUINEudGl3ztTaV5YjnpZWdaERW2W8ZF4yWocO4PC74LNhou129jkRiflMZy7IxcQSA-3D-3D&amp;source=gmail&amp;ust=1666083924443000&amp;usg=AOvVaw3JD6vqoHitBOTIkCWqzNhr'>" +

			"<div style='color:#636363;font-size:14px'><span style='font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol'>We have received the investment request from " + name + " Below is the details of investment</span></div>" +

			"<div style='color:#959595;font-size:12px;line-height:1.75'><span style='font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol'>" + dateTime + "<span style='font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-feature-settings:&quot;smcp&quot;,&quot;c2sc&quot;,&quot;smcp&quot;,&quot;smcp&quot;;font-size:10px;font-variant:small-caps;font-variant-caps:small-caps'></span></span></div></a></td>" +

			"<td style='border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;margin:0;padding:0' align='right'><table style='border-collapse:collapse;border-spacing:0;line-height:24px;padding-left:32px;white-space:nowrap;border:0' cellpadding='0' cellspacing='0'><tbody><tr style='font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol'>" +

			"<td style='border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;white-space:nowrap;margin:0;padding:0 4px 0 0'></td>" +

			"<td style='border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;white-space:nowrap;color:#ddddde;font-size:18.5px;font-weight:100;margin:0;padding:0 4px'></td>" +

			"<td align='center' height='20' valign='middle' style='border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;white-space:nowrap;margin:0;padding:0'></td>" +

			"</tr></tbody></table></td>" +

			"</tr></tbody></table>" +

			"<div style='margin-bottom:16px'><table style='border-collapse:collapse;border-spacing:0;font-family:Consolas,source code pro,Liberation Mono,Courier,monospace;font-size:14px;width:100%;border:0' bgcolor='#f6f6f7' cellpadding='0' cellspacing='0'><tbody><tr style='font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol'><td style='border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;border-bottom-width:1px;border-bottom-color:#ebebec;border-bottom-style:solid;border-top-width:1px;border-top-color:#ebebec;border-top-style:solid;margin:0;padding:8px 12px'><div style='word-wrap:break-word;word-break:break-all;margin:0'>Investment Summary <span style='font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;color:#ddddde'>·</span></div></td></tr></tbody></table></div>" +

			"<table style='border-collapse:collapse;border-spacing:0;font-family:Consolas,source code pro,Liberation Mono,Courier,monospace;font-size:14px;line-height:16px;width:100%;margin:16px 0;border:0' cellpadding='0' cellspacing='0'>" +

			"<tbody><tr style='font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol'>" +

			"<td style='border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;color:#9d9da1;white-space:nowrap;margin:0;padding:9px 0 8px' align='right'>LbUserId</td>" +

			"<td style='width:99%;border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;color:#48484f;margin:0;padding:9px 16px 8px'>" + LbUserId + "</td>" +

			"</tr>" +
			"<tr style='font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol'>" +

			"<td style='border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;color:#9d9da1;white-space:nowrap;margin:0;padding:9px 0 8px' align='right'>Amount</td>" +

			"<td style='width:99%;border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;color:#48484f;margin:0;padding:9px 16px 8px'>" + fmt.Sprintf("%.2f", investmentStruct.Amount) + "</td>" +

			"</tr>" +

			"<tr style='font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol'>" +

			"<td style='border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;color:#9d9da1;white-space:nowrap;margin:0;padding:9px 0 8px' align='right'>Scheme</td>" +

			"<td style='border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;color:#48484f;margin:0;padding:9px 16px 8px'>" + schemeName + "</td>" +

			"</tr>" +

			"<tr style='font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol'>" +

			"<td style='border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;color:#9d9da1;white-space:nowrap;margin:0;padding:9px 0 8px' align='right'>Gateway</td>" +

			"<td style='border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;color:#48484f;margin:0;padding:9px 16px 8px'>" + paymentGateway + "</td>" +

			"</tr>" +
			"<tr style='font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol'>" +

			"<td style='border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;color:#9d9da1;white-space:nowrap;margin:0;padding:9px 0 8px' align='right'>Payment Method</td>" +

			"<td style='border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;color:#48484f;margin:0;padding:9px 16px 8px'>" + paymentMethod + "</td>" +

			"</tr>" +
			"<tr style='font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol'>" +

			"<td style='border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;color:#9d9da1;white-space:nowrap;margin:0;padding:9px 0 8px' align='right'>PayoutType</td>" +

			"<td style='border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;color:#48484f;margin:0;padding:9px 16px 8px'>" + payoutType + "</td>" +

			"</tr><tr style='font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol'>" +

			"<td style='border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;color:#9d9da1;white-space:nowrap;margin:0;padding:9px 0 8px' align='right'>ReferenceCode</td>" +

			"<td style='border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;color:#48484f;margin:0;padding:9px 16px 8px'>" + investmentPayment.ReferenceCode + "</td>" +

			"</tr>" +

			"<tr style='font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol'>" +

			"<td style='border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;color:#9d9da1;white-space:nowrap;margin:0;padding:9px 0 8px' align='right'>Transaction Reference</td>" +

			"<td style='border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;color:#48484f;margin:0;padding:9px 16px 8px'>" + investmentPayment.TransactionReference + "</td>" +

			"</tr>" +

			"</tbody></table>" +

			"</div>"

		log.Print("trigger email internal")
		_, err = mail.Email(HtmlBody, fmt.Sprint(LbUserId, " Request received for investment ", dateTime), "", "info@creditfaircapital.in")
		if err != nil {
			log.Print("trigger email error")
			log.Print(err.Error())
		}

		params := map[string]interface{}{
			"lbUserId":             LbUserId,
			"investment_date":      dateTime,
			"ReferenceCode":        investmentPayment.ReferenceCode,
			"TransactionReference": investmentPayment.TransactionReference,
		}

		slack.SendSlack("New Investment", params)

		if investmentStruct.PaymentMethod == 2 {
			server_handlers.FormatResponse(w, 200)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "OK", Message: "Invested"})
			//_ = json.NewEncoder(w).Encode(responseBody{Status: "OK", Message: "Payment link fetched", Link: "https://razorpay.com/payment-link/plink_K9mw6Fiqf3wtZ0/test"})
			return
		}

		/* investmentPayment, errPay := investmentStruct.Invest()
		   if errPay != nil {
		       log.Print(errPay)
		       server_handlers.FormatResponse(w, 400)
		       _ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: errPay.Error()})
		       return
		   } */
		log.Print("Preparing requestBody")

		/*investmentStruct.Callback = "https://devapp.creditfaircapital.in/investment/payment-confirmation"
		if user.UserType == "3" && investmentStruct.InvestorID > 0 {
			 investmentStruct.Callback = "https://devifa.creditfaircapital.in/investment/payment-confirmation"
		}*/

		var api razorpay.Payment
		api = getPaymentStruct(investmentStruct, investmentPayment, LbUserId, name, phone, email)

		output, errCheck := api.GetLink()

		if errCheck != nil {
			log.Print(errCheck)
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: errCheck.Error()})
			return
		}

		outputRes := output.(map[string]interface{})
		log.Print("outputRes")
		b, errw := json.Marshal(outputRes)
		if errw != nil {
			log.Print(errw)
		}
		fmt.Println(string(b))
		log.Print(outputRes["short_url"])

		investmentStruct.PaymentTransactionLogs(investmentPayment)

		log.Print("checking IFA ")
		log.Print(user)
		log.Print(investmentStruct.InvestorID)
		if user.UserType == "3" && investmentStruct.InvestorID > 0 {
			log.Print("checking IFA passed")
			HtmlBody = "<div id=\"m_-7287715652302869526m_-9022880041113856884:13f\">\n<div id=\"m_-7287715652302869526m_-9022880041113856884:12i\">\n<u></u>\n<div style=\"margin:10px 0;padding:0 10px;font-size:13px;box-sizing:border-box\">\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\" style=\"border-collapse:collapse;background-color:whitesmoke\">\n<tbody>\n<tr>\n<td style=\"font-family:arial,sans-serif;color:#333333\">\n<table align=\"center\" bgcolor=\"#FFFFFF\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" style=\"border-collapse:collapse;max-width:640px;width:100%;margin-right:auto;margin-left:auto;margin-top:10px\">\n<tbody>\n<tr>\n<td align=\"center\" bgcolor=\"#fff\" id=\"m_-7287715652302869526m_-9022880041113856884m_3511011993627489849header\" width=\"640\" style=\"font-family:arial,sans-serif;color:#333333\">\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"640\" style=\"border-collapse:collapse\">\n<tbody>\n<tr>\n<td align=\"center\" style=\"font-family:arial,sans-serif;color:#333333;padding:20px;max-width:640px\">\n<a href=\"https://creditfaircapital.in\" style=\"text-decoration:none;color:#20c0e8;text-decoration:none;color:black;display:inline-block\" title=\"Credit Fair Capital\" target=\"_blank\" data-saferedirecturl=\"https://www.google.com/url?q=https://creditfaircapital.in&amp;source=gmail&amp;ust=1675753944337000&amp;usg=AOvVaw3F6SmmPDeKnAMVC8hfqnJj\"><img width=\"500\" src=\"https://ci4.googleusercontent.com/proxy/BoWKgwn2XRbn17WZKUz24EkXXv5MfYaG_48zQ9GUOg8J5uGgi9q745MThj1x7mnZcrut04RmFBtWNPdS0plTBfwR=s0-d-e1-ft#http://creditfaircapital.in/assets/CFC_logo.png\" class=\"CToWUd\" data-bit=\"iit\"></a>\n</td>\n</tr>\n</tbody>\n</table>\n</td>\n</tr>\n<tr>\n</tr>\n<tr>\n<td style=\"font-family:arial,sans-serif;color:#333333;padding:20px 20px 0 20px\">\n<div style=\"font-size:13px;font-family:verdana,arial;line-height:1.5\">\nHello " + name + ",<br><br>\nI hope everything is going well for you.<br><br>\nYour payment link for your investment in Credit Fair Capital P2P is " + outputRes["short_url"].(string) + ".<br><br> \nYou can contact us at info@creditfaircapital.in or 8097400463 at any time since we are here to help you.<br><br>\nOnce again, thank you for trusting your faith in Credit Fair Capital.<br></div>\n</td>\n</tr>\n<tr></tr>\n<tr>\n   <td style=\"font-family:arial,sans-serif;color:#333333;padding:20px 20px 0 20px\">\n      <div style=\"font-family:Verdana;font-size:13px\">\n         Regards,<br>\n         Team <span class=\"il\">Credit</span> <span class=\"il\">Fair</span> <span class=\"il\">Capital</span><br>\n         <a href=\"mailto:info@creditfaircapital.in\" target=\"_blank\">info@creditfaircapital.in</a><br>\n         +91-8097400463<br><br>\n         <p style=\"font-family:arial;font-size:11px\">Disclaimer: This message (including any attachments) may contain\n            confidential, proprietary, privileged and/or private information. The information is intended for the use only\n            to whom they are addressed. If you are not the intended recipient of this message, please notify the sender\n            immediately, and delete the message and any attachments. Any disclosure, reproduction, distribution or other use\n            of this message or any attachments by an individual or entity other than the intended recipient is prohibited.We\n            do not guarantee the security of any information transmitted through email and, are not liable for any\n            interception, corruption or delays. Anyone communicating with us by email accepts the risks and\n            consequences.\n         </p>\n         <div style=\"width:100%;text-align:center;margin:20px 0\">\n            <div>\n               <a href=\"https://www.facebook.com/creditfairindia\" style=\"text-decoration:none\" target=\"_blank\" data-saferedirecturl=\"https://www.google.com/url?q=https://www.facebook.com/creditfairindia&amp;source=gmail&amp;ust=1675753944337000&amp;usg=AOvVaw2fDU9a8h107THQSFZhjCB-\">\n               <img src=\"https://ci4.googleusercontent.com/proxy/ObNxNZavSQkqGNYlnhYEzS5jkiPlqAzY-i6SSGL3xBrA2KfQE-HHzFNhr15WVi8UWDRg0RuWBJpFVDfVgk3n850xJdIpRGsONNWvgxw=s0-d-e1-ft#https://creditfair.in/assets/front/img/others/facebook.png\" alt=\"Facebook\" width=\"25\" class=\"CToWUd\" data-bit=\"iit\">\n               </a>\n               <a href=\"https://twitter.com/credit_fair\" style=\"text-decoration:none\" target=\"_blank\" data-saferedirecturl=\"https://www.google.com/url?q=https://twitter.com/credit_fair&amp;source=gmail&amp;ust=1675753944337000&amp;usg=AOvVaw1XzhLnj5iawNif_EIzy6YC\">\n               <img src=\"https://ci4.googleusercontent.com/proxy/9jrDvy_9vcmEJuIIXpIoWb6-XH08Et-hF_n35XAYsk5TiiIKE6bEbFqKlxvc2nK2eLHc5Nq2w8NW8l6a5LzNhBN3I9tp65dFA7cqsg=s0-d-e1-ft#https://creditfair.in/assets/front/img/others/twitter.png\" alt=\"Twitter\" width=\"25\" class=\"CToWUd\" data-bit=\"iit\">\n               </a>\n               <a href=\"https://www.linkedin.com/company/credit-fair\" style=\"text-decoration:none\" target=\"_blank\" data-saferedirecturl=\"https://www.google.com/url?q=https://www.linkedin.com/company/credit-fair&amp;source=gmail&amp;ust=1675753944337000&amp;usg=AOvVaw2NC-L1Bb2fukLcAURS7u8O\">\n               <img src=\"https://ci6.googleusercontent.com/proxy/14OMTnk_Oq3ALIcPi1J80xCCpb6PRQmQDe288-b74h3hRNKYSXXD40JSCvz6q3VHHYKD8Bl0yThvUN3ZReH6i__L6RqNXagYggFRdyw=s0-d-e1-ft#https://creditfair.in/assets/front/img/others/linkedin.png\" alt=\"LinkedIn\" width=\"25\" class=\"CToWUd\" data-bit=\"iit\">\n               </a>\n               <a href=\"https://www.instagram.com/credit_fair/\" style=\"text-decoration:none\" target=\"_blank\" data-saferedirecturl=\"https://www.google.com/url?q=https://www.instagram.com/credit_fair/&amp;source=gmail&amp;ust=1675753944338000&amp;usg=AOvVaw3d00GJxDd0rcTx_6iGils4\">\n               <img src=\"https://ci6.googleusercontent.com/proxy/LdCqBtrI_06xNqfEdLuUKw7QtAtrIzZ74hIUgTS6VTFgbgSUCx9IT0Tnps4KwcDyENOOJQxXeoYG1JlQYQcIg-x0354EHRlYje3JmuWc=s0-d-e1-ft#https://creditfair.in/assets/front/img/others/instagram.png\" alt=\"Instagram\" width=\"25\" class=\"CToWUd\" data-bit=\"iit\">\n               </a>\n            </div>\n         </div>\n      </div>\n   </td>\n</tr>\n</tbody>\n</table>\n</td>\n</tr>\n</tbody>\n</table>\n<p style=\"display:none;margin:0;padding:0;line-height:0\"></p>\n</div>\n<div></div>\n<div></div>\n</div>\n</div>"

			log.Print("trigger email to investor")
			_, err = mail.Email(HtmlBody, fmt.Sprint("Credit fair Capital Requesting payment of INR "+fmt.Sprintf("%.2f", investmentStruct.Amount)+" (via Razorpay)"), email, "")
			if err != nil {
				log.Print("trigger email error")
				log.Print(err.Error())
			}

			message := fmt.Sprint("From=KMCRED&To=91", phone, "&Body=Hello%20", name, "%2C%20your%20payment%20link%20for%20your%20investment%20in%20Credit%20Fair%20Capital%20is%20", outputRes["short_url"].(string), "%20Team%20Credit%20Fair%20Capital&DltEntityId=1301159108481756475&DltTemplateId=1307168007701785729&SmsType=transactional")

			_, err = eloquent.TriggerSMS(message)
			if err != nil {
				log.Print("SMS Error")
				log.Print(err.Error())
			}

			server_handlers.FormatResponse(w, 200)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "OK", Message: "Link sent to investor successfully", ReferenceCode: investmentPayment.ReferenceCode})
			return
		}

		server_handlers.FormatResponse(w, 200)
		_ = json.NewEncoder(w).Encode(responseBody{Status: "OK", Message: "Payment link fetched", Link: outputRes["short_url"].(string)})

	}
}

func getPaymentStruct(investmentStruct investmentV1.Invest, investmentPayment investmentV1.Invest, LbUserId, name string, phone string, email string) razorpay.Payment {
	var api razorpay.Payment
	api.Amount = investmentStruct.Amount * 100
	api.ReceiptId = investmentPayment.ReferenceCode
	api.Notes1 = "cf-capital"
	api.Description = fmt.Sprint("Payment for transaction id #", investmentPayment.ReferenceCode, ", ID#", LbUserId)
	api.Notes2 = fmt.Sprint("Payment for investment id #", investmentPayment.InvestmentPaymentID)
	//api.Callback = investmentStruct.Callback

	var customer razorpay.Customer

	//user := auth.GetUser(req)
	customer.Name = name
	customer.Contact = aes.DecryptData(phone)
	customer.Email = aes.DecryptData(email)
	api.Customer = customer

	var plan razorpay.Plan
	plan.Name = fmt.Sprint("Flexi Plan # ", investmentStruct.MHP)
	api.Plan = plan
	return api
}

func Investment() http.HandlerFunc {
	return func(w http.ResponseWriter, req *http.Request) {
		w.Header().Set("Content-Type", "application/json")

		reqBody, _ := ioutil.ReadAll(req.Body)

		var investmentStruct investment.FlexiPlan
		//elo.Auth.ID = auth.GetAuth(req)
		err := json.Unmarshal(reqBody, &investmentStruct)

		log.Print(investmentStruct)
		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: "Unable to parse the data"})
			return
		}

		validate := validator.New()
		err = validate.Struct(investmentStruct)
		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: err.Error()})
			return
		}

		payout, errCheck := investmentStruct.Flexi()
		if errCheck != nil {
			log.Print(errCheck.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: errCheck.Error()})
			return
		}

		server_handlers.FormatResponse(w, 200)
		_ = json.NewEncoder(w).Encode(payout)

	}
}

func AddNominee() http.HandlerFunc {
	return func(w http.ResponseWriter, req *http.Request) {
		w.Header().Set("Content-Type", "application/json")

		reqBody, _ := ioutil.ReadAll(req.Body)

		var nominee eloquent.Nominee
		nominee.AuthID = auth.GetAuth(req)
		err := json.Unmarshal(reqBody, &nominee)

		log.Print(nominee)
		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: "Unable to parse the data"})
			return
		}

		validate := validator.New()
		err = validate.Struct(nominee)
		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: err.Error()})
			return
		}

		_, errCheck := nominee.AddNominee()
		if errCheck != nil {
			log.Print(errCheck.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: errCheck.Error()})
			return
		}

		var response = map[string]string{"status": "OK", "message": "Nominee added!"}

		server_handlers.FormatResponse(w, 200)
		_ = json.NewEncoder(w).Encode(response)

	}
}

func GetNominee() http.HandlerFunc {
	return func(w http.ResponseWriter, req *http.Request) {
		w.Header().Set("Content-Type", "application/json")

		var nominee eloquent.Nominee
		nominee.AuthID = auth.GetAuth(req)

		nomineeData, errCheck := nominee.GetNominee()
		if errCheck != nil {
			log.Print(errCheck.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: errCheck.Error()})
			return
		}

		server_handlers.FormatResponse(w, 200)
		_ = json.NewEncoder(w).Encode(responseNominee{Status: "OK", Message: "Nominee fetched", Data: nomineeData})

	}
}

func GetBank() http.HandlerFunc {
	return func(w http.ResponseWriter, req *http.Request) {
		w.Header().Set("Content-Type", "application/json")

		var bank eloquent.Bank
		bank.Auth.ID = auth.GetAuth(req)

		if req.URL.Query()["id"] != nil {
			bank.Auth.ID = req.URL.Query()["id"][0]
		}

		bankData, errCheck := bank.GetBank()
		log.Print(bankData)
		if errCheck != nil {
			log.Print(errCheck.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: errCheck.Error()})
			return
		}

		server_handlers.FormatResponse(w, 200)
		_ = json.NewEncoder(w).Encode(responseBank{Status: "OK", Message: "Bank fetched", Data: bankData})

	}
}

func Withdrawal() http.HandlerFunc {
	return func(w http.ResponseWriter, req *http.Request) {
		w.Header().Set("Content-Type", "application/json")

		reqBody, _ := ioutil.ReadAll(req.Body)

		var withdrawalStruct investmentV1.Withdrawal
		user := auth.GetUser(req)
		withdrawalStruct.Auth.ID = user.ID

		var err error
		withdrawalStruct.Auth.UserType, err = strconv.ParseInt(user.UserType, 10, 64)
		if err != nil {
			log.Print(err.Error())
		}

		err = json.Unmarshal(reqBody, &withdrawalStruct)

		log.Print(withdrawalStruct)
		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: "Unable to parse the data"})
			return
		}

		if withdrawalStruct.Auth.UserType == 3 {
			if withdrawalStruct.InvestorID == 0 {
				server_handlers.FormatResponse(w, 400)
				_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: "Please select the investor"})
				return
			}
		}

		validate := validator.New()
		err = validate.Struct(withdrawalStruct)
		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: err.Error()})
			return
		}

		withdrawal, errCheck := withdrawalStruct.Withdrawal()
		if errCheck != nil {
			log.Print(errCheck.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: errCheck.Error()})
			return
		}

		withdrawalStruct.ReferenceCode = withdrawal.ReferenceCode

		var response map[string]string
		if withdrawalStruct.Auth.UserType != 3 || withdrawalStruct.InvestorID == 0 {
			sendWithdrawalEmail(withdrawalStruct, user, "")
			response = map[string]string{"status": "OK", "message": "You have successfully made a withdrawal from your portfolio. The amount withdrawn will reflect in your selected Bank account within 24hours."}
		} else {
			//sendWithdrawalEmail(withdrawalStruct, user, fmt.Sprintf(user.Email,",",os.Getenv("CFC_EMAIL_GROUP_TO")))

			var OTPManagerTable eloquent.OTPManagerTable

			OTPManagerTable.Data.Phone = eloquent.GetInvestorPhoneNumber(withdrawalStruct.InvestorID)
			var service eloquent.Service
			service.ReferenceCode = withdrawal.ReferenceCode
			service.ServiceType = "WITHDRAW"

			OTPManagerTable.Data.Service = service

			eloquent.SendOTP(OTPManagerTable)

			response = map[string]string{"status": "OK", "message": "We have sent an OTP to investor. Please enter the OTP below", "transaction_id": withdrawal.ReferenceCode}
		}

		server_handlers.FormatResponse(w, 200)
		_ = json.NewEncoder(w).Encode(response)

		//_, errCheck := withdrawalStruct.Withdrawal()
		//if errCheck != nil {
		//	log.Print(errCheck.Error())
		//	server_handlers.FormatResponse(w, 400)
		//	_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: errCheck.Error()})
		//	return
		//}
		//
		//var response = map[string]string{"status": "OK", "message": "You have successfully made a withdrawal from your portfolio. The amount withdrawn will reflect in your selected Bank account within 24hours."}
		//
		//server_handlers.FormatResponse(w, 200)
		//_ = json.NewEncoder(w).Encode(response)

	}
}

func getWithdrawalData(referenceCode string) (investmentV1.Withdrawal, auth.AuthUser) {

	var withdrawal investmentV1.Withdrawal
	var InvestorID string
	InvestorID, withdrawal.AccountID, withdrawal.Reason, withdrawal.Amount = eloquent.GetPendingWithdrawal(referenceCode)

	withdrawal.ReferenceCode = referenceCode

	var user eloquent.UserDetails
	userDetails, err := user.GetUser(InvestorID)

	if err != nil {
		log.Print(err.Error())
	}

	var authUser auth.AuthUser

	authUser.ID = InvestorID
	authUser.Name = strings.TrimSpace(userDetails.PersonalDetails.FirstName + " " + userDetails.PersonalDetails.MiddleName + "  " + userDetails.PersonalDetails.LastName)
	authUser.LbUserId = userDetails.PersonalDetails.LbUserId

	withdrawal.Auth.ID = InvestorID

	return withdrawal, authUser
}

func sendWithdrawalEmail(withdrawalStruct investmentV1.Withdrawal, user auth.AuthUser, email string) {
	schemeName := withdrawalStruct.GetSchemeDetailsByAccount()

	currentTime := time.Now()
	dateTime := currentTime.Format("Mon 2006-01-2 15:04:05")

	HtmlBody := "<div style='border-radius:3px;padding:32px 28px;border:1px solid #e9e9e9'>" +

		"<div style='border-bottom-width:1px;border-bottom-color:#f6f6f7;border-bottom-style:solid;color:#6c6c72;font-size:14px;line-height:16px;margin-bottom:16px;padding-bottom:12px;padding-left:0;padding-right:0'><table style='border-collapse:collapse;border-spacing:0;border:0' cellpadding='0' cellspacing='0'><tbody><tr style='font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol'>" +

		"<td style='border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;margin:0;padding:0'>" +

		"<div></div>" +

		"<a>CreditFair Capital</a>" +

		"</td>" +

		"<td style='border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;color:#ddddde;margin:0;padding:0 8px'> ·</td>" +

		"<td style='border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;margin:0;padding:0'>Withdrawal</td>" +

		"</tr></tbody></table></div>" +

		"<table style='border-collapse:collapse;border-spacing:0;word-wrap:break-word;width:100%;word-break:break-all;border:0' cellpadding='0' cellspacing='0'><tbody><tr style='font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol'>" +

		"<td style='border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;margin:0;padding:0 16px 16px 0'><a style='font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;text-decoration:none;color:#4949e4' target='_blank' data-saferedirecturl='https://www.google.com/url?q=https://links.bugsnag.com/ls/click?upn%3DBIY5nkUQr0HlxeaZ2i147ec0ZxpJpJ2lmwvEwdDBCQaFDwx3WSciDiFGGSEys8ulJPa7NZIyGuyI0ixuPKTSRq7-2Bbydkr4rcsqme0eLPaVcqXDCM3Wt4y8q2cxjw0n9ayRreNGLrg1caOQyjhimJd0c4rdHgcLi9jVeKC2POgn3mCcF6Su5wPTYeok8CnS3JzYR6oDHmxFT-2B7uJ4c1zKEQ-3D-3Dg7c7_dvvvDMjJQYEgbGNoV6RcVxbfjg0XkB-2B-2FbaDq-2FbsQcHbIfo-2BPE5XSsK6jsjnVwhtXgvUW2zU33e7fJFso-2FLYFJUhlf7RvROWcJ-2B-2B51amwlZoWpjfup79Cq1wpDZ5Z9BeYz6LCrDu4iUCNMh-2B3BrajUINEudGl3ztTaV5YjnpZWdaERW2W8ZF4yWocO4PC74LNhou129jkRiflMZy7IxcQSA-3D-3D&amp;source=gmail&amp;ust=1666083924443000&amp;usg=AOvVaw3JD6vqoHitBOTIkCWqzNhr'>" +

		"<div style='color:#636363;font-size:14px'><span style='font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol'>We have received the withdrawal request from " + user.Name + " Below is the details of withdrawal</span></div>" +

		"<div style='color:#959595;font-size:12px;line-height:1.75'><span style='font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol'>" + dateTime + "<span style='font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-feature-settings:&quot;smcp&quot;,&quot;c2sc&quot;,&quot;smcp&quot;,&quot;smcp&quot;;font-size:10px;font-variant:small-caps;font-variant-caps:small-caps'></span></span></div></a></td>" +

		"<td style='border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;margin:0;padding:0' align='right'><table style='border-collapse:collapse;border-spacing:0;line-height:24px;padding-left:32px;white-space:nowrap;border:0' cellpadding='0' cellspacing='0'><tbody><tr style='font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol'>" +

		"<td style='border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;white-space:nowrap;margin:0;padding:0 4px 0 0'></td>" +

		"<td style='border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;white-space:nowrap;color:#ddddde;font-size:18.5px;font-weight:100;margin:0;padding:0 4px'></td>" +

		"<td align='center' height='20' valign='middle' style='border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;white-space:nowrap;margin:0;padding:0'></td>" +

		"</tr></tbody></table></td>" +

		"</tr></tbody></table>" +

		"<div style='margin-bottom:16px'><table style='border-collapse:collapse;border-spacing:0;font-family:Consolas,source code pro,Liberation Mono,Courier,monospace;font-size:14px;width:100%;border:0' bgcolor='#f6f6f7' cellpadding='0' cellspacing='0'><tbody><tr style='font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol'><td style='border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;border-bottom-width:1px;border-bottom-color:#ebebec;border-bottom-style:solid;border-top-width:1px;border-top-color:#ebebec;border-top-style:solid;margin:0;padding:8px 12px'><div style='word-wrap:break-word;word-break:break-all;margin:0'>Withdrawal Summary <span style='font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;color:#ddddde'>·</span></div></td></tr></tbody></table></div>" +

		"<table style='border-collapse:collapse;border-spacing:0;font-family:Consolas,source code pro,Liberation Mono,Courier,monospace;font-size:14px;line-height:16px;width:100%;margin:16px 0;border:0' cellpadding='0' cellspacing='0'>" +

		"<tbody><tr style='font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol'>" +

		"<td style='border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;color:#9d9da1;white-space:nowrap;margin:0;padding:9px 0 8px' align='right'>LbUserId</td>" +

		"<td style='width:99%;border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;color:#48484f;margin:0;padding:9px 16px 8px'>" + user.LbUserId + "</td>" +

		"</tr>" +
		"<tr style='font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol'>" +

		"<td style='border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;color:#9d9da1;white-space:nowrap;margin:0;padding:9px 0 8px' align='right'>Amount</td>" +

		"<td style='width:99%;border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;color:#48484f;margin:0;padding:9px 16px 8px'>" + fmt.Sprintf("%.2f", withdrawalStruct.Amount) + "</td>" +

		"</tr>" +

		"<tr style='font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol'>" +

		"<td style='border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;color:#9d9da1;white-space:nowrap;margin:0;padding:9px 0 8px' align='right'>Scheme</td>" +

		"<td style='border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;color:#48484f;margin:0;padding:9px 16px 8px'>" + schemeName + "</td>" +

		"</tr>" +

		"<tr style='font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol'>" +

		"<td style='border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;color:#9d9da1;white-space:nowrap;margin:0;padding:9px 0 8px' align='right'>Reason</td>" +

		"<td style='border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;color:#48484f;margin:0;padding:9px 16px 8px'>" + withdrawalStruct.Reason + "</td>" +

		"</tr>" +
		"<tr style='font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol'>" +

		"<td style='border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;color:#9d9da1;white-space:nowrap;margin:0;padding:9px 0 8px' align='right'>ReferenceCode</td>" +

		"<td style='border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;color:#48484f;margin:0;padding:9px 16px 8px'>" + withdrawalStruct.ReferenceCode + "</td>" +

		"</tr>" +

		"</tbody></table>" +

		"</div>"

	log.Print("trigger email")
	_, err := mail.Email(HtmlBody, fmt.Sprint(user.LbUserId, ": Request received for withdrawal ", dateTime), "", "")
	if err != nil {
		log.Print("trigger email error")
		log.Print(err.Error())
	}

	params := map[string]interface{}{
		"request":    "Withdrawal",
		"Name":       user.Name,
		"Withdrawal": dateTime,
		"Amount":     fmt.Sprintf("%.2f", withdrawalStruct.Amount),
	}

	slack.SendSlack("Withdrawal Request", params)
}

func GetPassbook() http.HandlerFunc {

	return func(w http.ResponseWriter, req *http.Request) {
		w.Header().Set("Content-Type", "application/json")

		reqBody, _ := ioutil.ReadAll(req.Body)

		var passbookStruct investmentV1.Passbook
		passbookStruct.Auth.ID = auth.GetAuth(req)
		//passbookStruct.StartDate = req.URL.Query()["start_date"][0]
		//passbookStruct.EndDate = req.URL.Query()["end_date"][0]
		//passbookStruct.Auth.ID = auth.GetAuth(req)
		//log.Print(passbookStruct)
		//account_id, err := strconv.ParseInt(req.URL.Query()["account_id"][0], 10, 64)
		//if err != nil {
		//	log.Error().Err(err).Msg(err.Error())
		//}
		//passbookStruct.AccountID = account_id

		err := json.Unmarshal(reqBody, &passbookStruct)
		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: err.Error()})
			return
		}

		log.Print(passbookStruct)

		validate := validator.New()
		err = validate.Struct(passbookStruct)
		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: err.Error()})
			return
		}

		passbookItems, errCheck := passbookStruct.GetPassbook()
		if errCheck != nil {
			log.Print(errCheck.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: errCheck.Error()})
			return
		}

		server_handlers.FormatResponse(w, 200)
		_ = json.NewEncoder(w).Encode(responseBodyPassbook{Status: "OK", Message: "Passbook fetched", Data: passbookItems})

	}
}

func GetPassbookPDF() http.HandlerFunc {
	return func(w http.ResponseWriter, req *http.Request) {
		w.Header().Set("Content-Type", "application/json")

		reqBody, _ := ioutil.ReadAll(req.Body)

		var passbook pdf.Passbook
		err := json.Unmarshal(reqBody, &passbook)

		log.Print(passbook)
		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: "Unable to parse the data"})
			return
		}

		pdf, errr := investmentV1.GetPassbookPDF(passbook)
		if errr != nil {
			log.Error().Err(errr).Msg(errr.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: errr.Error()})
			return
		}

		server_handlers.FormatResponse(w, 200)
		_ = json.NewEncoder(w).Encode(responseBody{Status: "OK", Message: "Success", Data:pdf})
	}
}

func GetAccounts() http.HandlerFunc {

	return func(w http.ResponseWriter, req *http.Request) {
		w.Header().Set("Content-Type", "application/json")

		var accountStruct investmentV1.Accounts
		//accountStruct.AccountID = req.URL.Query()["account_id"][0]
		accountStruct.Auth.ID = auth.GetAuth(req)
		var err error
		var account_id int64
		var investor_id int64
		if req.URL.Query()["account_id"] != nil {
			account_id, err = strconv.ParseInt(req.URL.Query()["account_id"][0], 10, 64)
		}
		if req.URL.Query()["id"] != nil {
			investor_id, err = strconv.ParseInt(req.URL.Query()["id"][0], 10, 64)
		}
		if err != nil {
			log.Error().Err(err).Msg(err.Error())
		}
		accountStruct.AccountID = account_id
		accountStruct.InvestorID = investor_id

		validate := validator.New()
		err = validate.Struct(accountStruct)
		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: err.Error()})
			return
		}

		accountsItems, errCheck := accountStruct.GetAccounts()
		if errCheck != nil {
			log.Print(errCheck.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: errCheck.Error()})
			return
		}

		server_handlers.FormatResponse(w, 200)
		_ = json.NewEncoder(w).Encode(responseBodyAccounts{Status: "OK", Message: "Accounts fetched", Data: accountsItems})

	}
}

func ConnectionCheck() http.HandlerFunc {

	return func(w http.ResponseWriter, req *http.Request) {
		w.Header().Set("Content-Type", "application/json")

		var schemeStruct investmentV1.Schemes

		id, errCheck := schemeStruct.ConnectionCheck()
		if errCheck != nil {
			log.Print(errCheck.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: errCheck.Error()})
			return
		}

		server_handlers.FormatResponse(w, 200)
		_ = json.NewEncoder(w).Encode(responseBody{Status: "OK", Message: "Con Done", Data: id})

	}
}

func GetSchemes() http.HandlerFunc {

	return func(w http.ResponseWriter, req *http.Request) {
		w.Header().Set("Content-Type", "application/json")

		var schemeStruct investmentV1.Schemes
		//accountStruct.AccountID = req.URL.Query()["account_id"][0]
		schemeStruct.Auth.ID = auth.GetAuth(req)
		var err error
		var scheme_id int64
		var payout_id int64
		var investor_id int64
		if req.URL.Query()["scheme_id"] != nil {
			scheme_id, err = strconv.ParseInt(req.URL.Query()["scheme_id"][0], 10, 64)
		}
		if req.URL.Query()["payout_id"] != nil {
			payout_id, err = strconv.ParseInt(req.URL.Query()["payout_id"][0], 10, 64)
		}
		if req.URL.Query()["id"] != nil {
			investor_id, err = strconv.ParseInt(req.URL.Query()["id"][0], 10, 64)
		}
		if err != nil {
			log.Error().Err(err).Msg(err.Error())
		}
		schemeStruct.SchemeID = scheme_id
		schemeStruct.PayoutID = payout_id
		schemeStruct.InvestorID = investor_id

		PolicyType := "C"
		if schemeStruct.PayoutID == 1 {
			PolicyType = "M"
		}

		schemeStruct.PayoutType = PolicyType

		validate := validator.New()
		err = validate.Struct(schemeStruct)
		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: err.Error()})
			return
		}

		accountsItems, errCheck := schemeStruct.GetSchemes()
		if errCheck != nil {
			log.Print(errCheck.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: errCheck.Error()})
			return
		}

		server_handlers.FormatResponse(w, 200)
		_ = json.NewEncoder(w).Encode(responseBodyScheme{Status: "OK", Message: "Scheme fetched", Data: accountsItems})

	}
}

func GetDashboard() http.HandlerFunc {

	return func(w http.ResponseWriter, req *http.Request) {
		w.Header().Set("Content-Type", "application/json")

		dashboard, err := getDashboardDetails(auth.GetAuth(req))

		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: err.Error()})
			return
		}

		server_handlers.FormatResponse(w, 200)
		_ = json.NewEncoder(w).Encode(dashboard)

	}
}

func getDashboardDetails(ID string) (investmentV1.Dashboard, error) {
	var dashboard investmentV1.Dashboard

	var investmentSummaryStruct investmentV1.InvestmentSummary
	totalPortfolioValueAvailableForWithdrawal, investmentSummary, totalPortfolioValue, totalInvestment, totalWithdrawal, totalInterestPaidOut, totalInterestAccrued, totalInterest, err := investmentSummaryStruct.GetInvestmentSummary(ID)
	if err != nil {
		return dashboard, err
	}

	//var dashboard investmentV1.Dashboard
	dashboard.TotalInvestment = totalInvestment
	dashboard.AmountRepaid = totalWithdrawal
	dashboard.NetPrincipalInvestment = totalInvestment
	//dashboard.Portfolio = (totalInvestment + totalInterestAccrued) - totalWithdrawal
	dashboard.Portfolio = totalPortfolioValue
	dashboard.PortfolioValueAvailableForWithdrawal = totalPortfolioValueAvailableForWithdrawal

	var interestSummary investmentV1.InterestSummary
	interestSummary.CapitalisedInterest = 0
	interestSummary.InterestPaidOut = totalInterestPaidOut
	interestSummary.AccruedInterest = totalInterestAccrued
	interestSummary.TotalInterest = totalInterest

	var estimatedReturnSummary investmentV1.EstimatedReturnSummary
	estimatedReturnSummary.AbsoluteReturnRupee = 0
	estimatedReturnSummary.AbsoluteReturnPercentage = 0
	estimatedReturnSummary.AnnualisedReturn = 0

	//var investmentSummaryItems []investmentV1.InvestmentSummary
	//var investmentSummary investmentV1.InvestmentSummary
	//investmentSummary.Scheme = "Flexi - 2 days - Cumulative Payout"
	//investmentSummary.DateOfInvestment = "2022-09-10"
	//investmentSummary.Amount = 10000
	//investmentSummary.MAX_XIRR = 8
	//investmentSummary.InterestRepaid = 0
	//investmentSummary.PrincipalRepaid = 0
	//investmentSummary.TotalRepaid = 0
	//investmentSummary.PortfolioValue = 10095
	//investmentSummary.EndDate = "2023-09-10"

	//investmentSummaryItems = append(investmentSummaryItems, investmentSummary)

	//var investmentSummary investmentSummary
	/*investmentSummary.Scheme = "Flexi - 2 days - Cumulative Payout"
	investmentSummary.DateOfInvestment = "2022-09-10"
	investmentSummary.Amount = 10000
	investmentSummary.MAX_XIRR = 8
	investmentSummary.InterestRepaid = 0
	investmentSummary.PrincipalRepaid = 0
	investmentSummary.TotalRepaid = 0
	investmentSummary.PortfolioValue = 10095
	investmentSummary.EndDate = "2023-09-10"*/

	//investmentSummaryItems = append(investmentSummaryItems, investmentSummary)

	dashboard.InterestSummary = interestSummary
	dashboard.EstimatedReturnSummary = estimatedReturnSummary
	dashboard.InvestmentSummary = investmentSummary

	return dashboard, nil
}

func InvestmentV1() http.HandlerFunc {
	return func(w http.ResponseWriter, req *http.Request) {
		w.Header().Set("Content-Type", "application/json")

		reqBody, _ := ioutil.ReadAll(req.Body)

		var investmentStruct investmentV1.FlexiPlan
		//elo.Auth.ID = auth.GetAuth(req)
		err := json.Unmarshal(reqBody, &investmentStruct)

		log.Print(investmentStruct)
		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: "Unable to parse the data"})
			return
		}

		validate := validator.New()
		err = validate.Struct(investmentStruct)
		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: err.Error()})
			return
		}

		payout, errCheck := investmentStruct.FlexiV1()
		if errCheck != nil {
			log.Print(errCheck.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: errCheck.Error()})
			return
		}

		server_handlers.FormatResponse(w, 200)
		_ = json.NewEncoder(w).Encode(payout)

	}
}

func GetFrequentlyAskedQuestions() http.HandlerFunc {
	return func(w http.ResponseWriter, req *http.Request) {
		w.Header().Set("Content-Type", "application/json")

		var questions = []map[string]string{
			{"question": "What documents are required to register as an investor/lender?", "answer": "To register as an investor, you must give basic KYC information such as your Aadhar card, Pan card, and bank account details"},
			{"question": "What is the average loan size of Credit Fair?", "answer": "The loan provided starts from minimum of Rs. 10,000 with maximum limit of up to Rs. 20 lakhs. It depends from segment to segment and we consider the average across all the segments, the loan size is somewhere close to Rs. 75,000"},
			{"question": "What is your NPA and how much interest rate do you charge on loans?", "answer": "We have a dedicated Collections team that has helped us keep the NPA under 0.75%. The rate of interest on loans charged to borrowers ranges between 16% to 28%"},
			{"question": "What are the various P2P plans and how much advisory fees can we expect?", "answer": "We have 2 types of P2P Investment plans:\ni) Flexi: This investment plan is for the customers who are looking for short term investment. There is no lock-in period in this plan. Rate of interest offered for Flexi plan is at 9% per annum.\nii)Fixed: This investment plan comes with the benefit of higher returns. The customer can choose from a lock-in period of 6, 12  and 24 months. Rate of interest offered ranges between 9.5% to 11.5% per annum based on the lock-in period selected."},
			{"question": "Is my interest income through Credit Fair Capital taxable?", "answer": "All repayments you receive from borrowers on Credit Fair Capital will be without any tax deduction. Earnings will be taxable as per the income tax rules that apply to you."},
			{"question": "Are there any registration charges?", "answer": "There are no registration charges to the investor. In fact, we have no additional charge whatsoever while onboarding the investor."},
			{"question": "How safe is the investment?", "answer": "P2P investments have an element of risk and are directly affected by the Non-performing Asset (NPA) of the Portfolio. P2P investment with Credit Fair Capital comes with low risk and high returns due to diversification of the portfolio across hundreds of borrowers, sourcing prime borrowers, monitoring end use and in-house collections team. With the efforts of the dedicated Collections team at Credit Fair Capital, the NPA is below 0.75% as compared to industry standards at 3% to 10%."},
			{"question": "In how many borrowers the investor's money is divided into?", "answer": "The number of borrowers depends on the amount invested and the minimum is 50 borrowers. The borrowers are required to have a minimum of 700 as the CIBIL score."},
			{"question": "Can NRIs also invest in Credit Fair Capital?", "answer": "Yes, even NRIs can  invest in Credit Fair Capital with the same documentation process.  But they can participate only with their NRO accounts."},
			{"question": "What are NCDs?", "answer": "Non-convertible debentures (NCDs) are fixed-income instruments, usually issued by high-rated companies in the form of a public or a private issue.  They usually provide higher returns than bank fixed deposits."},
			{"question": "What is P2P lending?", "answer": "P2P lending is a form of crowd-funding used to raise loans which are paid back with interest. It can be defined as the use of an online platform that matches lenders with borrowers.  As per current RBI regulations, these platforms can facilitate only unsecured loans."},
			{"question": "As a partner, how to register with Credit Fair Capital?", "answer": "In order to register yourself as a partner with Credit Fair Capital you can contact us at info@creditfaircapital.in"},
			{"question": "As an investor, how to register with Credit Fair Capital?", "answer": "In order to register as an investor you can visit on our website https://creditfaircapital.in/ and click on Login/Register"},
			{"question": "Are there any eligibility criteria for registration?", "answer": "You should be at least 18 years of age or older to be eligible to register as a partner or an investor with Credit Fair Capital."},
			{"question": "Can I apply for more than one investment?", "answer": "Yes, you can invest multiple times but the limit for a P2P investor is 50 lakhs according to the existing RBI guidelines."},
			{"question": "What are the benefits of having multiple investments?", "answer": "We enable better matching of your investments to your financial goals via multiple investments. \nFor example: if you need to travel in 6 months, you can invest in our 6 months product but if you need the money in 2 years, you can invest longer term."},
			{"question": "How do I change or update my mobile number, email ID, bank account details associated with my account?", "answer": "There is no provision to change or update the mobile number associated with your account with Credit Fair Capital. To update your email address, bank account details, you can reach us at info@creditfaircapital.in"},
			{"question": "How do I withdraw funds post maturity?", "answer": "Write to us at info@creditfaircapital.in for request of withdrawal on maturity."},
			{"question": "What kind of reports are available?", "answer": "Statement of accounts, investment statements, tax reports are types of reports available for your investment."},
			{"question": "Why should you consider investing at Credit Fair Capital?", "answer": "One should consider investing in Credit Fair Capital as we provide higher returns with low risk comparative to other investing firms."},
		}

		server_handlers.FormatResponse(w, 200)
		_ = json.NewEncoder(w).Encode(questions)

	}
}

// Test - delete entire user
func DeleteUser() http.HandlerFunc {

	return func(w http.ResponseWriter, req *http.Request) {
		w.Header().Set("Content-Type", "application/json")

		//reqBody, _ := ioutil.ReadAll(req.Body)

		var user testUser.User
		user.ID = auth.GetAuth(req)
		//err := json.Unmarshal(reqBody, &user)

		log.Print(user)

		log.Print("DeleteUser")
		user.DeleteUser()

		var userRes = []map[string]string{{"Status": "OK", "message": "Deleted"}}

		server_handlers.FormatResponse(w, 200)
		_ = json.NewEncoder(w).Encode(userRes)

	}
}

func GetWithdrawalList() http.HandlerFunc {
	return func(w http.ResponseWriter, req *http.Request) {
		w.Header().Set("Content-Type", "application/json")

		var withdrawalList investmentV1.WithdrawalList
		//accountStruct.AccountID = req.URL.Query()["account_id"][0]
		withdrawalList.Auth.ID = auth.GetAuth(req)
		var err error
		if err != nil {
			log.Error().Err(err).Msg(err.Error())
		}

		validate := validator.New()
		err = validate.Struct(withdrawalList)
		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: err.Error()})
			return
		}

		withdrawalItems, errCheck := withdrawalList.GetWithdrawalList()
		if errCheck != nil {
			log.Print(errCheck.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: errCheck.Error()})
			return
		}

		server_handlers.FormatResponse(w, 200)
		_ = json.NewEncoder(w).Encode(responseBodyWithdrawal{Status: "OK", Message: "Withdrawal list fetched", Data: withdrawalItems})

	}
}

func GetInvestmentList() http.HandlerFunc {
	return func(w http.ResponseWriter, req *http.Request) {

	}
}

func GetRecentTransaction() http.HandlerFunc {
	return func(w http.ResponseWriter, req *http.Request) {
		w.Header().Set("Content-Type", "application/json")
		var transactions investmentV1.Transactions
		transactions.Auth.ID = auth.GetAuth(req)

		transactionsData, err := transactions.GetRecentTransaction()

		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: "Unable to fetch the data"})
			return
		}

		if len(transactionsData) == 0 {
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: "No recent transaction found"})
			return
		}

		server_handlers.FormatResponse(w, 200)
		_ = json.NewEncoder(w).Encode(responseBodyTransactions{Status: "OK", Message: "List of recent transaction", Data: transactionsData})
	}
}

func GetInvestors() http.HandlerFunc {
	return func(w http.ResponseWriter, req *http.Request) {
		w.Header().Set("Content-Type", "application/json")
		var investors investmentV1.Investors
		investors.Auth.ID = auth.GetAuth(req)

		investorsData, err := investors.GetInvestors()

		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: "Unable to fetch the data"})
			return
		}

		if len(investorsData) == 0 {
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: "No investor found"})
			return
		}

		server_handlers.FormatResponse(w, 200)
		_ = json.NewEncoder(w).Encode(responseBodyInvestors{Status: "OK", Message: "List of investors", Data: investorsData})
	}
}

func GetPortfolio() http.HandlerFunc {
	return func(w http.ResponseWriter, req *http.Request) {
		w.Header().Set("Content-Type", "application/json")

		var investors investmentV1.InvestorPortfolio

		var err error
		if req.URL.Query()["id"] != nil {
			investors.ID = req.URL.Query()["id"][0]
		}

		dashboard, err := getDashboardDetails(investors.ID)

		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: err.Error()})
			return
		}

		server_handlers.FormatResponse(w, 200)
		_ = json.NewEncoder(w).Encode(dashboard)
	}
}

func PaymentConfirmation() http.HandlerFunc {
	return func(w http.ResponseWriter, req *http.Request) {
		w.Header().Set("Content-Type", "application/json")

		reqBody, _ := ioutil.ReadAll(req.Body)

		var payment []investmentV1.PaymentConfirmation

		err := json.Unmarshal(reqBody, &payment)

		log.Print(payment)
		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: "Unable to parse the data"})
			return
		}
		var payment_method = "others"
		msg := investmentV1.UpdatePayment(payment, true, payment_method)

		var test map[string]string
		if len(msg) == 0 {
			test = map[string]string{"Status": "OK", "Message": "Payment confirmed"}
		} else {
			test = map[string]string{"Status": "FAIL", "Message": "Payment confirmation failed"}
		}

		server_handlers.FormatResponse(w, 200)
		_ = json.NewEncoder(w).Encode(test)
	}
}

func WithdrawalConfirmation() http.HandlerFunc {
	return func(w http.ResponseWriter, req *http.Request) {
		w.Header().Set("Content-Type", "application/json")

		reqBody, _ := ioutil.ReadAll(req.Body)

		//a := []interface{}{1, 2, 3, 4, 5}
		//b := make([]int, len(a))
		//amt := investmentV1.GetGainedInterestByDate("2022-10-01", b)
		//log.Print(amt)
		//return

		var withdrawal []investmentV1.WithdrawalConfirmation

		err := json.Unmarshal(reqBody, &withdrawal)

		log.Print(withdrawal)
		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: "Unable to parse the data"})
			return
		}

		investmentV1.UpdateWithdrawal(withdrawal)

		var test = map[string]string{"Status": "OK", "Message": "Withdrawal confirmed"}

		server_handlers.FormatResponse(w, 200)
		_ = json.NewEncoder(w).Encode(test)
	}
}

func ForgotPassword() http.HandlerFunc {
	return func(w http.ResponseWriter, req *http.Request) {
		w.Header().Set("Content-Type", "application/json")

		log.Info().Msg("forgot password called")
		sentry.CaptureMessage("forgot password called")
		reqBody, _ := ioutil.ReadAll(req.Body)

		var url = req.Header["Origin"]

		var elo eloquent.ForgotPasswordTable
		err := json.Unmarshal(reqBody, &elo.Data)

		elo.Data.Host = url[0]

		if err != nil {
			log.Info().Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: "Unable to parse the data"})
			return
		}

		validate := validator.New()
		err = validate.Struct(elo.Data)
		if err != nil {
			log.Info().Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(errorValidation(err))
			return
		}

		res, err := elo.ForgotPassword()
		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: err.Error()})
			return
		}
		log.Print(res)
		log.Print("Forgot Password successful")
		server_handlers.FormatResponse(w, 200)
		_ = json.NewEncoder(w).Encode(responseBody{Status: "OK", Message: "Reset password link to the registered email address"})

	}
}

func AbortTransactions() http.HandlerFunc {
	return func(w http.ResponseWriter, req *http.Request) {
		w.Header().Set("Content-Type", "application/json")

		commands.AbortTransactions()

		server_handlers.FormatResponse(w, 200)
		_ = json.NewEncoder(w).Encode(responseBody{Status: "OK", Message: "Transactions Aborted"})

	}
}

func SubmitPassword() http.HandlerFunc {
	return func(w http.ResponseWriter, req *http.Request) {
		w.Header().Set("Content-Type", "application/json")

		log.Info().Msg("Submit password called")
		sentry.CaptureMessage("Submit password called")
		reqBody, _ := ioutil.ReadAll(req.Body)
		var elo eloquent.SubmitPassword
		err := json.Unmarshal(reqBody, &elo)
		if err != nil {
			log.Info().Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: "Unable to parse the data"})
			return
		}

		validate := validator.New()
		err = validate.Struct(elo)
		if err != nil {
			log.Info().Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(errorValidation(err))
			return
		}
		res, err := elo.SubmitPassword()
		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: err.Error()})
			return
		}
		log.Print(res)
		log.Print("Submit Password successful")
		server_handlers.FormatResponse(w, 200)
		_ = json.NewEncoder(w).Encode(responseBody{Status: "OK", Message: "Password changed successfully", Token: res.Token})

	}
}

func GetInvestorBorrowerMapping() http.HandlerFunc {

	return func(w http.ResponseWriter, req *http.Request) {
		w.Header().Set("Content-Type", "application/json")

		log.Info().Msg("Func called GetInvestorBorrowerMapping")

		var ID int64
		var err error
		if req.URL.Query()["id"] != nil {
			ID, err = strconv.ParseInt(req.URL.Query()["id"][0], 10, 64)
		}
		var id string
		if ID == 0 {
			id = auth.GetAuth(req)
			ID, err = strconv.ParseInt(id, 10, 64)
		}
		log.Print(ID)
		if err != nil {
			log.Info().Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: "Unable to parse the data"})
			return
		}

		var elo eloquent.InvestorBorrowerMapping
		elo.ID = ID
		response, err := elo.GetInvestorBorrowerMapping()

		if err != nil {
			log.Error().Err(err).Msg(err.Error())
			server_handlers.FormatResponse(w, 400)
			_ = json.NewEncoder(w).Encode(responseBody{Status: "FAIL", Message: err.Error()})
			return
		}

		server_handlers.FormatResponse(w, 200)
		_ = json.NewEncoder(w).Encode(responseBodyInvestorBorrowerMapping{Status: "OK", Message: "Data fetched", Data: response})

	}
}

func errorValidation(err error) []ApiError {
	var ve validator.ValidationErrors
	if errors.As(err, &ve) {
		out := make([]ApiError, len(ve))
		for i, fe := range ve {
			out[i] = ApiError{"FAIL", msgForTag(fe)}
		}
		return out
	}
	return nil
}

func msgForTag(fe validator.FieldError) string {
	log.Print(fe.Tag())
	switch fe.Tag() {
	case "required":
		return fe.Field() + " field is required"
	case fe.Tag():
		return "Invalid field " + fe.Tag()
	}
	return fe.Error() // default error
}

func MicroSoftLogin() http.HandlerFunc {
	return func(w http.ResponseWriter, req *http.Request) {
		w.Header().Set("Content-Type", "application/json")
		newUrl := mLogin.HandleLogin(w, req)
		//http.Redirect(w, req, newUrl, http.StatusSeeOther)
		server_handlers.FormatResponse(w, 200)
		_ = json.NewEncoder(w).Encode(responseBody{Status: "OK", Message: "Redirection link generated", Link: newUrl})

	}
}

func MicroSoftCallback() http.HandlerFunc {
	return func(w http.ResponseWriter, req *http.Request) {
		w.Header().Set("Content-Type", "application/json")
		mLogin.HandleCallback(w, req)
		//http.Redirect(w, req, newUrl, http.StatusSeeOther)
		/*server_handlers.FormatResponse(w, 200)
		_ = json.NewEncoder(w).Encode(responseBody{Status: "OK", Message: "Password changed successfully", Token: res.Token})*/

	}
}
