/*
 * This is the source code of Telegram for Android v. 3.x.x.
 * It is licensed under GNU GPL v. 2 or later.
 * You should have received a copy of the license in this archive (see LICENSE).
 *
 * Copyright Nikolai Kudashov, 2013-2017.
 */

package org.telegram.ui.Adapters;

import android.content.Context;
import android.content.SharedPreferences;
import android.support.annotation.NonNull;
import android.view.View;
import android.view.ViewGroup;
import org.telegram.messenger.AndroidUtilities;
import org.telegram.messenger.LocaleController;
import org.telegram.messenger.MessagesController;
import in.teleplus.R;
import org.telegram.messenger.UserConfig;
import org.telegram.messenger.support.widget.RecyclerView;
import org.telegram.ui.ActionBar.Theme;
import org.telegram.ui.Cells.DrawerActionCell;
import org.telegram.ui.Cells.DividerCell;
import org.telegram.ui.Cells.DrawerAddCell;
import org.telegram.ui.Cells.DrawerUserCell;
import org.telegram.ui.Cells.EmptyCell;
import org.telegram.ui.Cells.DrawerProfileCell;
import org.telegram.ui.Components.RecyclerListView;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Locale;

public class DrawerLayoutAdapter extends RecyclerListView.SelectionAdapter
{
    private class Item
    {
        public final int id;
        public final String text;
        public final int icon;


        public Item(int id, String text, int icon)
        {
            this.id = id;
            this.text = text;
            this.icon = icon;
        }

        public void bind(DrawerActionCell actionCell)
        {
            actionCell.setTextAndIcon(text, icon);
        }
    }

    private Context mContext;
    private DrawerProfileCell profileCell;
    private ArrayList<Integer> accountNumbers = new ArrayList<>();
    private ArrayList<Item> items = new ArrayList<>(11);
    private boolean accountsShowed;


    public DrawerLayoutAdapter(Context context)
    {
        mContext = context;
        accountsShowed = UserConfig.getActivatedAccountsCount() > 1 && MessagesController.getGlobalMainSettings().getBoolean("accountsShowed", true);
        Theme.createDialogsResources(context);
        resetItems();
    }

    public int getAccountsCount()
    {
        return accountNumbers.size();
    }

    public int getAccountRowsCount()
    {
        int count = accountNumbers.size() + 1;
        if (accountNumbers.size() < UserConfig.MAX_ACCOUNT_COUNT)
            count++;

        return count;
    }

    @Override
    public int getItemCount()
    {
        int count = items.size() + 2;
        if (accountsShowed)
            count += getAccountRowsCount();

        return count;
    }

    public void setAccountsShowed(boolean value, boolean animated)
    {
        if (accountsShowed == value)
            return;

        accountsShowed = value;
        if (profileCell != null)
            profileCell.setAccountsShowed(accountsShowed);

        MessagesController.getGlobalMainSettings().edit().putBoolean("accountsShowed", accountsShowed).apply();
        if (animated)
        {
            if (accountsShowed)
                notifyItemRangeInserted(2, getAccountRowsCount());
            else
                notifyItemRangeRemoved(2, getAccountRowsCount());
        }
        else
            notifyDataSetChanged();
    }

    public boolean isAccountsShowed()
    {
        return accountsShowed;
    }

    @Override
    public void notifyDataSetChanged()
    {
        resetItems();
        super.notifyDataSetChanged();
    }

    @Override
    public boolean isEnabled(RecyclerView.ViewHolder holder)
    {
        int itemType = holder.getItemViewType();
        return itemType == 3 || itemType == 4 || itemType == 5;
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType)
    {
        View view;
        switch (viewType)
        {
            case 0:
                profileCell = new DrawerProfileCell(mContext);
                profileCell.setOnArrowClickListener(v ->
                {
                    DrawerProfileCell drawerProfileCell = (DrawerProfileCell) v;
                    setAccountsShowed(drawerProfileCell.isAccountsShowed(), true);
                });
                view = profileCell;
                break;
            case 1:
            default:
                view = new EmptyCell(mContext, AndroidUtilities.dp(8));
                break;
            case 2:
                view = new DividerCell(mContext);
                break;
            case 3:
                view = new DrawerActionCell(mContext);
                break;
            case 4:
                view = new DrawerUserCell(mContext);
                break;
            case 5:
                view = new DrawerAddCell(mContext);
                break;
        }
        view.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
        return new RecyclerListView.Holder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position)
    {
        switch (holder.getItemViewType())
        {
            case 0:
            {
                ((DrawerProfileCell) holder.itemView).setUser(MessagesController.getInstance(UserConfig.selectedAccount).
                        getUser(UserConfig.getInstance(UserConfig.selectedAccount).getClientUserId()), accountsShowed);
                holder.itemView.setBackgroundColor(Theme.getColor(Theme.key_avatar_backgroundActionBarBlue));
                break;
            }
            case 3:
            {
                position -= 2;
                if (accountsShowed)
                {
                    position -= getAccountRowsCount();
                }
                DrawerActionCell drawerActionCell = (DrawerActionCell) holder.itemView;
                items.get(position).bind(drawerActionCell);
                drawerActionCell.setPadding(0, 0, 0, 0);
                break;
            }
            case 4:
            {
                DrawerUserCell drawerUserCell = (DrawerUserCell) holder.itemView;
                drawerUserCell.setAccount(accountNumbers.get(position - 2));
                break;
            }
        }
    }

    @Override
    public int getItemViewType(int i)
    {
        if (i == 0)
            return 0;

        else if (i == 1)
            return 1;

        i -= 2;

        if (accountsShowed)
        {
            if (i < accountNumbers.size())
                return 4;
            else
            {
                if (accountNumbers.size() < UserConfig.MAX_ACCOUNT_COUNT)
                {
                    if (i == accountNumbers.size())
                        return 5;
                    else if (i == accountNumbers.size() + 1)
                        return 2;
                }
                else
                {
                    if (i == accountNumbers.size())
                        return 2;
                }
            }

            i -= getAccountRowsCount();
        }

        if (i == 3)
            return 2;

        return 3;
    }

    private void resetItems()
    {
        accountNumbers.clear();
        SharedPreferences.Editor editor = MessagesController.getGlobalMainSettings().edit();
        for (int a = 0; a < UserConfig.MAX_ACCOUNT_COUNT; a++)
        {
            if (UserConfig.getInstance(a).isClientActivated())
                accountNumbers.add(a);
            else
                editor.remove(String.format(Locale.US, "account_pos_%d", a));
        }
        editor.apply();
        Collections.sort(accountNumbers, (o1, o2) ->
        {
            long l1 = MessagesController.getGlobalMainSettings().getLong(String.format(Locale.US, "account_pos_%d", o1), UserConfig.getInstance(o1).loginTime);
            long l2 = MessagesController.getGlobalMainSettings().getLong(String.format(Locale.US, "account_pos_%d", o2), UserConfig.getInstance(o2).loginTime);
            if (l1 > l2)
                return 1;
            else if (l1 < l2)
                return -1;

            return 0;
        });
        items.clear();

        if (!UserConfig.getInstance(UserConfig.selectedAccount).isClientActivated())
            return;

        items.add(new Item(2, LocaleController.getString("NewGroup", R.string.NewGroup), R.drawable.menu_newgroup));
        items.add(new Item(3, LocaleController.getString("NewSecretChat", R.string.NewSecretChat), R.drawable.menu_secret));
        items.add(new Item(4, LocaleController.getString("NewChannel", R.string.NewChannel), R.drawable.menu_broadcast));
        items.add(null); // divider

        items.add(new Item(6, LocaleController.getString("Contacts", R.string.Contacts), R.drawable.menu_contacts));
        items.add(new Item(7, LocaleController.getString("SavedMessages", R.string.SavedMessages), R.drawable.menu_saved));
        items.add(new Item(8, LocaleController.getString("Calls", R.string.Calls), R.drawable.menu_calls));

        items.add(new Item(9, LocaleController.getString("Settings", R.string.Settings), R.drawable.menu_settings));
        items.add(new Item(10, LocaleController.getString("FeaturedSettings", R.string.FeaturedSettings), R.drawable.ic_featured_settings));
        items.add(new Item(11, LocaleController.getString("ProxySettings", R.string.ProxySettings), R.drawable.proxy_on));

        items.add(new Item(12, LocaleController.getString("InviteFriends", R.string.InviteFriends), R.drawable.menu_invite));
        items.add(new Item(13, LocaleController.getString("TelegramFAQ", R.string.TelegramFAQ), R.drawable.menu_help));
    }

    public int getId(int position)
    {
        position -= 2;
        if (accountsShowed)
            position -= getAccountRowsCount();

        if (position < 0 || position >= items.size())
            return -1;

        Item item = items.get(position);

        return item != null ? item.id : -1;
    }

    public void swapAccountPosition(int currentAdapterPosition, int targetAdapterPosition)
    {
        int currentIndex = currentAdapterPosition - 2;
        int targetIndex = targetAdapterPosition - 2;
        int currentElement = accountNumbers.get(currentIndex);
        int targetElement = accountNumbers.get(targetIndex);
        accountNumbers.set(targetIndex, currentElement);
        accountNumbers.set(currentIndex, targetElement);
        MessagesController.getGlobalMainSettings().edit().
                putLong(String.format(Locale.US, "account_pos_%d", currentElement), targetIndex).
                putLong(String.format(Locale.US, "account_pos_%d", targetElement), currentIndex)
                .apply();
        notifyItemMoved(currentAdapterPosition, targetAdapterPosition);
    }
}