package FikoYTCtx

import (
	"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 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
}

// 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,
		},
	}
}
