package com.id.drapp;

import android.annotation.SuppressLint;
import android.content.CursorLoader;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.app.LoaderManager;
import android.database.Cursor;
import android.content.Loader;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.Query;
import com.google.firebase.database.ValueEventListener;
import com.google.firebase.storage.FirebaseStorage;
import com.google.firebase.storage.StorageReference;
import com.id.drapp.doctorContract.patientEntry;

public class detailActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Cursor>{

    public static final int DETAIL_LOADER = 1;
    public String patientUri;

    private TextView detailName;
    private TextView detailPhone;
    private TextView detailEmail;
    private TextView detailCalendar;
    private TextView detailLocation;
    private TextView detailGender;
    private Button detailDelete;
    private ImageView patientpic;

    private FirebaseDatabase mFirebaseDatabase;
    private DatabaseReference mDatabaseReference;
    private FirebaseStorage mFirebaseStorage;
    private StorageReference mStorageReference;

    private static String user;
    private static String doctorPushId;

    private byte[] bmpByte;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_detail);
        setTitle("Patient Detail");

        detailName = findViewById(R.id.detailName);
        detailPhone = findViewById(R.id.detailPhone);
        detailEmail = findViewById(R.id.detailEmail);
        detailCalendar = findViewById(R.id.detailCalendar);
        detailLocation = findViewById(R.id.detailLocation);
        detailGender = findViewById(R.id.detailGender);
        detailDelete = findViewById(R.id.detailDelete);
        patientpic = findViewById(R.id.patientpic);

        detailDelete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String id = Uri.parse(patientUri).getPathSegments().get(2);
                int rowAffected = getContentResolver().delete(Uri.parse(patientUri),null, null);
                if(rowAffected == 0){
                    Toast.makeText(detailActivity.this,"Deletion Failed", Toast.LENGTH_LONG).show();
                }
                else{
                    deleteFromFirebase(id);
                    Toast.makeText(detailActivity.this, "Deletion Successful", Toast.LENGTH_LONG).show();
                }
                finish();
            }
        });

        patientUri = getIntent().getStringExtra("detailUri");

        getLoaderManager().initLoader(DETAIL_LOADER, null, this);

        user = doctorPreference.getUsernameFromSP(this);
        doctorPushId = doctorPreference.getUserPushId(this);

        mFirebaseDatabase = FirebaseDatabase.getInstance();
        mDatabaseReference = mFirebaseDatabase.getReference().child(doctorPushId).child(charUtility.filterString(user)).child("patientData");
        mDatabaseReference.keepSynced(true);

        mFirebaseStorage = FirebaseStorage.getInstance();
        mStorageReference = mFirebaseStorage.getReference().child("doctor_app").child(doctorPushId).child(charUtility.filterString(user));

    }

    public void deleteFromFirebase(final String id){
        Query hekkQuery = mDatabaseReference;

        hekkQuery.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                dataSnapshot.child(id).getRef().removeValue()
                        .addOnSuccessListener(new OnSuccessListener<Void>() {
                            @Override
                            public void onSuccess(Void aVoid) {
                                deletePhotoFromStorage(id);
                            }
                        });
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
            }
        });

        /////this is for firebase storage
        Task<Void> task = mStorageReference.child(String.valueOf(id).concat("_Image")).delete();
    }

    private void deletePhotoFromStorage(String id) {
        mStorageReference.child(id).delete();
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu options from the res/menu/menu_catalog.xml file.
        // This adds menu items to the app bar.
        getMenuInflater().inflate(R.menu.detailmenu, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // User clicked on a menu option in the app bar overflow menu
        switch (item.getItemId()) {
            // Respond to a click on the "Insert dummy data" menu option
            case R.id.edit:
                edit();
                return true;
        }
        return super.onOptionsItemSelected(item);
    }

    private void edit() {

        Intent intent = new Intent(this, addPatientActivity.class);
        intent.putExtra("patientUri", patientUri);
        startActivity(intent);

    }


    @NonNull
    @Override
    public Loader<Cursor> onCreateLoader(int id, @Nullable Bundle args) {
        String[] projection = {patientEntry._ID, patientEntry.COLUMN_NAME,
                patientEntry.COLUMN_ADDRESS,
                patientEntry.COLUMN_PHONE_NUMBER,
                patientEntry.COLUMN_GENDER,
                patientEntry.COLUMN_EMAIL,
                patientEntry.COLUMN_IMAGE,
                patientEntry.COLUMN_DOB};
        return new CursorLoader(this, Uri.parse(patientUri), projection, null, null, null);
    }

    @SuppressLint("NewApi")
    @Override
    public void onLoadFinished(@NonNull Loader<Cursor> loader, Cursor data) {
        if(data == null || data.getCount() < 1){
            return;
        }

        if(data.moveToFirst()){
            String name = data.getString(data.getColumnIndex(patientEntry.COLUMN_NAME));
            String phone =  data.getString(data.getColumnIndex(patientEntry.COLUMN_PHONE_NUMBER));
            String email = data.getString(data.getColumnIndex(patientEntry.COLUMN_EMAIL));
            String calendar = data.getString(data.getColumnIndex(patientEntry.COLUMN_DOB));
            String location = data.getString(data.getColumnIndex(patientEntry.COLUMN_ADDRESS));
            int gender = data.getInt(data.getColumnIndex(patientEntry.COLUMN_GENDER));
            bmpByte = data.getBlob(data.getColumnIndex(patientEntry.COLUMN_IMAGE));

            if(bmpByte != null){
                Bitmap bmp  = DbBitmapUtility.getImage(bmpByte);
                patientpic.setImageBitmap(bmp);
            }

            detailName.setText(name);
            detailPhone.setText(String.valueOf(phone));
            detailEmail.setText(String.valueOf(email));
            detailCalendar.setText(calendar);
            detailLocation.setText(location);
            patientpic.setBackground(getResources().getDrawable(R.drawable.userplaceholder));
            detailGender.setText(doctorContract.checkGender(gender));
        }
    }

    @Override
    public void onLoaderReset(@NonNull Loader<Cursor> loader) {
        detailName.setText("");
        detailPhone.setText("");
        detailEmail.setText("");
        detailCalendar.setText("");
        detailLocation.setText("");
        detailGender.setText("");
    }
}