package clock.socoolby.com.clock;

import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Typeface;
import android.os.Build;
import android.os.Handler;
import android.os.Message;
import android.os.PowerManager;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.widget.RelativeLayout;
import android.widget.TextView;

import java.util.Timer;
import java.util.TimerTask;

import clock.socoolby.com.clock.protocol.WeatherResponse;
import clock.socoolby.com.clock.utils.Constants;
import clock.socoolby.com.clock.utils.DateModel;
import clock.socoolby.com.clock.utils.Player;
import clock.socoolby.com.clock.utils.SharePerferenceModel;

public class MainActivity extends Activity implements Handler.Callback, View.OnClickListener {
    private final static String TAG = MainActivity.class.getSimpleName();
    private final static int SETTING_REQUEST_CODE = 100;

    public final static int MODE_NORMAL = 200;
    public final static int MODE_SETTING_OTHER = 202;


    private TextView tv_time;
    private TextView tv_date;
    private TextView tv_day;
    private TextView tv_weather;
    private TextView tv_descript;
    private TextView tv_setting;

    private Timer timer;
    private Handler handler;
    private final static int UPDATE_TIME = 100;

    private PowerManager.WakeLock wakeLock = null;


    private SharePerferenceModel model;

    private PowerManager.WakeLock localWakeLock = null;


    public int mMode = MODE_NORMAL;

    public void setWeather(WeatherResponse weather) {
        if (weather == null)
            return;
        if (weather.getTodayWeather() != null)
            tv_weather.setText(weather.getTodayWeather().weather);
    }


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv_time = (TextView) findViewById(R.id.tv_time);
        tv_date = (TextView) findViewById(R.id.tv_date);
        tv_day = (TextView) findViewById(R.id.tv_day);
        Typeface typeFace = Typeface.createFromAsset(getAssets(), "fonts/ds_digi.ttf");
        tv_time.setTypeface(typeFace);
        tv_date.setTypeface(typeFace);
        tv_weather = (TextView) findViewById(R.id.tv_weather);
        tv_descript = (TextView) findViewById(R.id.tv_descript);


        handler = new Handler(this);
        tv_setting = (TextView) findViewById(R.id.tv_setting);
        tv_setting.setOnClickListener(this);
        tv_time.setOnClickListener(this);
        RelativeLayout rel_main = (RelativeLayout) findViewById(R.id.rel_main);
        rel_main.setOnClickListener(this);
        init();
        PowerManager powerManager = (PowerManager) this.getSystemService(POWER_SERVICE);
        wakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK, "Clock");
        localWakeLock = powerManager.newWakeLock(32, "MyPower");

        ClockApplication.getInstance().setMainActivity(this);
        ClockApplication.getInstance().getBusinessService().getWeather(model.getCity());

        timer = new Timer();
        TimerTask timerTask = new TimerTask() {
            @Override
            public void run() {
                handler.sendEmptyMessage(UPDATE_TIME);
            }
        };
        timer.schedule(timerTask, 1000, 1000);
        ClockApplication.getInstance().getBusinessService().checkUpdate();
    }

    @Override
    protected void onRestart() {
        super.onRestart();
    }


    private void init() {
        model = new SharePerferenceModel();
        model.read();
        Log.d(TAG, "model:" + model.toString());
        if (model.getDescription() != null) {
            tv_descript.setText(model.getDescription());
        }
        Intent startIntent = new Intent(this, ProximityService.class);
        if (model.isTriggerScreen()) {
            startService(startIntent);
        } else {
            stopService(startIntent);
        }
    }


    @TargetApi(Build.VERSION_CODES.KITKAT)
    @Override
    protected void onResume() {
        super.onResume();
        getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
        wakeLock.acquire();
    }


    @Override
    protected void onPause() {
        super.onPause();
        wakeLock.release();
    }

    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.tv_setting:
                Intent intent = new Intent(this, SettingActivity.class);
                startActivityForResult(intent, SETTING_REQUEST_CODE);
                tv_setting.setVisibility(View.GONE);
                break;
            case R.id.rel_main:
                localWakeLock.isHeld();
                switchMode(MODE_SETTING_OTHER);
                break;
            case R.id.tv_time:
                switchMode(MODE_SETTING_OTHER);
                break;
        }
    }

    private void switchMode(int mode) {
        switch (mode) {
            case MODE_NORMAL:
                tv_setting.setVisibility(View.GONE);
                break;
            case MODE_SETTING_OTHER:
                tv_setting.setVisibility(View.VISIBLE);
                break;
        }
        mMode = mode;

    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            switchMode(MODE_NORMAL);
            getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
            return true;
        } else if (keyCode == KeyEvent.KEYCODE_MENU) {
            Intent intent = new Intent(this, SettingActivity.class);
            startActivityForResult(intent, SETTING_REQUEST_CODE);
            tv_setting.setVisibility(View.GONE);
        }
        return super.onKeyDown(keyCode, event);
    }

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == SETTING_REQUEST_CODE) {
            init();
        }
    }

    @Override
    public boolean handleMessage(Message msg) {
        switch (msg.what) {
            case UPDATE_TIME:
                updateTime();
                break;
        }

        return true;
    }

    @TargetApi(Build.VERSION_CODES.GINGERBREAD)
    private void updateTime() {

        DateModel date = new DateModel();
        String dateString = date.getDateString();
        String dayString = date.getToday();
        String timeString = model.isDisplaySecond() ? date.getTimeString() : date.getShortTimeString();
        timeString=timeString.replace("1", " 1");
        if(timeString.startsWith(" "))
            timeString=timeString.substring(1,timeString.length());
        tv_time.setText(timeString);
        tv_date.setText(dateString.replace("1", " 1"));
        tv_day.setText(dayString);
        reportTime(date);
    }

    private boolean isReport(int hour, int minute) {

        DateModel startTime = model.getStartHourPowerTime();
        DateModel stopTime = model.getStopHourPowerTime();
        DateModel nowTime = new DateModel();
        nowTime.setTime(hour, minute);

        if (startTime.getShortTimeString().equals(stopTime.getShortTimeString()))
            return true;
        long minutes = startTime.minusTime(stopTime);
        if (minutes < 0) {//stop>start
            if (nowTime.minusTime(startTime) >= 0 && nowTime.minusTime(stopTime) <= 0) {
                return false;
            }
        }
        return true;
    }

    private void reportTime(DateModel date) {
        if (model.isTickSound()) {
            Player.getInstance().playTick(this);
        }
        int year = date.getYear();
        int month = date.getMonth();
        int day = date.getDay();
        int hour = date.getHour();
        int minute = date.getMinute();
        int second = date.getSecond();
        int today = date.getWeek();

        if (model.getTypeHourPower() != Constants.TALKING_NO_REPORT) {
            if ((minute == 30 || minute == 0) && model.getTypeHourPower() == Constants.TALKING_HALF_AN_HOUR && second == 0) {
                Log.d(TAG, String.format("reportTime Year:%d Month:%d Day:%d Hour:%d Minute:%d Today:%d", year, month, day, hour, minute, today));
                if (isReport(hour, minute))
                    Player.getInstance().reportTime(this, year, month, day, hour, minute, today);
            } else if (model.getTypeHourPower() == Constants.TALKING_HOURS && minute == 0 && second == 0) {
                if (isReport(hour, minute))
                    Player.getInstance().reportTime(this, year, month, day, hour, minute, today);
            }
        }

    }
}