package FikoYTHata

import (
	"encoding/json"
	"fmt"
	"strings"
)

// FikoYTHata yapısı
type FikoYTHata struct {
	Kategori     *string             `json:"kategori,omitempty"`
	Kod          *int                `json:"kod,omitempty"`
	Baslik       *string             `json:"baslik,omitempty"`
	Mesaj        *string             `json:"mesaj,omitempty"`
	SistemMesaji *string             `json:"sistemMesaji,omitempty"`
	Cozumler     map[string][]string `json:"cozumler,omitempty"`
}

func (f *FikoYTHata) ToJson() string {
	jsonData, err := json.MarshalIndent(f, "", "  ")
	if err != nil {
		// Hata durumunda anlamlı bir çıktı döndürüyoruz
		return fmt.Sprintf("JSON formatlama hatası: %v", err)
	}
	return string(jsonData)
}

/**/
type ArrayFikoYTHata []FikoYTHata

func (f *ArrayFikoYTHata) ToJson() string {
	jsonData, err := json.MarshalIndent(f, "", "  ")
	if err != nil {
		// Hata durumunda anlamlı bir çıktı döndürüyoruz
		return fmt.Sprintf("JSON formatlama hatası: %v", err)
	}
	return string(jsonData)
}

func (f *ArrayFikoYTHata) Ekle(v ...FikoYTHata) *ArrayFikoYTHata {
	*f = append(*f, v...)
	return f
}

/***/
func YeniFikoYTHata() *FikoYTHata {
	kategori := "Sistem"
	kod := 50000001
	baslik := "Tanımlanamayan Sistem Hatası"
	mesaj := "Sistem Beklenmedik Bir Hata Gösterdi"
	cozumler := map[string][]string{
		"kullanici": {"Sistem Yöneticisi İle İletişime Geçin"},
		"yazilimci": {"Ne Yaptığınızdan Emin İseniz Sistem Yöneticisi İle İletişime Geçin"},
	}
	return &FikoYTHata{
		Kategori: &kategori,
		Kod:      &kod,
		Baslik:   &baslik,
		Mesaj:    &mesaj,
		Cozumler: cozumler,
	}
}

// FikoYTHatalar yapısı
type FikoYTHatalar struct {
	Hatalar      []*FikoYTHata       `json:"hatalar"`
	Baslik       *string             `json:"baslik,omitempty"`
	Mesaj        *string             `json:"mesaj,omitempty"`
	SistemMesaji *string             `json:"sistemMesaji,omitempty"`
	Cozumler     map[string][]string `json:"cozumler,omitempty"`
}

func YeniFikoYTHatalar() *FikoYTHatalar {
	cozumler := map[string][]string{
		"kullanici": make([]string, 0),
		"yazilimci": make([]string, 0),
	}
	baslik := "Birden Fazla Hata"
	mesaj := "Bilgi Sağlanmamış"
	return &FikoYTHatalar{
		Hatalar:  make([]*FikoYTHata, 0),
		Baslik:   &baslik,
		Mesaj:    &mesaj,
		Cozumler: cozumler,
	}
}

func (f *FikoYTHatalar) Ekle(fikoHatalar ...*FikoYTHata) {
	f.Hatalar = append(f.Hatalar, fikoHatalar...)
	f.Isle()
}

func (f *FikoYTHatalar) Temizle() {
	baslik := "Birden Fazla Hata"
	mesaj := "Bilgi Sağlanmamış"
	f.Baslik = &baslik
	f.Mesaj = &mesaj
	f.SistemMesaji = nil
	f.Cozumler = map[string][]string{
		"kullanici": make([]string, 0),
		"yazilimci": make([]string, 0),
	}
}

func (f *FikoYTHatalar) Isle() {
	f.Temizle()
	var mesajlar []string
	for _, hata := range f.Hatalar {
		mesajlar = append(mesajlar, *hata.Mesaj)
		f.Cozumler["kullanici"] = append(f.Cozumler["kullanici"], hata.Cozumler["kullanici"]...)
		f.Cozumler["yazilimci"] = append(f.Cozumler["yazilimci"], hata.Cozumler["yazilimci"]...)
	}
	mesaj := strings.Join(mesajlar, "\n")
	f.Mesaj = &mesaj
}

func (f *FikoYTHatalar) ToJson() string {
	jsonData, err := json.MarshalIndent(f, "", "  ")
	if err != nil {
		// Hata durumunda anlamlı bir çıktı döndürüyoruz
		return fmt.Sprintf("JSON formatlama hatası: %v", err)
	}
	return string(jsonData)
}

// Diğer Hata Tipleri (TAMAMI)

type FikoYTHataKomutCalistirilirkenHata struct {
	FikoYTHata
}

func YeniFikoYTHataKomutCalistirilirkenHata(adres string, hata interface{}) *FikoYTHataKomutCalistirilirkenHata {
	kategori := "FikoYT Sistem"
	kod := 50010000
	baslik := "Komut Çalıştırılırken Hata"
	mesaj := fmt.Sprintf("%s Adresi Tanımlanmamış", adres)
	sistemMesaji := fmt.Sprintf("%v", hata)
	cozumler := map[string][]string{
		"kullanici": {`Bir Kaç Kere Daha Deneyin.`, `Girdiğiniz Bilgileri Kontrol Ediniz`, `Sorun Devam Ediyorsa Yazılım Sahibi İle İletişime Geçin.Sistemsel Değişiklikler Olabilir`},
		"yazilimci": {`Bir Kaç Kere Daha Request Edin.`, `Request Ettiğiniz Parametreleri Tekrar Gözden Geçirin`, `Sorun Devam Ediyorsa Api Değişim Günlüklerini Kontrol Ediniz Ve Değişimleri Uygulayınız.`, `Sorun Hala devam Ediyorsa Bizimle İletişime Geçiniz.`},
	}
	return &FikoYTHataKomutCalistirilirkenHata{
		FikoYTHata: FikoYTHata{
			Kategori:     &kategori,
			Kod:          &kod,
			Baslik:       &baslik,
			Mesaj:        &mesaj,
			SistemMesaji: &sistemMesaji,
			Cozumler:     cozumler,
		},
	}
}

/***/
type FikoYTHataAdresBulunamadi struct {
	FikoYTHata
}

func YeniFikoYTHataAdresBulunamadi(adres string) *FikoYTHataAdresBulunamadi {
	kategori := "FikoYT Sistem"
	kod := 50000000
	baslik := "Adres Bulunamadı"
	mesaj := fmt.Sprintf("%s Adresi Tanımlanmamış", adres)
	cozumler := map[string][]string{
		"kullanici": {"Bir Kaç Kere Daha Deneyin.", "Bu Hatayı Alıyorsanız İstek Bize Ulaşıyor Demektir.", "Yazılım Sahibi İle İletişime Geçin.Sistemsel Değişiklikler Olabilir"},
		"yazilimci": {"Sistemde Belirtilen Fonksiyon Bulunamadı.İsteği Kontrol Edin.", "Varlığından Eminseniz Ve Daha Önce Çalıştıysa Versiyon Numaralarını Kontrol Ediniz", "Sorun Devam Ediyorsa Api Değişim Günlüklerini Kontrol Ediniz Ve Değişimleri Uygulayınız", "Sorun Hala devam Ediyorsa Bizimle İletişime Geçiniz"},
	}
	return &FikoYTHataAdresBulunamadi{
		FikoYTHata: FikoYTHata{
			Kategori: &kategori,
			Kod:      &kod,
			Baslik:   &baslik,
			Mesaj:    &mesaj,
			Cozumler: cozumler,
		},
	}
}

/***/
type FikoYTHataAnlasmaOnaylama struct {
	FikoYTHata
}

func YeniFikoYTHataAnlasmaOnaylama() *FikoYTHataAnlasmaOnaylama {
	kategori := "FikoYT Sistem"
	kod := 10010001
	baslik := "Anlaşma Onayı"
	mesaj := "Lütfen Sözleşmeyi Onaylayın"
	cozumler := map[string][]string{
		"kullanici": {
			`İstenen Sözleşmeleri Onaylayın.`,
			`Sorun Hala devam Ediyorsa Sistem Yöneticinizle İletişime Geçiniz`,
		},
		"yazilimci": {
			`Sisteminize Tanımlanan Tüm Sözleşmeleri Onaylayın`,
			`Apiyi Sağladığınız kullanicinın Sözleşmesinin Onaylandığından Emin Olun`,
			`Sorun Hala devam Ediyorsa Bizimle İletişime Geçiniz`,
		},
	}
	sisteMesaji := "Yok"
	return &FikoYTHataAnlasmaOnaylama{
		FikoYTHata: FikoYTHata{
			Kategori:     &kategori,
			Kod:          &kod,
			Baslik:       &baslik,
			Mesaj:        &mesaj,
			Cozumler:     cozumler,
			SistemMesaji: &sisteMesaji,
		},
	}
}

/**/

type FikoYTHataTurHatasi struct {
	FikoYTHata
}

func YeniFikoYTHataTurHatasi(alanAdi string) *FikoYTHataTurHatasi {
	kategori := "FikoYT Sistem"
	kod := 10010002
	baslik := fmt.Sprintf("%v", alanAdi)
	mesaj := fmt.Sprintf("%v Alanı Yanlış Tanımlanmış", alanAdi)
	sistemMesaji := fmt.Sprintf("%v Alanı Yanlış Tanımlanmış", alanAdi)
	cozumler := map[string][]string{
		"kullanici": {`Bir Kaç Kere Daha Deneyin.`, `Girdiğiniz Bilgileri Kontrol Ediniz`, `Sorun Devam Ediyorsa Yazılım Sahibi İle İletişime Geçin.Sistemsel Değişiklikler Olabilir`},
		"yazilimci": {`Bir Kaç Kere Daha Request Edin.`, `Request Ettiğiniz Parametreleri Tekrar Gözden Geçirin`, `Sorun Devam Ediyorsa Api Değişim Günlüklerini Kontrol Ediniz Ve Değişimleri Uygulayınız.`, `Sorun Hala devam Ediyorsa Bizimle İletişime Geçiniz.`},
	}
	return &FikoYTHataTurHatasi{
		FikoYTHata: FikoYTHata{
			Kategori:     &kategori,
			Kod:          &kod,
			Baslik:       &baslik,
			Mesaj:        &mesaj,
			SistemMesaji: &sistemMesaji,
			Cozumler:     cozumler,
		},
	}
}

/**/
/**/

type FikoYTHataAyniDegilHatasi struct {
	FikoYTHata
}

func YeniFikoYTHataAyniDegilHatasi(alan1 string, alan2 string, mesaj1 *string) *FikoYTHataAyniDegilHatasi {
	kategori := "FikoYT Sistem"
	kod := 10010003
	baslik := fmt.Sprintf("%s Hatalı", alan1)
	var mesaj string

	if mesaj1 == nil {
		mesaj = fmt.Sprintf("Lütfen %s ve %s alanına girdiğiniz bilgileri kontrol ediniz. Aynı olması gerekir.", alan1, alan2)
	} else {
		mesaj = *mesaj1
	}

	sistemMesaji := fmt.Sprintf("%s alanı yanlış tanımlanmış", alan1)
	cozumler := map[string][]string{
		"kullanici": {
			"Girdiğiniz Değerleri Kontrol Edin. Aynı Olmalı",
			"Sorun Hala devam ediyorsa sistem yöneticinizle iletişime geçiniz",
		},
		"yazilimci": {
			"Girilen parametrelerin aynı olup olmadığını kontrol edin",
			"Gerekirse hata ayıklama modunu kullanın",
			"Sorun hala devam ediyorsa bizimle iletişime geçiniz",
		},
	}

	return &FikoYTHataAyniDegilHatasi{
		FikoYTHata: FikoYTHata{
			Kategori:     &kategori,
			Kod:          &kod,
			Baslik:       &baslik,
			Mesaj:        &mesaj,
			SistemMesaji: &sistemMesaji,
			Cozumler:     cozumler},
	}
}

/**/

type FikoYTHataKullaniciMevcutHatasi struct {
	FikoYTHata
}

func YeniFikoYTHataKullaniciMevcutHatasi(kullaniciAdi string, mesaj1 *string) *FikoYTHataKullaniciMevcutHatasi {
	kategori := "FikoYT Sistem"
	kod := 10010005
	baslik := fmt.Sprintf("%s Hatalı", kullaniciAdi)
	var mesaj string

	if mesaj1 == nil {
		mesaj = fmt.Sprintf("%s Kodlu kullanici Sistemde Zaten Mevcut.", kullaniciAdi)
	} else {
		mesaj = *mesaj1
	}

	sistemMesaji := "Yok"
	cozumler := map[string][]string{
		"kullanici": {
			`Kullanıcı Adını Değiştirin`,
			`Sorun Hala devam Ediyorsa Sistem Yöneticinizle İletişime Geçiniz`,
		},
		"yazilimci": {
			`Kullanıcı Adını Değiştirin`,
			`Sorun Hala devam Ediyorsa Bizimle İletişime Geçiniz`,
		},
	}

	return &FikoYTHataKullaniciMevcutHatasi{
		FikoYTHata: FikoYTHata{
			Kategori:     &kategori,
			Kod:          &kod,
			Baslik:       &baslik,
			Mesaj:        &mesaj,
			SistemMesaji: &sistemMesaji,
			Cozumler:     cozumler},
	}
}

/**/

type FikoYTHataEPostaMevcutHatasi struct {
	FikoYTHata
}

func YeniFikoYTHataEPostaMevcutHatasi(ePostaAdresi string, mesaj1 *string) *FikoYTHataEPostaMevcutHatasi {
	kategori := "FikoYT Sistem"
	kod := 10010005
	baslik := "E-Posta Daha Önce Kullanılmış"
	var mesaj string

	if mesaj1 == nil {
		mesaj = fmt.Sprintf("%s Adresi Daha Önce Bir Hesapla İlişkilendirilmiş.", ePostaAdresi)
	} else {
		mesaj = *mesaj1
	}

	sistemMesaji := "Yok"
	cozumler := map[string][]string{
		"kullanici": {
			`Yeni Bir E-Posta Adresi Girin`,
			`Sisteme Daha Önceden Üye Olduysanız Şifrenizi Sıfırlayınız`,
			`Sorun Hala devam Ediyorsa Sistem Yöneticinizle İletişime Geçiniz`,
		},
		"yazilimci": {
			`Yeni Bir E-Posta Adresi Girin`,
			`Sisteme Daha Önceden Üye Olduysanız Şifrenizi Sıfırlayınız`,
			`Sorun Hala devam Ediyorsa Bizimle İletişime Geçiniz`,
		},
	}

	return &FikoYTHataEPostaMevcutHatasi{
		FikoYTHata: FikoYTHata{
			Kategori:     &kategori,
			Kod:          &kod,
			Baslik:       &baslik,
			Mesaj:        &mesaj,
			SistemMesaji: &sistemMesaji,
			Cozumler:     cozumler},
	}
}
