/*
         * I vyerna för flaggade och blockade användare vill vi bland annat kunna visa upp namnet på den som flaggat eller blockat en användare.
         * Vi har visserligen ID:t på dessa personer som foreign key i blocked respektive flaggeduser-tabellerna, men vi kan inte använda oss av detta Id för att visa upp ett namn när vi kommunicerar med en klient (hade vi varit i ett lokalt projekt hade det funkat).
         * Vi behöver alltså skicka med ett helt objekt till klienten och därför skapar vi här ett "fejk-objekt", vilket funkar som mellanhand mellan service och klient.
         * Vi skickar således detta fejk-objekt till klienten, vilket innehåller alla uppgifter.
         * Vi skickar alltså separata objekt för blockade och flaggade användare samt för den användare som flaggat respektive blockat.
         */
        IEnumerable <Interface.InterfaceFlaggedUser> ILoginService.GetFlaggedUsers() // ID 2 is a FLAGGED user.
        {
            List <Interface.InterfaceFlaggedUser> returnList = new List <Interface.InterfaceFlaggedUser>();

// Loopa igenom uppgifterna om flaggade användare
            foreach (var dbUser in db.FlaggedUsers)
            {
                Interface.InterfaceUser returUser = new Interface.InterfaceUser();
                Interface.InterfaceUser Flagger   = new Interface.InterfaceUser();


                InterfaceFlaggedUser interfaceflaggeduser = new InterfaceFlaggedUser();
// Det nya objektet får sina värden
                interfaceflaggeduser.ID              = dbUser.ID;
                interfaceflaggeduser.Reason          = dbUser.Reason;
                interfaceflaggeduser.FlaggedByUserId = dbUser.FlaggedBy;
                interfaceflaggeduser.WhoIsFlaggedID  = dbUser.UserID;
                // Objekt för vem som är flaggad
                Users user = (from x in db.Users
                              where x.ID == interfaceflaggeduser.WhoIsFlaggedID
                              select x).FirstOrDefault();

                returUser.StatusID  = user.StatusID;
                returUser.Email     = user.Email;
                returUser.RoleID    = user.RoleID;
                returUser.Username  = user.Username;
                returUser.Firstname = user.Firstname;
                returUser.Surname   = user.Surname;
                returUser.ID        = user.ID;
// WhoIsFlagged tilldelas värdena av returuser och vi kan sedan använda attributet WhoIsFlagged för att kommunicera med klienten
                interfaceflaggeduser.WhoIsFlagged = returUser;

                Users FlaggedBy = (from x in db.Users
                                   where x.ID == interfaceflaggeduser.FlaggedByUserId
                                   select x).FirstOrDefault();
// Objektet flagger får sina värden
                Flagger.Email     = FlaggedBy.Email;
                Flagger.Firstname = FlaggedBy.Firstname;
                Flagger.Surname   = FlaggedBy.Surname;
                Flagger.Username  = FlaggedBy.Username;

// Attributet Flaggedby får värdet av objektet Flagger, vi använder oss sedan av FlaggedBy-attributet i kommunikationen med klienten
                interfaceflaggeduser.FlaggedBy = Flagger;
// Hela FlaggedUser-objektet, inklusive FlaggedBy med de nya värdena, läggs till i listan som sedan returneras
                returnList.Add(interfaceflaggeduser);
            }
            return(returnList);
        }
// Metod för att visa alla aktiva användare, beter sig på samma sätt som metoden ovan
        IEnumerable <Interface.InterfaceUser> ILoginService.GetActiveUsers()
        {
            List <Interface.InterfaceUser> returnList = new List <Interface.InterfaceUser>();

            foreach (var dbUser in db.Users)
            {
                if ((dbUser.StatusID == 1) || (dbUser.StatusID == 2))
                {
                    InterfaceStatus interfaceStatus = new InterfaceStatus();

                    Interface.InterfaceUser returUser = new Interface.InterfaceUser();

                    InterfaceRole interfacerole = new InterfaceRole();

                    returUser.StatusID  = dbUser.StatusID;
                    returUser.Email     = dbUser.Email;
                    returUser.RoleID    = dbUser.RoleID;
                    returUser.Username  = dbUser.Username;
                    returUser.Firstname = dbUser.Firstname;
                    returUser.Surname   = dbUser.Surname;
                    returUser.ID        = dbUser.ID;


                    Status realStatus = (from x in db.Status
                                         where x.ID == returUser.StatusID
                                         select x).FirstOrDefault();

                    interfaceStatus.ID         = realStatus.ID;
                    interfaceStatus.StatusName = realStatus.StatusName;


                    returUser.Status = interfaceStatus;

                    Roles realRole = (from x in db.Roles
                                      where x.ID == returUser.RoleID
                                      select x).FirstOrDefault();

                    interfacerole.ID   = realRole.ID;
                    interfacerole.Role = realRole.Role;

                    returUser.Roles = interfacerole;

                    returnList.Add(returUser);
                }
            }
            return(returnList);
        }
// Objekt för blockade användare, beter sig på samma sätt som ovan
        IEnumerable <Interface.InterfaceBlockedUser> ILoginService.GetBlockedUsers()
        {
            List <Interface.InterfaceBlockedUser> returnList = new List <Interface.InterfaceBlockedUser>();


            foreach (var dbUser in db.BlockedUsers)
            {
                Interface.InterfaceUser returUser            = new Interface.InterfaceUser();
                InterfaceBlockedUser    interfaceblockeduser = new InterfaceBlockedUser();
                InterfaceAdmin          interfaceadmin       = new InterfaceAdmin();

                interfaceblockeduser.ID          = dbUser.ID;
                interfaceblockeduser.Reason      = dbUser.Reason;
                interfaceblockeduser.SuspendedBy = dbUser.SuspendedBy;
                interfaceblockeduser.DateFrom    = dbUser.DateFrom;
                interfaceblockeduser.DateTo      = dbUser.DateTo;
                interfaceblockeduser.UserId      = dbUser.UserID;

                Users user = (from x in db.Users
                              where x.ID == interfaceblockeduser.UserId
                              select x).FirstOrDefault();

                returUser.ID        = user.ID;
                returUser.Username  = user.Username;
                returUser.Firstname = user.Firstname;
                returUser.Surname   = user.Surname;
                returUser.Email     = user.Email;

                Admin admin = (from x in db.Admin
                               where x.ID == interfaceblockeduser.SuspendedBy
                               select x).FirstOrDefault();

                interfaceadmin.ID       = admin.ID;
                interfaceadmin.Username = admin.Username;

                interfaceblockeduser.Banner     = interfaceadmin;
                interfaceblockeduser.UserObject = returUser;

                returnList.Add(interfaceblockeduser);
            }
            return(returnList);
        }
        /*
         * Här är metoden för att visa alla moderatorer.
         * I denna lista vill vi kunna se moderatorns status (aktiv eller blockad).
         * Vi har angett dessa statusar med ett Id i form av en siffra, men i listan vill vi ju i stället kunna visa upp ett status-namn, alltså i text-form.
         * Dessa namn finns i en separat Status-tabell, för vilken vi har en foreign key från Users-tabellen.
         * När vi ska kommunicera mellan service och klient kan vi emellertid inte använda oss av denna nyckel, varför vi skapar ett separat "fejk-objekt", vilket funkar som mellanhand mellan service och klient.
         * Detta objekt tilldelas värdena från så väl Users som Status-tabellen och detta samlade objekt kan vi sedan använda för att visa upp allt vi vill i klienten.
         */
        IEnumerable <Interface.InterfaceUser> ILoginService.GetModerators()
        {
            List <Interface.InterfaceUser> returnList = new List <Interface.InterfaceUser>();

// Loopa igenom uppgifterna i Users-tabellen
            foreach (var dbUser in db.Users)
            {
// Om användarna är moderatorer
                if (dbUser.RoleID == 2)
                {
// Nytt User-objekt som tilldelas värden från Users-tabellen
                    Interface.InterfaceUser returUser = new Interface.InterfaceUser();
                    returUser.ID       = dbUser.ID;
                    returUser.StatusID = dbUser.StatusID;
                    returUser.Email    = dbUser.Email;
                    returUser.RoleID   = dbUser.RoleID;
                    returUser.Username = dbUser.Username;
// Hitta rätt användare i Status-tabellen, där även namnet på statusen finns
                    Status status = (from x in db.Status
                                     where x.ID == returUser.StatusID
                                     select x).FirstOrDefault();
// Nytt Status-objekt med uppgifter från Status-tabellen
                    InterfaceStatus interfacestatus = new InterfaceStatus();

                    interfacestatus.ID         = status.ID;
                    interfacestatus.StatusName = status.StatusName;

/*
 * Här tilldelas attributet Status i returuser-objektet värdet av det nya InterfaceStatus-objektet.
 * Således finns så väl användaruppgifter som statusnamn nu i returuser-bojektet, vilket är det objekt vi sedan använder oss av i kommunikation med klienten.
 */
                    returUser.Status = interfacestatus;

// Lägg till objektet i listan och returnera denna
                    returnList.Add(returUser);
                }
            }
            return(returnList);
        }