<?php

namespace Xentral\Modules\ImportTemplate\Data;

use JsonSerializable;
use Xentral\Modules\ImportTemplate\Exception\InvalidTemplateDataException;

class ImportTemplate implements JsonSerializable
{
    /**@var string $id */
    private $id;

    /**@var string $label */
    private $label = '';

    /**@var string $delimiter */
    private $delimiter='';

    /**@var int $lineNumber */
    private $lineNumber=0;

    /**@var string $masking */
    private $masking='';

    /**@var string $importCharSet */
    private $importCharSet='';

    /**@var string $fields */
    private $fields='';

    /**@var string $target */
    private $target='';

    /**@var string $internalNote */
    private $internalNote='';

    /**@var int $utf8decode */
    private $utf8decode=1;

    /**@var string $charset */
    private $charset='';

    /**
     * @param array $data
     *
     * @throws InvalidTemplateDataException
     *
     * @return ImportTemplate
     */
    public static function fromArray($data)
    {
        $isValid = self::validate($data);
        if (!$isValid) {
            throw new InvalidTemplateDataException();
        }

        return self::fromDbState($data);
    }

    /**
     * @param array $data
     *
     * @return bool
     */
    private static function validate($data)
    {
        $isValid = true;

        if (isset($data['fields'])) {
            $regex = '/[\r\n0-9]+:/';
            preg_match_all($regex, $data['fields'], $matches);
            if (count($matches[0]) == 0) {
                $isValid = false;
            }
        } else {
            $isValid = false;
        }

        if (isset($data['label'])) {
            if (strlen($data['label']) == 0) {
                $isValid = false;
            }
        } else {
            $isValid = false;
        }

        return $isValid;
    }

    public static function fromDbState($data)
    {
        $instance = new self();

        if (isset($data['id'])) {
            $instance->id = $data['id'];
        }

        if (isset($data['label'])) {
            $instance->label = $data['label'];
        }

        if (isset($data['delimiter'])) {
            $instance->delimiter = $data['delimiter'];
        }

        if (isset($data['lineNumber'])) {
            $instance->lineNumber = $data['lineNumber'];
        }

        if (isset($data['masking'])) {
            $instance->masking = $data['masking'];
        }

        if (isset($data['importCharSet'])) {
            $instance->importCharSet = $data['importCharSet'];
        }

        if (isset($data['fields'])) {
            $instance->fields = $data['fields'];
        }

        if (isset($data['target'])) {
            $instance->target = $data['target'];
        }

        if (isset($data['internalNote'])) {
            $instance->internalNote = $data['internalNote'];
        }

        if (isset($data['utf8decode'])) {
            $instance->utf8decode = $data['utf8decode'] == 1;
        }

        if (isset($data['charset'])) {
            $instance->charset = $data['charset'];
        }

        return $instance;
    }

    public function getId()
    {
        return $this->id;
    }

    public function getLabel()
    {
        return $this->label;
    }

    public function getDelimiter()
    {
        return $this->delimiter;
    }

    public function getLineNumber()
    {
        return $this->lineNumber;
    }

    public function getMasking()
    {
        return $this->masking;
    }

    public function getImportCharSet()
    {
        return $this->importCharSet;
    }

    public function getFields()
    {
        return $this->fields;
    }

    public function getTarget()
    {
        return $this->target;
    }

    public function getInternalNote()
    {
        return $this->internalNote;
    }

    public function getUtf8decode()
    {
        return $this->utf8decode;
    }

    public function getCharset()
    {
        return $this->charset;
    }

    public function updateLabel($label)
    {
        $this->label = $label;
    }

    public function jsonSerialize()
    {

        return [
            'id'            => $this->id,
            'label'         => $this->label,
            'delimiter'     => $this->delimiter,
            'lineNumber'    => $this->lineNumber,
            'masking'       => $this->masking,
            'importCharSet' => $this->importCharSet,
            'fields'        => $this->fields,
            'target'        => $this->target,
            'internalNote'  => $this->internalNote,
            'utf8decode'    => $this->utf8decode,
            'charset'       => $this->charset,
        ];
    }
}