package mn.today;

import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.text.InputFilter;
import android.text.InputType;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.EditText;
import android.widget.Toast;

import java.util.concurrent.TimeUnit;

/**
 * Created by Tortuvshin Byambaa on 2/15/2017.
 */


public class AppUtils {

    /**
     * Calculates total minutes from millisecond input
     *
     * @param millis
     * @return
     */
    public static int convertToTotalMinutes(int millis) {
        return (millis/(1000*60));
    }

    private static int convertToTotalSeconds(int millis) {
        return (millis/(1000));
    }

    public static int calcRemainderSecs(int millis) {
        return convertToTotalSeconds(millis)%60;
    }

    /**
     * Calculates remaining minutes (ie. <60mins) from millis input
     *
     */
    public static int calcRemainderMins(int millis) {
        return convertToTotalMinutes(millis)%60;
    }

    /**
     * Calculates whole hours from millisecond input
     *
     * @param millis
     * @return
     */
    public static int calcHours(int millis) {
        return convertToTotalMinutes(millis)/60;
    }

    /**
     * Builds String output of time in the style of: hrs H mins M
     *
     * @param millis
     * @return
     */
    public static String buildCardViewStyleTime(int millis) {
        return String.valueOf(calcHours(millis)) +"H " + String.valueOf(calcRemainderMins(millis)) +"M";
    }

    /**
     * Builds String output of time in the style of: HH:MM:SS
     * @param millis
     * @return
     */
    public static String buildTimerStyleTime(long millis) {
        return String.format("%02d:%02d:%02d",
                TimeUnit.MILLISECONDS.toHours(millis),
                TimeUnit.MILLISECONDS.toMinutes(millis)
                        - TimeUnit.HOURS.toMinutes(
                        TimeUnit.MILLISECONDS.toHours(millis)
                ),
                TimeUnit.MILLISECONDS.toSeconds(millis)
                        - TimeUnit.MINUTES.toSeconds(
                        TimeUnit.MILLISECONDS.toMinutes(millis)
                )

        );
    }

    public static String buildStandardTimeOutput(int millis) {
        int hrs = calcHours(millis);
        int mins = calcRemainderMins(millis);
        if (hrs>0 && mins >=0) {
            return hrs + " hrs\n" + mins + " mins";
        } else if (hrs>0) {
            return hrs + " hours.";
        } else if (mins>=0) {
            return mins + " minutes";
        } else {
            return "";
        }
    }

    public static int minsToMillis(int mins) {
        return (mins*60*1000);
    }

    public static int hrsToMillis(int hrs) {
        return (hrs*60*60*1000);
    }


    public static int millisToSecs(int millis) {
        return (millis/1000);
    }

    public static void animateViewRotateFade(View v, String animationState) {
        ObjectAnimator rotate = ObjectAnimator.ofFloat(v, "rotation", 0f, 360f);
        rotate.setDuration(250);
        AnimatorSet animSetFS = new AnimatorSet();
        switch (animationState) {
            case AppConstants.ANIMATION_ENTRY:
                ObjectAnimator alphaEntry = ObjectAnimator.ofFloat(v, "alpha",0f, 1f);
                alphaEntry.setDuration(200);
                animSetFS.play(alphaEntry).before(rotate);
                animSetFS.start();
                break;
            case AppConstants.ANIMATION_EXIT:
                ObjectAnimator alphaExit = ObjectAnimator.ofFloat(v, "alpha",1f, 0f);
                alphaExit.setDuration(200);
                animSetFS.play(rotate).before(alphaExit);
                animSetFS.start();
                break;
        }
    }

    public static void animateViewPulse(View v, Context context) {
        Animation pulse = AnimationUtils.loadAnimation(context, R.anim.pulse);
        v.startAnimation(pulse);
    }

    /**
     * Adds input filters to supplied edit text to allow only:
     *  A-Z, a-z, 0-9, and special characters (%$!@)
     * @param viewToFilter
     * @return
     */
    public static EditText setNameInputFilters(EditText viewToFilter) {
        viewToFilter.setInputType(InputType.TYPE_CLASS_TEXT);
        viewToFilter.setFilters(new InputFilter[] {
                new InputFilter.LengthFilter(20)
        });
        return viewToFilter;
    }

    public static void setTimeInputFilters(EditText timeInputFilters) {
    }

    public static void sendFeedback(Context callingActivity) {
        Intent gmailIntent = new Intent(Intent.ACTION_SENDTO);
        // Hard coding classes is bad..
        gmailIntent.setClassName("com.google.android.gm", "com.google.android.gm.ComposeActivityGmail");
        gmailIntent.putExtra(Intent.EXTRA_EMAIL,
                new String[] {
                        callingActivity.getResources().getString(R.string.email_pressurelabs)
                });
        gmailIntent.putExtra(Intent.EXTRA_SUBJECT, callingActivity.getResources().getString(R.string.feedback_subject_msg));
        gmailIntent.putExtra(Intent.EXTRA_TEXT,  callingActivity.getResources().getString(R.string.feedback_body_msg));

        try {
            callingActivity.startActivity(gmailIntent);
        } catch(ActivityNotFoundException ex) {
            try {
                callingActivity.startActivity(Intent.createChooser(gmailIntent, "Which app?"));
            } catch (Exception e) {
                Toast.makeText(callingActivity, R.string.feedback_failed_msg, Toast.LENGTH_SHORT).show();
            }
        }

    }

    public static void showMessage(Context ctx,String message) {
        Toast.makeText(ctx, message, Toast.LENGTH_LONG).show();
    }
}