<?php
include dirname(__FILE__) . '/nocache.php';

include dirname(__FILE__) . '/dbconfig.php';
include dirname(__FILE__) . '/error.php';
include dirname(__FILE__) . '/utils.php';

include dirname(__FILE__) . '/session.php';

function check() {
check_session();

setTextDomain('myapps');

$options = array(PDO::MYSQL_ATTR_INIT_COMMAND=>"SET CHARACTER SET 'utf8'");
$dbh = new PDO(DB_DSN, DB_USER, DB_PASSWORD, $options);

$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

setTimezone($dbh);

error_reporting(E_ALL & ~E_NOTICE);

$POST = json_decode(file_get_contents('php://input'), true);

$host = '';

$enable  = $POST['mqtt_enable'];
if (!$enable) {
  $sql = "update mqtt_auth set del_flg='1' where member_id=:mids";
  $stmt = $dbh->prepare($sql);
  $stmt->execute(array(':mids' => $_SESSION['member_id']));
} else {
  $params = array(':mids' => $_SESSION['member_id']);
  
  $sql = "select s.mqtt_limit from userdata as u inner join session_master as s on s.id=u.session  where u.member_id=:mids";
  $stmt = $dbh->prepare($sql);
  $stmt->execute($params);
  $result = $stmt->fetch(PDO::FETCH_ASSOC);
  if (!$result) {
    echo json_encode(['setmessage' => _('データが存在しない')]);
    return;
  }
  $mqtt_limit = $result['mqtt_limit'];
  
  $add = array();
  
  $prefix  = str_replace('-','',$_SESSION['member_id']);
  $serials = $POST['mqtt_serials'];
  foreach ($serials as $serial) {
      if (!empty($serial)) {
          $add[] = array($serial, $prefix . $serial);
          $add[] = array($serial, $prefix . $serial . 'PC1');
          $add[] = array($serial, $prefix . $serial . 'PC2');
      }
  }
  if (count($add) > $mqtt_limit * 3) {
    echo json_encode(['setmessage' => _('設定可能数の上限を超えました')]);
    return;
  }

  $dbh->beginTransaction();
  
  $sql = "select * from mqtt_auth where member_id=:mids FOR UPDATE";
  $stmt = $dbh->prepare($sql);
  $stmt->execute($params);
  $result = $stmt->fetchall(PDO::FETCH_ASSOC);

  if (count($result) == 0) {
    $sql = "UPDATE mqtt_host INNER JOIN (SELECT @id:=min(id) as id FROM mqtt_host WHERE current<max_user) as t SET mqtt_host.current=mqtt_host.current+1,upd_log='set_mqsetting',upd_date=NOW() WHERE mqtt_host.id=t.id";
    $stmt = $dbh->prepare($sql);
    $stmt->execute();
    $sql = "SELECT @id as id, host FROM mqtt_host where id=@id";
    $stmt = $dbh->prepare($sql);
    $stmt->execute();
    $data = $stmt->fetch(PDO::FETCH_ASSOC);
    if(!$data) {
      echo json_encode(['setmessage' => _('サーバを割り当てられませんでした')]);
      return;
    }
    $server = $data['id'];
  } else {
    $server = $result[0]['server'];
  }

  foreach ($result as $item) {
    if (count($add) > 0) {
      $data = array_shift($add);
      $serial = $data[0];
      $cid = $data[1];
      $sql = "UPDATE mqtt_auth SET client_id=:c,serial=:s,del_flg='0',upd_log='set_mqttsetting.php:update',upd_date=NOW() WHERE id=:i";
      $stmt = $dbh->prepare($sql); 
      $params = array(':c'=>$cid,':s'=>$serial,':i'=>$item['id']);
      $stmt->execute($params);
    } else {
      $sql = "UPDATE mqtt_auth SET del_flg='1' WHERE id=:id";
      $stmt = $dbh->prepare($sql);
      $stmt->execute(array(':id'=>$item['id']));
    }
  }
  foreach ($add as $data) {
    $serial = $data[0];
    $cid = $data[1];
    $sql = "INSERT INTO mqtt_auth (member_id,client_id,serial,server,del_flg,ins_log,ins_date) VALUES (:m,:c,:s,:v,'0','set_mqttsetting.php',NOW())";
    $stmt = $dbh->prepare($sql);
    $stmt->execute(array(':m'=>$_SESSION['member_id'],':c'=>$cid,':s'=>$serial,':v'=>$server));
  }

  $sql = "select distinct a.serial,s.host from mqtt_auth as a inner join mqtt_host as s on s.id=a.server and s.del_flg='0' where a.member_id=:mids and a.del_flg='0'";

  $stmt = $dbh->prepare($sql);
  $params = array(':mids' => $_SESSION['member_id']);
  $stmt->execute($params);

  $result = $stmt->fetch(PDO::FETCH_ASSOC);

  if ($result) {
    $host = $result['host'];
  }

  $dbh->commit();
}

  echo json_encode(['setmessage' => _('設定を変更しました'), 'mqtt_server'=> $host]);
}

wrap('check');
