//
//  DeviceOperationViewController.m
//  LCOpenSDKDemo
//
//  Created by mac318340418 on 16/7/18.
//  Copyright © 2016年 lechange. All rights reserved.
//

#import "DeviceOperationViewController.h"
#import "LCOpenSDK_Prefix.h"
#import "RestApiService.h"
#import "OpenApiService.h"

typedef NS_ENUM(NSInteger, Upgrade_Status)
{
    Complete = 0,
    Download,
    Update,
    Reboot,
};

@interface DeviceOperationViewController ()
{
    NSTimer* mTimer;
    Upgrade_Status mDeviceUpgradeProcess;
    OpenApiService* openApi;
}

@end

@implementation DeviceOperationViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self initWindowView];
    openApi = [[OpenApiService alloc] init];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [self getChnStatus];
}

- (void)initWindowView
{

    UINavigationItem* item = [[UINavigationItem alloc] initWithTitle:NSLocalizedString(DEVICE_OPERATE_TITLE_TXT, nil)];
    super.m_navigationBar.tintColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0];

    UIButton* left = [UIButton buttonWithType:UIButtonTypeCustom];
    //left.backgroundColor = [UIColor whiteColor];
    [left setFrame:CGRectMake(0, 0, 50, 30)];
    UIImage* img = [UIImage leChangeImageNamed:Back_Btn_Png];

    [left setBackgroundImage:img forState:UIControlStateNormal];
    [left addTarget:self action:@selector(onBack) forControlEvents:UIControlEventTouchUpInside];
    UIBarButtonItem* leftBtn = [[UIBarButtonItem alloc] initWithCustomView:left];
    [item setLeftBarButtonItem:leftBtn animated:NO];
    [super.m_navigationBar pushNavigationItem:item animated:NO];

    [self.view addSubview:super.m_navigationBar];
    [self.m_alarmLab setText:NSLocalizedString(ALARM_PLAN_TXT, nil)];
    [self.m_cloudStorageLab setText:NSLocalizedString(CLOUD_STORAGE_TXT, nil)];
    //[self.m_passwordLab setText:NSLocalizedString(PASSWORD_TXT, nil)];
    self.m_passwordLab.hidden = YES;
    [self.m_upgradeLab setText:NSLocalizedString(DEVICE_PROGRAME_TXT, nil)];
    m_progressInd = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    m_progressInd.transform = CGAffineTransformMakeScale(2.0, 2.0);
    m_progressInd.center = CGPointMake(self.view.center.x, self.view.center.y);
    [self.view addSubview:m_progressInd];

    m_toastLab = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 300, 50)];
    m_toastLab.center = self.view.center;
    m_toastLab.backgroundColor = [UIColor whiteColor];
    m_toastLab.textAlignment = NSTextAlignmentCenter;
    [self.view addSubview:m_toastLab];

    [self.view bringSubviewToFront:m_toastLab];
    [self.view bringSubviewToFront:m_progressInd];
    self.m_viewAlarm.hidden = YES;
    self.m_viewCloudStroge.hidden = YES;
    self.m_viewPassword.hidden = YES;
    self.m_viewUpgrade.hidden = YES;
    m_toastLab.hidden = YES;
    self.m_alarmActivity.hidden = YES;
    [self.m_alarmActivity startAnimating];
    self.m_cloudStorageActivity.hidden = YES;
    [self.m_cloudStorageActivity startAnimating];
    self.m_passwordActivity.hidden = YES;
    [self.m_passwordActivity startAnimating];
    self.m_upgradeActivity.hidden = YES;
    [self.m_upgradeActivity startAnimating];

    //[self.m_passwordBtn setTitle:NSLocalizedString(MODIFY_TXT, nil) forState:UIControlStateNormal];
    self.m_passwordBtn.hidden = YES;
    [self.m_upgradeBtn setTitle:NSLocalizedString(UPGRADE_TXT, nil) forState:UIControlStateNormal];
    mDeviceUpgradeProcess = Complete;
    mTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(onSmsTimer:) userInfo:nil repeats:YES];
}

- (void)onSmsTimer:(NSInteger)index
{
    if (mDeviceUpgradeProcess != Complete) {
        RestApiService *restApiService = [RestApiService shareMyInstance];
        DeviceUpgradeProcess *upgradeProcess = [[DeviceUpgradeProcess alloc] init];
        /**
        Ch:显示查询到的设备升级状态,并修改升级状态
        En:Display the queried device upgrade status, and modify the upgrade status.
        */
        [restApiService upgradeProcessDevice:m_strDevSelected Msg:nil InfoOut:upgradeProcess];
    }
}

- (void)setInfo:(LCOpenSDK_Api*)hc Token:(NSString*)token Dev:(NSString*)deviceId Chn:(NSInteger)chn
{
    m_hc = hc;
    m_accessToken = [token mutableCopy];
    m_strDevSelected = [deviceId mutableCopy];
    m_devChnSelected = chn;
}

- (IBAction)onAlarmPlan:(UISwitch*)sender
{
    self.m_alarmActivity.hidden = NO;
    RestApiService* restApiService = [RestApiService shareMyInstance];
    if (ALARM_ON == m_alarmStatus) {
        m_alarmStatus = ALARM_OFF;
        dispatch_queue_t alarmPlanTrue = dispatch_queue_create("alarmPlanFalse", nil);
        dispatch_async(alarmPlanTrue, ^{
            NSString* errMsg;
            [restApiService modifyDeviceAlarmStatus:m_strDevSelected Chnl:m_devChnSelected Enable:false Msg:&errMsg];
            if (![errMsg isEqualToString:[MSG_SUCCESS mutableCopy]]) {
                m_alarmStatus = ALARM_ON;
            }
            dispatch_async(dispatch_get_main_queue(), ^{
                self.m_alarmActivity.hidden = YES;
                [self setAlarmSwitch:m_alarmStatus];
            });
        });
    } else if (ALARM_OFF == m_alarmStatus) {
        m_alarmStatus = ALARM_ON;
        dispatch_queue_t alarmPlanTrue = dispatch_queue_create("alarmPlanTrue", nil);
        dispatch_async(alarmPlanTrue, ^{
            NSString* errMsg;
            [restApiService modifyDeviceAlarmStatus:m_strDevSelected Chnl:m_devChnSelected Enable:true Msg:&errMsg];
            if (![errMsg isEqualToString:[MSG_SUCCESS mutableCopy]]) {
                m_alarmStatus = ALARM_OFF;
            }
            dispatch_async(dispatch_get_main_queue(), ^{
                self.m_alarmActivity.hidden = YES;
                [self setAlarmSwitch:m_alarmStatus];
            });
        });
    }
}

- (IBAction)onStorageStrategy:(UISwitch*)sender
{
    self.m_cloudStorageActivity.hidden = NO;
    RestApiService* restApiService = [RestApiService shareMyInstance];
    if (STORAGE_ON == m_cldStrgStatus) {
        m_cldStrgStatus = STORAGE_BREAK_OFF;
        dispatch_queue_t downQueue = dispatch_queue_create("storageStrategyOff", nil);
        dispatch_async(downQueue, ^{
            NSString* errMsg;
            [restApiService setStorageStrategy:m_strDevSelected Chnl:m_devChnSelected Enable:@"off" Msg:&errMsg];
            if (![errMsg isEqualToString:[MSG_SUCCESS mutableCopy]]) {
                m_cldStrgStatus = STORAGE_ON;
            }
            dispatch_async(dispatch_get_main_queue(), ^{
                self.m_cloudStorageActivity.hidden = YES;
                [self setCloudStorageSwitch:m_cldStrgStatus];
            });
        });
    } else if (STORAGE_NOT_OPEN == m_cldStrgStatus || STORAGE_USELESS == m_cldStrgStatus || STORAGE_BREAK_OFF == m_cldStrgStatus) {
        m_cldStrgStatus = STORAGE_ON;
        dispatch_queue_t storageStrategyOn = dispatch_queue_create("storageStrategyOn", nil);
        dispatch_async(storageStrategyOn, ^{
            NSString* errMsg;
            [restApiService setStorageStrategy:m_strDevSelected Chnl:m_devChnSelected Enable:@"on" Msg:&errMsg];
            if (![errMsg isEqualToString:[MSG_SUCCESS mutableCopy]]) {
                m_cldStrgStatus = STORAGE_BREAK_OFF;
            }
            dispatch_async(dispatch_get_main_queue(), ^{
                self.m_cloudStorageActivity.hidden = YES;
                [self setCloudStorageSwitch:m_cldStrgStatus];
            });
        });
    }
}
- (IBAction)onModifyPassword:(id)sender
{
    UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"modify device password" message:@"confirm to modify?" preferredStyle:UIAlertControllerStyleAlert];
    [alert addTextFieldWithConfigurationHandler:^(UITextField* _Nonnull textField) {
        textField.placeholder = @"old password";
    }];
    [alert addTextFieldWithConfigurationHandler:^(UITextField* _Nonnull textField) {
        textField.placeholder = @"new password";
    }];
    UIAlertAction* confirmAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction* _Nonnull action) {

        NSString* oldPassword = alert.textFields[0].text;
        NSString* newPassword = alert.textFields[1].text;
        RestApiService* apiService = [RestApiService shareMyInstance];
        NSLog(@"old password: %@", oldPassword);
        NSLog(@"new password: %@", newPassword);
        if (!oldPassword || 0 == oldPassword.length || !newPassword || 0 == newPassword.length) {
            m_toastLab.text = @"check password valid";
            m_toastLab.hidden = NO;
            [self performSelector:@selector(hideToastDelay) withObject:nil afterDelay:3.0f];
            return;
        }
        self.m_passwordActivity.hidden = NO;
        dispatch_queue_t modifyDevicePwdQueue = dispatch_queue_create("modifyDevicePwd", nil);
        dispatch_async(modifyDevicePwdQueue, ^{
            NSString* errMsg;
            [apiService modifyDevicePwd:m_strDevSelected oldPwd:oldPassword newPwd:newPassword Msg:&errMsg];
            dispatch_async(dispatch_get_main_queue(), ^{
                if ([errMsg isEqualToString:[MSG_SUCCESS mutableCopy]]) {
                    m_toastLab.text = @"modify password successfully";
                } else {
                    m_toastLab.text = @"modify password failed";
                }
                m_toastLab.hidden = NO;
                self.m_passwordActivity.hidden = YES;
                [self performSelector:@selector(hideToastDelay) withObject:nil afterDelay:3.0f];
            });
        });
    }];
    UIAlertAction* cancelAction = [UIAlertAction actionWithTitle:@"NO" style:UIAlertActionStyleDefault handler:nil];
    [alert addAction:confirmAction];
    [alert addAction:cancelAction];
    [self presentViewController:alert animated:YES completion:nil];
}

- (IBAction)onUpgradeDevice:(id)sender {
    self.m_upgradeActivity.hidden = NO;
    RestApiService* apiService = [RestApiService shareMyInstance];
    dispatch_queue_t upgradeDeviceQueue = dispatch_queue_create("upgradeDevice", nil);
    dispatch_async(upgradeDeviceQueue, ^{
        NSString* errMsg;
        [apiService upgradeDevice:m_strDevSelected Msg:&errMsg];
        dispatch_async(dispatch_get_main_queue(), ^{
            if ([errMsg isEqualToString:[MSG_SUCCESS mutableCopy]]) {
                m_toastLab.text = @"upgrade successfully";
            } else {
                m_toastLab.text = @"upgrade failed";
            }
            m_toastLab.hidden = NO;
            self.m_upgradeActivity.hidden = YES;
            [self performSelector:@selector(hideToastDelay) withObject:nil afterDelay:3.0f];
        });
    });
}

- (void)hideToastDelay
{
    m_toastLab.hidden = YES;
}

- (void)onBack
{
    [mTimer invalidate];
    [openApi cancelRequest];
    [self dismissViewControllerAnimated:YES completion:nil];
    [self.navigationController popViewControllerAnimated:YES];
}

- (void)setAlarmSwitch:(AlarmStatus)status
{
    switch (status) {
    case ALARM_ON:
        [self.m_alarmSwitch setOn:YES];
        break;
    case ALARM_OFF:
        [self.m_alarmSwitch setOn:NO];
        break;
    default:
        break;
    }
}

- (void)setCloudStorageSwitch:(CloudStorageStatus)status
{
    switch (status) {
    case STORAGE_ON:
        [self.m_cloudStorageSwitch setOn:YES];
        break;
    case STORAGE_BREAK_OFF:
    case STORAGE_NOT_OPEN:
    case STORAGE_USELESS:
        [self.m_cloudStorageSwitch setOn:NO];
        break;
    default:
        break;
    }
}

- (void)getChnStatus
{
    [self showLoading];
    dispatch_queue_t get_status = dispatch_queue_create("get_status", nil);
    dispatch_async(get_status, ^{
        int alarmStatus = 0;
        int cloudStatus = 0;
        int updateStatus = 0;
        NSString *err;
        NSString *msg;
        
        do {
            NSInteger ret;
            ret = [openApi alarmStatus:m_accessToken deviceId:m_strDevSelected channelId:[NSString stringWithFormat:@"%@", @(m_devChnSelected)] status:&alarmStatus errcode:&err errmsg:&msg];
            if (![err isEqualToString:@"0"]) {
                break;
            }
            ret = [openApi cloudStatus:m_accessToken deviceId:m_strDevSelected channelId:[NSString stringWithFormat:@"%@", @(m_devChnSelected)] status:&cloudStatus errcode:&err errmsg:&msg];
            if (![err isEqualToString:@"0"]) {
                break;
            }
            ret = [openApi updateStatus:m_accessToken deviceId:m_strDevSelected status:&updateStatus errcode:&err errmsg:&msg];
        } while (0);
        
        if (![err isEqualToString:@"0"]) {
            dispatch_sync(dispatch_get_main_queue(), ^{
                [self hideLoading];
                m_toastLab.text = msg;
                m_toastLab.hidden = NO;
            });
            return;
        }
        m_alarmStatus = alarmStatus;
        m_cldStrgStatus = cloudStatus;
        
        dispatch_async(dispatch_get_main_queue(), ^{
            _m_upgradeBtn.hidden = (updateStatus == 0);
            [self setAlarmSwitch:m_alarmStatus];
            [self setCloudStorageSwitch:m_cldStrgStatus];
            [self hideLoading];
            self.m_viewAlarm.hidden = NO;
            self.m_viewCloudStroge.hidden = NO;
            self.m_viewPassword.hidden = NO;
            self.m_viewUpgrade.hidden = NO;
        });
    });
}

- (void)showLoading
{
    [m_progressInd startAnimating];
}


- (void)hideLoading
{
    if ([m_progressInd isAnimating]) {
        [m_progressInd stopAnimating];
    }
}

- (void)dealloc
{
   NSLog(@"DeviceOperationViewController dealloc");
}
@end