package telegram

//
// import (
// 	"context"
// 	"errors"
// 	"fmt"
// 	"path/filepath"
// 	"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/dal"
// 	"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/model"
// 	"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/pj_errors"
// 	"penahub.gitlab.yandexcloud.net/backend/tdlib/client"
// 	"sync"
// 	"time"
// )
//
// type TelegramClient struct {
// 	repo           *dal.DAL
// 	TgClients      map[int64]*client.Client
// 	WaitingClients map[string]WaitingClient
// 	mu             sync.Mutex
// }
//
// type WaitingClient struct {
// 	PreviousReq AuthTgUserReq
// 	Authorizer  *client.ClientAuthorizer
// }
//
// func NewTelegramClient(ctx context.Context, repo *dal.DAL) (*TelegramClient, error) {
// 	tgClient := &TelegramClient{
// 		repo:           repo,
// 		TgClients:      make(map[int64]*client.Client),
// 		WaitingClients: make(map[string]WaitingClient),
// 	}
//
// 	allTgAccounts, err := repo.TgRepo.GetAllTgAccounts(ctx)
// 	if err != nil {
// 		if errors.Is(err, pj_errors.ErrNotFound) {
// 			return tgClient, nil
// 		}
// 		return nil, err
// 	}
//
// 	for _, account := range allTgAccounts {
// 		if account.Status == model.ActiveTg {
// 			authorizer := client.ClientAuthorizerr()
// 			authorizer.TdlibParameters <- &client.SetTdlibParametersRequest{
// 				UseTestDc:           false,
// 				DatabaseDirectory:   filepath.Join(".tdlib", "database"),
// 				FilesDirectory:      filepath.Join(".tdlib", "files"),
// 				UseFileDatabase:     true,
// 				UseChatInfoDatabase: true,
// 				UseMessageDatabase:  true,
// 				UseSecretChats:      true,
// 				ApiId:               account.ApiID,
// 				ApiHash:             account.ApiHash,
// 				SystemLanguageCode:  "en",
// 				DeviceModel:         "Server",
// 				SystemVersion:       "1.0.0",
// 				ApplicationVersion:  "1.0.0",
// 			}
//
// 			_, err := client.SetLogVerbosityLevel(&client.SetLogVerbosityLevelRequest{
// 				NewVerbosityLevel: 1,
// 			})
// 			if err != nil {
// 				return nil, err
// 			}
//
// 			var tdlibClient *client.Client
// 			var goErr error
// 			go func() {
// 				tdlibClient, goErr = client.NewClient(authorizer)
// 				if goErr != nil {
// 					fmt.Println("new client failed", err)
// 					return
// 				}
// 				fmt.Println("i am down")
// 			}()
// 			if goErr != nil {
// 				return nil, goErr
// 			}
//
// 			for {
// 				state, ok := <-authorizer.State
// 				if !ok {
// 					break
// 				}
// 				fmt.Println("currnet state:", state)
// 				switch state.AuthorizationStateType() {
// 				case client.TypeAuthorizationStateWaitPhoneNumber:
// 					authorizer.PhoneNumber <- account.PhoneNumber
// 				case client.TypeAuthorizationStateWaitCode:
// 					err := tgClient.repo.TgRepo.UpdateStatusTg(ctx, account.ID, model.InactiveTg)
// 					if err != nil {
// 						return nil, err
// 					}
// 				case client.TypeAuthorizationStateLoggingOut, client.TypeAuthorizationStateClosing, client.TypeAuthorizationStateClosed:
// 					err := tgClient.repo.TgRepo.UpdateStatusTg(ctx, account.ID, model.InactiveTg)
// 					if err != nil {
// 						return nil, err
// 					}
// 				case client.TypeAuthorizationStateReady:
// 					// костыль так как в либе тож костыль стоит пока там ьд обновиться будет ниловый всегда клиент
// 					time.Sleep(3 * time.Second)
// 					me, err := tdlibClient.GetMe()
// 					if err != nil {
// 						return nil, err
// 					}
// 					fmt.Printf("Me: %s %s [%v]", me.FirstName, me.LastName, me.Usernames)
// 					tgClient.mu.Lock()
// 					tgClient.TgClients[account.ID] = tdlibClient
// 					tgClient.mu.Unlock()
// 					break
// 				case client.TypeAuthorizationStateWaitPassword:
// 					authorizer.Password <- account.Password
// 				}
// 			}
// 		}
// 	}
// 	return tgClient, nil
// }
//
//type AuthTgUserReq struct {
//	ApiID       int32  `json:"api_id"`
//	ApiHash     string `json:"api_hash"`
//	PhoneNumber string `json:"phone_number"`
//	Password    string `json:"password"`
//}
//
// func (tg *TelegramClient) AddedToMap(data WaitingClient, id string) {
// 	fmt.Println("AddedToMap")
// 	tg.mu.Lock()
// 	defer tg.mu.Unlock()
// 	tg.WaitingClients[id] = data
// }
//
// func (tg *TelegramClient) GetFromMap(id string) (WaitingClient, bool) {
// 	fmt.Println("GetFromMap")
// 	tg.mu.Lock()
// 	defer tg.mu.Unlock()
// 	if data, ok := tg.WaitingClients[id]; ok {
// 		delete(tg.WaitingClients, id)
// 		return data, true
// 	}
// 	return WaitingClient{}, false
// }
//
// func (tg *TelegramClient) SaveTgAccount(appID int32, appHash string, tdLibClient *client.Client) {
// 	account, err := tg.repo.TgRepo.SearchIDByAppIDanAppHash(context.Background(), appID, appHash)
// 	if err != nil {
// 		fmt.Println("err SaveTgAccount", err)
// 		return
// 	}
// 	if account.Status == model.ActiveTg {
// 		tg.mu.Lock()
// 		defer tg.mu.Unlock()
// 		tg.TgClients[account.ID] = tdLibClient
// 	}
// }
//
// func (tg *TelegramClient) CreateChannel(channelName string, botID int64) (string, int64, error) {
// 	tg.mu.Lock()
// 	defer tg.mu.Unlock()
// 	if len(tg.TgClients) == 0 {
// 		return "", 0, errors.New("no active Telegram clients")
// 	}
// 	var lastError error
// 	var inviteLink string
// 	var channelId int64
// 	for _, activeClient := range tg.TgClients {
// 		// todo пока не понимаю это какой то рандом? в один день бот норм находится в другой уже не находится хотя абсолютно с точки зрения тг кода этой функции и бота не менялось
// 		_, err := activeClient.GetUser(&client.GetUserRequest{
// 			UserId: botID,
// 		})
// 		if err != nil {
// 			lastError = fmt.Errorf("not found this bot, make privacy off: %v", err)
// 			continue
// 		}
//
// 		// todo нужно поймать ошибку, при которой либо бан либо медленный редим включается для того чтобы прервать
// 		// исполнение клиента текущего аккаунта и дать задачу следующему пока поймал 1 раз и не запомнил больше не получается
// 		channel, err := activeClient.CreateNewSupergroupChat(&client.CreateNewSupergroupChatRequest{
// 			Title:       channelName,
// 			IsChannel:   true,
// 			Description: "private channel",
// 		})
// 		if err != nil {
// 			lastError = fmt.Errorf("failed to create channel: %s", err.Error())
// 			continue
// 		}
//
// 		_, err = activeClient.SetChatMemberStatus(&client.SetChatMemberStatusRequest{
// 			ChatId:   channel.Id,
// 			MemberId: &client.MessageSenderUser{UserId: botID},
// 			Status: &client.ChatMemberStatusAdministrator{
// 				CustomTitle: "bot",
// 				Rights: &client.ChatAdministratorRights{
// 					CanManageChat:       true,
// 					CanChangeInfo:       true,
// 					CanPostMessages:     true,
// 					CanEditMessages:     true,
// 					CanDeleteMessages:   true,
// 					CanInviteUsers:      true,
// 					CanRestrictMembers:  true,
// 					CanPinMessages:      true,
// 					CanManageTopics:     true,
// 					CanPromoteMembers:   true,
// 					CanManageVideoChats: true,
// 					CanPostStories:      true,
// 					CanEditStories:      true,
// 					CanDeleteStories:    true,
// 				},
// 			},
// 		})
// 		if err != nil {
// 			lastError = fmt.Errorf("failed to make bot admin: %s", err.Error())
// 			continue
// 		}
//
// 		inviteLinkResp, err := activeClient.CreateChatInviteLink(&client.CreateChatInviteLinkRequest{
// 			ChatId:             channel.Id,
// 			Name:               channelName,
// 			ExpirationDate:     0,
// 			MemberLimit:        0,
// 			CreatesJoinRequest: false,
// 		})
// 		if err != nil {
// 			lastError = fmt.Errorf("failed to get invite link: %s", err.Error())
// 			continue
// 		}
//
// 		_, err = activeClient.LeaveChat(&client.LeaveChatRequest{
// 			ChatId: channel.Id,
// 		})
// 		if err != nil {
// 			lastError = fmt.Errorf("failed to leave the channel: %s", err.Error())
// 			continue
// 		}
//
// 		inviteLink = inviteLinkResp.InviteLink
// 		channelId = channel.Id
// 		return inviteLink, channelId, nil
// 	}
//
// 	return "", 0, lastError
// }
