package com.nith.appteam.nimbus.Activity;

import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.AppBarLayout;
import android.support.design.widget.BottomNavigationView;
import android.support.design.widget.CollapsingToolbarLayout;

import android.support.design.widget.NavigationView;
import android.support.v4.content.ContextCompat;
import android.support.v4.view.ViewPager;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.widget.Toolbar;
import android.text.Html;
import android.text.SpannableString;
import android.text.style.UnderlineSpan;
import android.text.util.Linkify;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.nith.appteam.nimbus.Adapter.SlidingImageAdapter;
import com.nith.appteam.nimbus.Manifest;
import com.nith.appteam.nimbus.Model.MainPagerResponse;
import com.nith.appteam.nimbus.Model.ProfileDataModel;
import com.nith.appteam.nimbus.Notification.NotificationActivity;
import com.nith.appteam.nimbus.R;
import com.nith.appteam.nimbus.Utils.ApiInterface;
import com.nith.appteam.nimbus.Utils.Connection;
import com.nith.appteam.nimbus.Utils.SharedPref;
import com.nith.appteam.nimbus.Utils.Util;

import java.util.ArrayList;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;


public class MainActivity extends AppCompatActivity {


    private SharedPref sharedPref;
    private BottomNavigationView bottomNavigationView;
    private ViewPager viewPager;
    private SlidingImageAdapter imageAdapter;
    private NavigationView navigationView;
    private DrawerLayout drawer;
    private View navHeader;
    private ImageView imgNavHeaderBg, imgProfile;
    private TextView txtName, txtSubName;
    Toolbar toolbar;
    private LinearLayout quiz_layout, gallery_layout, map_layout, newsfeed_layout, coreteam_layout, aboutnimbus_layout, teams_layout, feedback_layout, sponsor_layout, workshop_layout, contributor_layout;
    final String number[] = {"9816291592", "9882551107"};
    final String links[] = {"https://www.facebook.com/Nit.Hamirpur.Himachal/", "https://github.com/appteam-nith/Nimbus"};
    //public static int navItemIndex = 0;
    private static final int PERMISSIONS_REQUEST_PHONE_CALL = 100;
    private static String[] PERMISSIONS_PHONECALL = {android.Manifest.permission.CALL_PHONE};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        sharedPref = new SharedPref(this);
        if (!sharedPref.getLoginStatus() && !sharedPref.getSkipStatus()) {
            startActivity(new Intent(MainActivity.this, FirebaseLoginActivity.class));
            finish();
        }
        setContentView(R.layout.activity_main);

//        initCollapsingToolbar();
        init();

        Log.v("Checking UserId:", "" + sharedPref.getUserId());

        loadNavHeader();
        setUpNavigationView();
        //Ends here

        //Code to deal with the ViewPager.
        imageAdapter = new SlidingImageAdapter(MainActivity.this);

        if (new Connection(this).isInternet()) {
            getPagerData();
            profileBasicInfo(sharedPref.getUserId());
        }

        viewPager.setAdapter(imageAdapter);
        viewPager.setClipToPadding(false);
        viewPager.setPadding(100, 0, 100, 0);
        viewPager.setPageMargin(60);

        clickListenersMainMenu();

        bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                switch (item.getItemId()) {
                    case R.id.action_home:
                        startActivity(new Intent(MainActivity.this, LeaderBoardActivity.class));
                        return true;
                    case R.id.action_profile:
                        startActivity(new Intent(MainActivity.this, ProfileActivity.class));
                        return true;
                    case R.id.action_notifications:
                        startActivity(new Intent(MainActivity.this, NotificationActivity.class));
                        return true;
                }
                return false;
            }
        });


    }

    public void init() {
        toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        navigationView = (NavigationView) findViewById(R.id.nvView);

        navHeader = navigationView.getHeaderView(0);
        txtName = (TextView) navHeader.findViewById(R.id.name);
        txtSubName = (TextView) navHeader.findViewById(R.id.subname);
        imgNavHeaderBg = (ImageView) navHeader.findViewById(R.id.img_header_bg);
        imgProfile = (ImageView) navHeader.findViewById(R.id.img_profile);

        viewPager = (ViewPager) findViewById(R.id.main_view_pager);

        quiz_layout = (LinearLayout) findViewById(R.id.quiz_layout);
        gallery_layout = (LinearLayout) findViewById(R.id.gallery_layout);
        map_layout = (LinearLayout) findViewById(R.id.map_layout);
        newsfeed_layout = (LinearLayout) findViewById(R.id.newsfeed_layout);
        coreteam_layout = (LinearLayout) findViewById(R.id.coreteam_layout);
        aboutnimbus_layout = (LinearLayout) findViewById(R.id.aboutnimbus_layout);
        teams_layout = (LinearLayout) findViewById(R.id.teams_layout);
        feedback_layout = (LinearLayout) findViewById(R.id.feedback_layout);
        contributor_layout = (LinearLayout) findViewById(R.id.contributor_layout);
        sponsor_layout = (LinearLayout) findViewById(R.id.sponsor_layout);
        workshop_layout = (LinearLayout) findViewById(R.id.workshop_layout);
        bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottom_navigation);

    }

    public void clickListenersMainMenu() {
        quiz_layout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this, QuizActivity.class));
            }
        });

        gallery_layout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this, GalleryActivity.class));
            }
        });

        map_layout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this, MapActivity.class));
            }
        });

        newsfeed_layout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this, WallIntroActivity.class));
            }
        });

        coreteam_layout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this, CoreTeamActivity.class));
            }
        });

        aboutnimbus_layout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this, AboutActivity.class));
            }
        });

        teams_layout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this, TeamActivity.class));
            }
        });

        feedback_layout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(Intent.ACTION_SENDTO);
                String uriText = "mailto:" + Uri.encode("[email protected]") + "?subject=" + Uri.encode("Reporting A Bug/Feedback") + "&body=" + Uri.encode("Hello, \nI want to report a bug/give feedback corresponding to the app Nimbus App.\n.....\n\n-Your name");
                Uri uri = Uri.parse(uriText);
                intent.setData(uri);
                startActivity(Intent.createChooser(intent, "Send Email"));
            }
        });

        workshop_layout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this, Workshops.class));
            }
        });

        sponsor_layout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this, SponsorActivity.class));
            }
        });

        contributor_layout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this, ContributorsActivity.class));
            }
        });

    }

//    private void initCollapsingToolbar() {
//        final CollapsingToolbarLayout collapsingToolbar =
//                (CollapsingToolbarLayout) findViewById(R.id.collapsing_toolbar);
//        collapsingToolbar.setTitle(" ");
//        AppBarLayout appBarLayout = (AppBarLayout) findViewById(R.id.appbar);
//        appBarLayout.setExpanded(true);
//
//        // hiding & showing the title when toolbar expanded & collapsed
//        appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
//            boolean isShow = false;
//            int scrollRange = -1;
//
//            @Override
//            public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
//                if (scrollRange == -1) {
//                    scrollRange = appBarLayout.getTotalScrollRange();
//                }
//                if (scrollRange + verticalOffset == 0) {
//                    collapsingToolbar.setTitle(getString(R.string.app_name));
//                    isShow = true;
//                } else if (isShow) {
//                    collapsingToolbar.setTitle(" ");
//                    isShow = false;
//                }
//            }
//        });
//    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        if (sharedPref.getLoginStatus())
            getMenuInflater().inflate(R.menu.main_rightmenu, menu);
        else
            getMenuInflater().inflate(R.menu.main_skipmenu, menu);
        return super.onCreateOptionsMenu(menu);
    }

    private void loadNavHeader() {
        txtName.setText("Nimbus 2k18");
        txtSubName.setText("NIT Hamirpur");
        imgNavHeaderBg.setImageResource(R.drawable.cover);
        imgProfile.setImageResource(R.drawable.nimbuslogo);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.action_logout) {
            sharedPref.setUserId("");
            sharedPref.setLoginStatus(false);
            sharedPref.setUserRollno("");
            sharedPref.setUserEmail("");
            sharedPref.setUserPicUrl("");
            sharedPref.setUserName("");
            sharedPref.setProfileStatus(false);
            sharedPref.setUserYearPos("");
            sharedPref.setUserYearText("");
            sharedPref.setUserBranch("");
            // Logout
            Intent intent = new Intent(MainActivity.this, FirebaseLoginActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
            startActivity(intent);
            finish();
            return true;
        }
        return super.onOptionsItemSelected(item);
    }


    private void setUpNavigationView() {


        navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(MenuItem menuItem) {

                switch (menuItem.getItemId()) {
                    case R.id.nav_aboutapp:
                        AlertDialog.Builder alertDialog = new AlertDialog.Builder(MainActivity.this);
                        alertDialog.setTitle("About App");

                        alertDialog.setMessage("\nThe Official Android App for 'Nimbus 2k18', the Annual Technical Fest of NIT Hamirpur developed by App Team-NITH\n\n");
                        alertDialog.setIcon(R.drawable.nimbuslogo);
                        alertDialog.show();
                        drawer.closeDrawers();
                        return true;
                    case R.id.nav_team:
                        startActivity(new Intent(MainActivity.this, ContributorsActivity.class));
                        drawer.closeDrawers();
                        return true;
                    case R.id.nav_contactus:
                        AlertDialog.Builder alertDialog2 = new AlertDialog.Builder(MainActivity.this);
                        alertDialog2.setTitle("Contact : App Team-NITH");
                        String link1 = getString(R.string.Link1);
                        String link2 = getString(R.string.Link2);
                        String link3 = getString(R.string.Link3);
                        CharSequence[] contact = {link1 + "\n", " Like our Facebook Page : \n" + link2 + "\n", " GitHub Organisation :" + link3};

                        alertDialog2.setItems(contact, new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                call_contact(which);
                            }
                        });
                        alertDialog2.setIcon(R.drawable.appteam);
                        alertDialog2.show();
                        drawer.closeDrawers();
                        return true;
                    case R.id.nav_reportbug:
                        Intent intent = new Intent(Intent.ACTION_SENDTO);

                        String uriText = "mailto:" + Uri.encode("[email protected]") + "?subject=" + Uri.encode("Reporting A Bug/Feedback") + "&body=" + Uri.encode("Hello, \nI want to report a bug/give feedback corresponding to the app Nimbus App.\n.....\n\n-Your name");
                        Uri uri = Uri.parse(uriText);
                        intent.setData(uri);
                        startActivity(Intent.createChooser(intent, "Send Email"));
                        drawer.closeDrawers();
                        return true;
                    case R.id.nav_emergencycontact:
                        AlertDialog.Builder alertDialog3 = new AlertDialog.Builder(MainActivity.this);

                        alertDialog3.setTitle("Phone Number\n\n");

                        CharSequence name[] = {"Abhinav Anand: 9816291592", "Pranav Bhardwaj: 9882551107"};

                        alertDialog3.setItems(name, new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface di, int i) {

                                call(i);
                            }
                        });


                        alertDialog3.show();
                        drawer.closeDrawers();
                        return true;

                    default:
                        //navItemIndex = 0;
                }

                //Checking if the item is in checked state or not, if not make it in checked state
                if (menuItem.isChecked()) {
                    menuItem.setChecked(false);
                }

                //loadHomeFragment();

                return true;
            }
        });
        ActionBarDrawerToggle actionBarDrawerToggle = new ActionBarDrawerToggle(MainActivity.this, drawer, toolbar, R.string.openDrawer, R.string.closeDrawer) {
            @Override
            public void onDrawerClosed(View drawerView) {
                super.onDrawerClosed(drawerView);
            }

            @Override
            public void onDrawerOpened(View drawerView) {
                super.onDrawerOpened(drawerView);
            }
        };
        drawer.setDrawerListener(actionBarDrawerToggle);
        actionBarDrawerToggle.setDrawerIndicatorEnabled(true);
        actionBarDrawerToggle.syncState();
    }


    private void getPagerData() {
        Call<MainPagerResponse> response = Util.getRetrofitService().getMainResponse();
        response.enqueue(new Callback<MainPagerResponse>() {
            @Override
            public void onResponse(Call<MainPagerResponse> call, Response<MainPagerResponse> response) {
                MainPagerResponse mainPagerResponse = response.body();
                if (response != null && response.isSuccess()) {
                    ArrayList<String> list = mainPagerResponse.getImageList();
                    imageAdapter.refresh(list);
                }
            }

            @Override
            public void onFailure(Call<MainPagerResponse> call, Throwable t) {

            }
        });
    }

    private void profileBasicInfo(String id) {

        ApiInterface mAPI = Util.getRetrofitService();
        Call<ProfileDataModel> mService = mAPI.profileBasicInfo(id);

        mService.enqueue(new Callback<ProfileDataModel>() {
            @Override
            public void onResponse(Call<ProfileDataModel> call, Response<ProfileDataModel> response) {
                if (response != null && response.isSuccess()) {
                    if (response.body().isSuccess()) {
                        ProfileDataModel model = response.body();
                        //For Testing
                        Log.v("RESPONSE SUCCESS", " " + model.getRollno() + " " + model.getName() + " " + model.getEmail() + " " + model.getPhoto());

                        if (model != null) {

                            sharedPref.setUserName(model.getName());
                            sharedPref.setUserEmail(model.getEmail());
                            sharedPref.setUserRollno(model.getRollno());
                            sharedPref.setUserPicUrl(model.getPhoto());
                        }
                    }
                }
            }

            @Override
            public void onFailure(Call<ProfileDataModel> call, Throwable t) {
                t.printStackTrace();

            }
        });
    }


    private void call(int i) {
        String phone;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && checkSelfPermission(android.Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
            requestPermissions(new String[]{android.Manifest.permission.CALL_PHONE}, PERMISSIONS_REQUEST_PHONE_CALL);
        } else {
            phone = number[i];
            Intent intent = new Intent(Intent.ACTION_CALL);
            intent.setData(Uri.parse("tel:+91" + phone));
            startActivity(intent);
        }

    }

    private void call_contact(int i) {
        String uri1;
        if (i == 0) {
            Intent intent = new Intent(Intent.ACTION_SENDTO);
            String uriText = "mailto:" + Uri.encode("[email protected]");
            Uri uri = Uri.parse(uriText);
            intent.setData(uri);
            startActivity(intent);

        } else {
            uri1 = links[i - 1];
            Intent intent = new Intent();
            intent.setAction(Intent.ACTION_VIEW);
            intent.addCategory(Intent.CATEGORY_BROWSABLE);
            intent.setData(Uri.parse(uri1));
            startActivity(intent);
        }
    }
}