using Supabase;
using Supabase.Postgrest.Attributes;
using Supabase.Postgrest.Models;
using Supabase.Postgrest.Responses;
using Supabase.Realtime;
using System.ComponentModel;
using System.Reflection;


namespace TestProject1
{
    [TestClass]
    public class UnitTest1
    {
        static string url = "https://mkrrkgiaewskfaslstgx.supabase.co";
        static string key = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Im1rcnJrZ2lhZXdza2Zhc2xzdGd4Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3MjkxNjExMDYsImV4cCI6MjA0NDczNzEwNn0.G6-C-LDzQBTuNAOcE83gZIjWUTiDpYWYa1Rjp4M5Kx0";
        static Supabase.SupabaseOptions options = new Supabase.SupabaseOptions
        {
            AutoConnectRealtime = true
        };
        Supabase.Client supabase = new Supabase.Client(url, key, options);
        public async void Initialize()
        {
            await supabase.InitializeAsync();
        }
        public async Task<ModeledResponse<Label>> Get()
        {
            return await supabase.From<Label>().Get();
        }
        public async Task<ModeledResponse<Age_rating>> Get1()
        {
            return await supabase.From<Age_rating>().Get();
        }
        public async Task<ModeledResponse<Company>> Get2()
        {
            return await supabase.From<Company>().Get();
        }
        public async Task<ModeledResponse<Game>> Get3()
        {
            return await supabase.From<Game>().Get();
        }
        [TestMethod] //Проверка на то, что таблица labels возвращает значения
        public void TestLabels()
        {
            Initialize();
            Task<ModeledResponse<Label>> result = Get();
            result.Wait();
            var labels = result.Result.Models;
            Assert.IsNotNull(labels);
        }

        [TestMethod] //Проверка на то, что таблица возрастных рейтингов не пуста 
        public void TestRatingNotEmpty()
        {
            Initialize();
            Task<ModeledResponse<Age_rating>> result = Get1();
            result.Wait();
            var Age_rating = result.Result.Models;
            Assert.IsTrue(Age_rating.Count > 0, "Рейтинг должен быть не пустым.");
        }

        [TestMethod] //Проверка уникальных идентификаторов в таблице компаний
        public void TestCompanyHaveUniqueIds()
        {
            Initialize();
            Task<ModeledResponse<Company>> result = Get2();
            result.Wait();
            var Company = result.Result.Models;
            var uniqueIds = new HashSet<int>(Company.Select(l => l.Id));
            Assert.AreEqual(uniqueIds.Count, Company.Count, "Компании должны иметь уникальный идентификатор");
        }

        [TestMethod]
        public async Task TestInsertGame() //Тест вставки данных в таблицу игр
        {
            var game = new Game
            {
                Id = 15,
                Name = "Test Game", 
                Desc = "This is a test game description.",
                Company = 1, 
                Picture = "test_picture_url",
                Views = 0, 
                Fav = 0, 
                Age = 1,
                Ofi = "https://official-link.com", 
                Tor = "https://torrent-link.com" 
            };

            var result = await supabase.From<Game>().Insert(game);
            Assert.IsNotNull(result.Models);
            Assert.IsTrue(result.Models.Count > 0, "Запись не вставлена");
        }

        [TestMethod]
        public void TestGame() //Тест выбора данных из таблицы игр
        {
            Initialize();
            Task<ModeledResponse<Game>> result = Get3();
            result.Wait();
            var Game = result.Result.Models;
            Assert.IsNotNull(Game);
        }

        [TestMethod] //Проверяет, что в метках возвращается 20 строк
        public void TestGetLabels_ReturnsTwentyRows()
        {
            Initialize(); 
            Task<ModeledResponse<Label>> result = Get(); 
            result.Wait();
            var labels = result.Result.Models; 
            Assert.IsNotNull(labels); 
            Assert.AreEqual(20, labels.Count); 
        }

        [TestMethod] //Проверяет, что в коллекции нет пустых значений
        public void TestLabelsContainNoNulls()
        {
            Initialize();
            Task<ModeledResponse<Label>> result = Get();
            result.Wait();
            var labels = result.Result.Models;
            Assert.IsFalse(labels.Contains(null), "Метки не должны содержать пустых значений.");
        }

        [TestMethod]
        public void TestCompany() //Тест выбора данных из таблицы компании
        {
            Initialize();
            Task<ModeledResponse<Company>> result = Get2();
            result.Wait();
            var Company = result.Result.Models;
            Assert.IsNotNull(Company);
        }

        [TestMethod] //Тест что строка со 2id в компании является Riot Games 
        public void TestCompanyHaveRow()
        {
            Initialize();
            Task<ModeledResponse<Company>> result = Get2();
            result.Wait();
            var company = result.Result.Models;

            var companyy = company.FirstOrDefault(s => s.Id == 2);
            Assert.IsNotNull(company);

            Assert.AreEqual("Riot Games", companyy.name);
        }

        [TestMethod] //Проверка уникальных идентификаторов в таблице меток
        public void TestLabelHaveUniqueIds()
        {
            Initialize();
            Task<ModeledResponse<Label>> result = Get();
            result.Wait();
            var labels = result.Result.Models;
            var uniqueIds = new HashSet<int>(labels.Select(l => l.ID));
            Assert.AreEqual(uniqueIds.Count, labels.Count, "Метки должны иметь уникальный идентификатор");
        }
    }

}