package mapper

import (
	"database/sql"

	"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/dto"
	"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/helper/datetime"
	"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/model"
	"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/service/i18n"
)

func ToArticlesList(lang i18n.Language, m []model.Article) []dto.Article {
	res := make([]dto.Article, 0, len(m))

	for i := range m {
		res = append(res, dto.Article{
			ID:              m[i].ID,
			URL:             m[i].URL,
			Title:           m[i].Title,
			Text:            m[i].Text,
			Image:           m[i].Image,
			MetaKeywords:    m[i].MetaKeywords.String,
			MetaDescription: m[i].MetaDescription.String,
			PublishTime:     datetime.FormatDateStr(lang, m[i].PublishTime),
			Language:        i18n.LanguageFromID(m[i].Language),
		})
	}

	return res
}

func ToArticle(lang i18n.Language, m model.Article) *dto.Article {
	return &dto.Article{
		ID:              m.ID,
		URL:             m.URL,
		Title:           m.Title,
		Text:            m.Text,
		Image:           m.Image,
		MetaKeywords:    m.MetaKeywords.String,
		MetaDescription: m.MetaDescription.String,
		PublishTime:     datetime.FormatDateStr(lang, m.PublishTime),
		Language:        i18n.LanguageFromID(m.Language),
	}
}

func ToArticlesPreview(lang i18n.Language, m []model.ArticlePreview) []dto.ArticlePreview {
	res := make([]dto.ArticlePreview, 0, len(m))

	for i := range m {
		res = append(res, dto.ArticlePreview{
			ID:          m[i].ID,
			URL:         m[i].URL,
			Title:       m[i].Title,
			PreviewText: m[i].PreviewText.String,
			Image:       m[i].Image,
			PublishTime: datetime.FormatDateStr(lang, m[i].PublishTime),
		})
	}

	return res
}

func ToArticleForm(a model.Article, tags []model.Tag) dto.ArticleForm {
	tagMap := make(map[uint64]bool, len(tags))
	for i := range tags {
		tagMap[tags[i].ID] = true
	}

	return dto.ArticleForm{
		ID:              a.ID,
		Title:           a.Title,
		Image:           a.Image,
		URL:             a.URL,
		IsActive:        a.IsActive,
		Text:            a.Text,
		PreviewText:     a.PreviewText.String,
		MetaKeywords:    a.MetaKeywords.String,
		MetaDescription: a.MetaDescription.String,
		PublishTime:     datetime.FormatDateForm(a.PublishTime),
		Language:        string(i18n.LanguageFromID(a.Language)),
		ActiveTags:      tagMap,
	}
}

func ToArticleModel(f dto.ArticleForm) (*model.Article, error) {
	var previewText, metaKeywords, metaDesc sql.NullString

	if f.PreviewText != "" {
		previewText = sql.NullString{
			String: f.PreviewText,
			Valid:  true,
		}
	}

	if f.MetaKeywords != "" {
		metaKeywords = sql.NullString{
			String: f.MetaKeywords,
			Valid:  true,
		}
	}

	if f.MetaDescription != "" {
		metaDesc = sql.NullString{
			String: f.MetaDescription,
			Valid:  true,
		}
	}

	parsedDateTime, err := datetime.ParseDateTime(f.PublishTime)
	if err != nil {
		return nil, err
	}

	return &model.Article{
		ID:              f.ID,
		URL:             f.URL,
		Title:           f.Title,
		PublishTime:     parsedDateTime,
		Text:            f.Text,
		IsActive:        f.IsActive,
		Image:           f.Image,
		PreviewText:     previewText,
		MetaKeywords:    metaKeywords,
		MetaDescription: metaDesc,
		Language:        i18n.LanguageID(i18n.Language(f.Language)),
	}, nil
}
