package tools

import (
	"amocrm/internal/models"
	"fmt"
	"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/model"
	"strings"
	"unicode/utf8"
)

func ToPipeline(amoPipelines []models.Pipeline) []model.Pipeline {
	var pipelines []model.Pipeline
	for _, p := range amoPipelines {
		pipeline := model.Pipeline{
			Amoid:     int32(p.ID),
			Name:      p.Name,
			Isarchive: p.IsArchive,
			AccountID: int32(p.AccountID),
		}
		pipelines = append(pipelines, pipeline)
	}
	return pipelines
}

func ToStep(amoStatuses []models.Statuses) []model.Step {
	var steps []model.Step
	for _, s := range amoStatuses {
		step := model.Step{
			Amoid:      int32(s.ID),
			Name:       s.Name,
			Pipelineid: int32(s.PipelineID),
			Color:      s.Color,
			Accountid:  int32(s.AccountID),
		}
		steps = append(steps, step)
	}
	return steps
}

func ToTag(amoTag []models.Tag, entity model.EntityType) []model.Tag {
	var tags []model.Tag
	for _, t := range amoTag {
		tag := model.Tag{
			Amoid:  int32(t.ID),
			Entity: entity,
			Name:   t.Name,
			Color:  t.Color,
		}
		tags = append(tags, tag)
	}
	return tags
}

func ToField(amoField []models.CustomField, entity model.EntityType) []model.Field {
	var fields []model.Field
	for _, f := range amoField {
		field := model.Field{
			Amoid:  int32(f.ID),
			Code:   f.Code,
			Name:   f.Name,
			Entity: entity,
			Type:   model.FieldType(f.Type),
		}
		fields = append(fields, field)
	}

	return fields
}

func isEmoji(r rune) bool {
	// https://symbl.cc/ru/unicode/blocks/emoticons/

	return (r >= 0x1F600 && r <= 0x1F64F) || // эмотикоины
		(r >= 0x1F650 && r <= 0x1F67F) || // орнаментные символы
		(r >= 0x1F680 && r <= 0x1F6FF) || // Транспортные и картографические символы
		(r >= 0x1F700 && r <= 0x1F77F) || // Алхимические символы
		(r >= 0x1F780 && r <= 0x1F7FF) || // Расширенные геометрические фигуры
		(r >= 0x1F800 && r <= 0x1F8FF) || // Дополнительные стрелки — С
		(r >= 0x1F900 && r <= 0x1F9FF) || // Дополнительные символы и пиктограммы
		(r >= 0x1FA00 && r <= 0x1FA6F) || // Шахматные символы
		(r >= 0x1FA70 && r <= 0x1FAFF) || // Расширенные символы и пиктограммы — A
		(r >= 0x1FB00 && r <= 0x1FBFF) || // Символы наследия вычислительной техники
		(r >= 0x20000 && r <= 0x2A6DF) || // Унифицированные идеограммы ККЯ. Расширение B
		(r >= 0x2A700 && r <= 0x2B73F) || // Унифицированные идеограммы ККЯ. Расширение C
		(r >= 0x2B740 && r <= 0x2B81F) || // Унифицированные идеограммы ККЯ. Расширение D
		(r >= 0x2B820 && r <= 0x2CEAF) || // Унифицированные идеограммы ККЯ. Расширение E
		(r >= 0x2CEB0 && r <= 0x2EBEF) || // Унифицированные идеограммы ККЯ. Расширение F
		(r >= 0x2EBF0 && r <= 0x2EE5F) || // CJK Unified Ideographs Extension I
		(r >= 0x2F800 && r <= 0x2FA1F) || // Дополнение к совместимым идеограммам ККЯ
		(r >= 0x30000 && r <= 0x3134F) || // Унифицированные идеограммы ККЯ. Расширение G
		(r >= 0x31350 && r <= 0x323AF) || // Унифицированные идеограммы ККЯ. Расширение H
		(r >= 0xE0000 && r <= 0xE007F) || // Теги
		(r >= 0xE0100 && r <= 0xE01EF) // Дополнение к селекторам вариантов начертания
}

func EmojiUnicode(text string) string {
	var result strings.Builder
	for len(text) > 0 {
		r, size := utf8.DecodeRuneInString(text)
		if size == -1 {
			result.WriteString(text[:1])
			text = text[1:]
		} else {
			if isEmoji(r) {
				result.WriteString(fmt.Sprintf(`"0x%x"`, r))
			} else {
				result.WriteRune(r)
			}
			text = text[size:]
		}
	}
	return result.String()
}

func AddContactFields(contactFields []models.FieldsValues, fieldValue string, fieldType model.ContactQuizConfig, fieldMap map[string]int) []models.FieldsValues {
	if fieldValue != "" {
		values := make([]models.ValueInterface, 0)
		values = append(values, models.Values{Value: fieldValue})

		contactFields = append(contactFields, models.FieldsValues{
			FieldID: fieldMap[string(fieldType)],
			Values:  values,
		})
	}
	return contactFields
}

func ConstructUTMFields(utmMap model.UTMSavingMap, currentFields []model.Field) []models.FieldsValues {
	var fields []models.FieldsValues
	for _, field := range currentFields {
		if data, ok := utmMap[field.Name]; ok {
			val := []models.ValueInterface{
				models.Values{
					Value: data,
				},
			}
			f := models.FieldsValues{
				FieldID: int(field.Amoid),
				Values:  val,
			}
			fields = append(fields, f)
			continue
		}
	}

	return fields
}

func ConstructAmoTags(currentTags []model.Tag, ruleTags model.TagsToAdd) []models.Tag {
	var tagsToAmo []models.Tag
	ruleTagMap := make(map[int64]struct{})

	mapConstruct := func(idsArray []int64) {
		for _, id := range idsArray {
			ruleTagMap[id] = struct{}{}
		}
	}

	mapConstruct(ruleTags.Lead)
	mapConstruct(ruleTags.Contact)
	mapConstruct(ruleTags.Company)
	mapConstruct(ruleTags.Customer)

	for _, tag := range currentTags {
		if _, ok := ruleTagMap[int64(tag.Amoid)]; ok {
			tagsToAmo = append(tagsToAmo, models.Tag{
				ID:   int(tag.Amoid),
				Name: tag.Name,
				//Color: tag.Color,
			})
		}
	}
	return tagsToAmo
}
