package com.silabs.thunderboard.demos.ui;

import android.os.Bundle;
import android.support.v7.widget.GridLayout;
import android.view.LayoutInflater;
import android.view.View;

import com.silabs.thunderboard.R;
import com.silabs.thunderboard.demos.model.HallState;

import javax.inject.Inject;

import butterknife.BindView;
import butterknife.ButterKnife;

import static com.silabs.thunderboard.common.app.ThunderBoardConstants.POWER_SOURCE_TYPE_COIN_CELL;
import static com.silabs.thunderboard.common.app.ThunderBoardConstants.POWER_SOURCE_TYPE_UNKNOWN;

public class DemoEnvironmentActivity extends BaseDemoActivity implements DemoEnvironmentListener {

    DemoEnvironmentTemperatureControl temperatureControl;

    DemoEnvironmentHumidityControl humidityControl;

    DemoEnvironmentAmbientLightControl ambientLightControl;

    DemoEnvironmentUVControl uvIndexControl;

    DemoEnvironmentPressureControl pressureControl;

    DemoEnvironmentSoundLevelControl soundLevelControl;

    DemoEnvironmentCO2Control co2Control;

    DemoEnvironmentVOCControl vocControl;

    DemoEnvironmentHallStrengthControl hallStrengthControl;

    DemoEnvironmentHallStateControl hallStateControl;

    @BindView(R.id.env_grid)
    android.support.v7.widget.GridLayout envGrid;

    private int powerSource;

    public static boolean isDemoAllowed() {
        return true;
    }

    @Inject
    DemoEnvironmentPresenter presenter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        View view = LayoutInflater.from(this).inflate(R.layout.activity_demo_environment, null, false);
        mainSection.addView(view);

        ButterKnife.bind(this);
        component().inject(this);

        presenter.setViewListener(this, deviceAddress);

        setupEnvList();
        initControls();

//        disable firebase for reskinning
//        checkFirebaseConnectivity();
    }

    @Override
    public void onResume() {
        super.onResume();

        presenter.checkSettings();
    }

    private void setupEnvList() {
        temperatureControl = new DemoEnvironmentTemperatureControl(this);
        humidityControl = new DemoEnvironmentHumidityControl(this);
        ambientLightControl = new DemoEnvironmentAmbientLightControl(this);
        uvIndexControl = new DemoEnvironmentUVControl(this);
        pressureControl = new DemoEnvironmentPressureControl(this);
        soundLevelControl = new DemoEnvironmentSoundLevelControl(this);
        co2Control = new DemoEnvironmentCO2Control(this);
        vocControl = new DemoEnvironmentVOCControl(this);
        hallStrengthControl = new DemoEnvironmentHallStrengthControl(this);
        hallStateControl = new DemoEnvironmentHallStateControl(this);

        temperatureControl.setLayoutParams(getLayoutParams());
        soundLevelControl.setLayoutParams(getLayoutParams());
        ambientLightControl.setLayoutParams(getLayoutParams());
        uvIndexControl.setLayoutParams(getLayoutParams());
        humidityControl.setLayoutParams(getLayoutParams());
        pressureControl.setLayoutParams(getLayoutParams());
        co2Control.setLayoutParams(getLayoutParams());
        vocControl.setLayoutParams(getLayoutParams());
        hallStrengthControl.setLayoutParams(getLayoutParams());
        hallStateControl.setLayoutParams(getLayoutParams());

        hallStateControl.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                presenter.onHallStateClick();
            }
        });
    }

    private GridLayout.LayoutParams getLayoutParams() {
        GridLayout.LayoutParams layoutParams;
        layoutParams = new GridLayout.LayoutParams(
                GridLayout.spec(GridLayout.UNDEFINED, 1f),
                GridLayout.spec(GridLayout.UNDEFINED, 1f));
        layoutParams.width = 0;
        return layoutParams;
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        presenter.clearViewListener();
    }

    @Override
    protected BaseDemoPresenter getDemoPresenter() {
        return presenter;
    }

    @Override
    public int getToolbarColor() {
        return getResourceColor(R.color.tb_red);
    }

    @Override
    public String getToolbarString() {
        return getString(R.string.demo_environment);
    }

    @Override
    public void setTemperature(float temperature, int temperatureType) {
        if (temperatureControl.isEnabled()) {
            temperatureControl.setTemperature(temperature, temperatureType);
        }
    }

    @Override
    public void setHumidity(int humidity) {
        if (humidityControl.isEnabled()) {
            humidityControl.setHumidity(humidity);
        }
    }

    @Override
    public void setUvIndex(int uvIndex) {
        if (uvIndexControl.isEnabled()) {
            uvIndexControl.setUVIndex(uvIndex);
        }
    }

    @Override
    public void setAmbientLight(long ambientLight) {
        if (ambientLightControl.isEnabled()) {
            ambientLightControl.setAmbientLight(ambientLight);
        }
    }

    @Override
    public void setSoundLevel(float soundLevel) {
        if (soundLevelControl.isEnabled()) {
            soundLevelControl.setSoundLevel((int) soundLevel);
        }
    }

    @Override
    public void setPressure(float pressure) {
        if (pressureControl.isEnabled()) {
            pressureControl.setPressure((int) pressure);
        }
    }

    @Override
    public void setCO2Level(int co2Level) {
        if (co2Control.isEnabled()) {
            co2Control.setCO2(co2Level);
        }
    }

    @Override
    public void setTVOCLevel(int vocLevel) {
        if (vocControl.isEnabled()) {
            vocControl.setVOC(vocLevel);
        }
    }

    @Override
    public void setHallStrength(float hallStrength) {
        if (hallStrengthControl.isEnabled()) {
            hallStrengthControl.setHallStrength(hallStrength);
        }
    }

    @Override
    public void setHallState(@HallState int hallState) {
        if (hallStateControl.isEnabled()) {
            hallStateControl.setHallState(hallState);
        }
    }

    @Override
    public void setTemperatureEnabled(boolean enabled) {
        temperatureControl.setEnabled(enabled);
    }

    @Override
    public void setHumidityEnabled(boolean enabled) {
        humidityControl.setEnabled(enabled);
    }

    @Override
    public void setUvIndexEnabled(boolean enabled) {
        uvIndexControl.setEnabled(enabled);
    }

    @Override
    public void setAmbientLightEnabled(boolean enabled) {
        ambientLightControl.setEnabled(enabled);
    }

    @Override
    public void setSoundLevelEnabled(boolean enabled) {
        soundLevelControl.setEnabled(enabled);
    }

    @Override
    public void setPressureEnabled(boolean enabled) {
        pressureControl.setEnabled(enabled);
    }

    @Override
    public void setCO2LevelEnabled(boolean enabled) {
        co2Control.setEnabled(enabled);
    }

    @Override
    public void setTVOCLevelEnabled(boolean enabled) {
        vocControl.setEnabled(enabled);
    }

    @Override
    public void setHallStrengthEnabled(boolean enabled) {
        hallStrengthControl.setEnabled(enabled);
    }

    @Override
    public void setHallStateEnabled(boolean enabled) {
        hallStateControl.setEnabled(enabled);
    }

    boolean sufficientPower() {
        switch (powerSource) {
            case POWER_SOURCE_TYPE_UNKNOWN:
            case POWER_SOURCE_TYPE_COIN_CELL:
                return false;
            default:
                break;
        }
        return true;
    }

    @Override
    public void setPowerSource(int powerSource) {
        this.powerSource = powerSource;
    }

    @Override
    public void intGrid() {
        envGrid.addView(temperatureControl);

        if (presenter.bleManager.characteristicHumidityAvailable) {
            envGrid.addView(humidityControl);
        }
        if (presenter.bleManager.characteristicAmbientLightReactAvailable || presenter.bleManager.characteristicAmbientLightSenseAvailable) {
            envGrid.addView(ambientLightControl);
        }
        if (presenter.bleManager.characteristicUvIndexAvailable) {
            envGrid.addView(uvIndexControl);
        }
        if (presenter.bleManager.characteristicPressureAvailable) {
            envGrid.addView(pressureControl);
        }
        if (presenter.bleManager.characteristicSoundLevelAvailable) {
            envGrid.addView(soundLevelControl);
        }
        if (presenter.bleManager.characteristicCo2ReadingAvailable && sufficientPower()) {
            envGrid.addView(co2Control);
        }
        if (presenter.bleManager.characteristicTvocReadingAvailable && sufficientPower()) {
            envGrid.addView(vocControl);
        }
        if (presenter.bleManager.characteristicHallFieldStrengthAvailable) {
            envGrid.addView(hallStrengthControl);
        }
        if (presenter.bleManager.characteristicHallStateAvailable) {
            envGrid.addView(hallStateControl);
        }
    }

    @Override
    public void initControls() {
        // disable everything at first...
        setTemperatureEnabled(false);
        setHumidityEnabled(false);
        setAmbientLightEnabled(false);
        setUvIndexEnabled(false);
        setPressureEnabled(false);
        setSoundLevelEnabled(false);
        setCO2LevelEnabled(false);
        setTVOCLevelEnabled(false);
        setHallStrengthEnabled(false);
        setHallStateEnabled(false);
    }


    private void addViewToGridIfNotAddedYet(View view) {
        if (view.getParent() == null) {
            envGrid.addView(view);
        }

    }
}