package tests

import (
	"context"
	_ "embed"
	"fmt"
	"github.com/gofiber/fiber/v2"
	"github.com/pioz/faker"
	"github.com/stretchr/testify/assert"
	"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/clients"
	"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/dal"
	"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/model"
	"penahub.gitlab.yandexcloud.net/backend/quiz/worker/answerwc"
	"penahub.gitlab.yandexcloud.net/backend/quiz/worker/senders"
	"testing"
	"time"
)

//go:embed mail/to_client.tmpl
var toClientTemplate string

//go:embed mail/reminder.tmpl
var reminderTemplate string

//go:embed mail/client_tg.tmpl
var tgClientTemplate string

func TestProcessMessageToSMTP(t *testing.T) {
	clientDeps := clients.Deps{
		SmtpHost:    "connect.mailclient.bz",
		SmtpPort:    "587",
		SmtpSender:  "skeris@mailing.pena.digital",
		ApiKey:      "P0YsjUB137upXrr1NiJefHmXVKW1hmBWlpev",
		SmtpApiUrl:  "https://api.smtp.bz/v1/smtp/send",
		FiberClient: &fiber.Client{},
	}

	client := clients.NewSmtpClient(clientDeps)

	recipient := "pashamullin2001@gmail.com"
	subject := "Test"

	data := senders.TemplateData{
		QuizConfig: model.ResultInfo{
			Theme: "<h1>Taemplste Quiz</h1>",
		},
		AnswerContent: model.ResultContent{
			Name:  "<a>Pasha</a>",
			Phone: "<div>+723456789<div",
			Email: "test@example.com",
			//Adress:    "chtoto tam",
			Telegram:  "<br>@test</br>",
			Wechat:    "<span>test_wechat</span>",
			Viber:     "<span><span>+723456789</span></span>",
			Vk:        "<body>test_vk<body>",
			Skype:     "test_skype",
			Whatsup:   "test_whatsup",
			Messenger: "test_messenger",
		},
		AllAnswers: []model.ResultAnswer{
			{AnswerID: 1, QuestionID: 1, Content: "https://www.google.com/search?sca_esv=c51a80de1a7d45f0&sxsrf=ACQVn08xG-a0eH1Vds246-fONoSvvjzVMw:1707762485524&q=ku,n&tbm=isch&source=lnms&sa=X&ved=2ahUKEwi7ub2Ct6aEAxVVb_UHHQIQBVoQ0pQJegQIDRAB&biw=1536&bih=703&dpr=1.25#imgrc=0PWwTuuH2uBQ3M|html", CreatedAt: time.Now()},
			{AnswerID: 2, QuestionID: 2, Content: "From a friend", CreatedAt: time.Now()},
			{AnswerID: 3, QuestionID: 3, Content: "From a friend", CreatedAt: time.Now()},
			{AnswerID: 4, QuestionID: 4, Content: `{"Image":"https://letsenhance.io/static/8f5e523ee6b2479e26ecc91b9c25261e/1015f/MainAfter.jpg","Description":"Gekon"}`, CreatedAt: time.Now()},
		},
		QuestionsMap: map[uint64]string{
			1: "?",
			2: "How did you hear about us?",
			3: "que 3",
			4: "que 4",
		},
		AnswerTime: time.Now().Format("Monday, 2 January 2006 г., 15:04 UTC-07:00"),
	}

	mailSender := senders.NewMailLeadSender(client)
	err := mailSender.SendMailWithAttachment(recipient, subject, toClientTemplate, data, nil)
	if err != nil {
		t.Errorf("Error sending email: %v", err)
	}

}

func TestProcessReminderToClient(t *testing.T) {
	clientDeps := clients.Deps{
		SmtpHost:    "connect.mailclient.bz",
		SmtpPort:    "587",
		SmtpSender:  "skeris@mailing.pena.digital",
		ApiKey:      "P0YsjUB137upXrr1NiJefHmXVKW1hmBWlpev",
		FiberClient: &fiber.Client{},
	}

	client := clients.NewSmtpClient(clientDeps)

	recipient := "mullinp@internet.ru"
	subject := "Test Reminder"

	quizConfig := model.ResultInfo{
		ReplName: "Test Quiz",
		Reply:    "mullinp@internet.ru",
		Theme:    "Reminder Theme",
	}

	mailSender := senders.NewMailLeadSender(client)

	err := mailSender.SendMailWithAttachment(recipient, subject, reminderTemplate, senders.TemplateData{
		QuizConfig:    quizConfig,
		AnswerContent: model.ResultContent{},
		AllAnswers:    []model.ResultAnswer{},
		QuestionsMap:  nil,
	}, nil)

	if err != nil {
		t.Errorf("Error sending email: %v", err)
	}
}

func TestProcessMessageToClient(t *testing.T) {
	smtpData := clients.Deps{
		SmtpApiUrl:  "https://api.smtp.bz/v1/smtp/send",
		SmtpHost:    "connect.mailclient.bz",
		SmtpPort:    "587",
		SmtpSender:  "skeris@mailing.pena.digital",
		ApiKey:      "P0YsjUB137upXrr1NiJefHmXVKW1hmBWlpev",
		FiberClient: &fiber.Client{},
	}

	mailClient := clients.NewSmtpClient(smtpData)
	mailSender := senders.NewMailLeadSender(mailClient)
	tgSender, err := senders.NewTgSender("6712573453:AAFqTOsgwe_j48ZQ1GzWKQDT5Nwr-SAWjz8")
	assert.NoError(t, err)

	ctx := context.Background()

	repo, err := dal.New(ctx, "host=localhost port=35432 user=squiz password=Redalert2 dbname=squiz sslmode=disable", nil)
	assert.NoError(t, err)

	deps := answerwc.DepsSendToClient{
		Redis:           nil,
		Dal:             repo,
		LeadSenders:     []senders.LeadSender{mailSender, tgSender},
		CustomerService: nil,
	}

	errChan := make(chan<- error)

	w := answerwc.NewSendToClient(deps, errChan)

	quizConfig := model.QuizConfig{
		Mailing: model.ResultInfo{
			Theme: faker.String(),
		},
	}

	questionsMap := map[uint64]string{
		1: faker.String(),
		2: faker.String(),
	}

	account := model.Account{
		UserID: "64f2cd7a7047f28fdabf6d9e",
	}

	allAnswers := []model.ResultAnswer{
		{
			Content:    `{"Image":"https://letsenhance.io/static/8f5e523ee6b2479e26ecc91b9c25261e/1015f/MainAfter.jpg","Description":"Gekon"}`,
			AnswerID:   1,
			QuestionID: 1,
		},
		{
			Content:    "",
			AnswerID:   2,
			QuestionID: 2,
		},
	}

	answerContent := model.ResultContent{
		Name:  "Pasha",
		Phone: "+723456789",
		Email: "test@example.com",
		//Adress:    "chtoto tam",
		Telegram:  "@test",
		Wechat:    "test_wechat",
		Viber:     "+723456789",
		Vk:        "test_vk",
		Skype:     "test_skype",
		Whatsup:   "test_whatsup",
		Messenger: "test_messenger",
	}

	answerTime := time.Now()

	err = w.ProcessMessageToClient(ctx, answerwc.DepsProcessMsgToClient{
		QuizConfig:    quizConfig,
		QuestionsMap:  questionsMap,
		Account:       account,
		AllAnswers:    allAnswers,
		AnswerContent: answerContent,
		AnswerTime:    answerTime,
		Quiz: &model.Quiz{
			Id:        26324,
			AccountId: "64f2cd7a7047f28fdabf6d9e",
		},
	})

	err = w.ProcessReminderToClient(ctx, account, model.QuizConfig{
		Mailing: model.ResultInfo{
			When:     "email",
			Theme:    fmt.Sprintf("не удалось отправить заявку по опросу\"%s\"", "test"),
			Reply:    "noreply@pena.digital",
			ReplName: "Reminder",
		},
	}, &model.Quiz{
		Id:        26324,
		AccountId: "64f2cd7a7047f28fdabf6d9e",
	})
	assert.NoError(t, err)
}
