package kz.arta.synergy.workflow.mobile.android.works.fragments;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.DatePickerDialog;
import android.app.TimePickerDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.TimePicker;

import com.devspark.appmsg.AppMsg;

import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import kz.arta.synergy.workflow.mobile.android.R;
import kz.arta.synergy.workflow.mobile.android.common.ActivityConst;
import kz.arta.synergy.workflow.mobile.android.common.components.DatePickerFragment;
import kz.arta.synergy.workflow.mobile.android.common.components.OpenFileDialog;
import kz.arta.synergy.workflow.mobile.android.common.components.TimePickerFragment;
import kz.arta.synergy.workflow.mobile.android.common.models.Person;
import kz.arta.synergy.workflow.mobile.android.common.models.settings.CompletionFormItem;
import kz.arta.synergy.workflow.mobile.android.common.models.settings.DialogInfoItem;
import kz.arta.synergy.workflow.mobile.android.common.models.settings.PriorityItem;
import kz.arta.synergy.workflow.mobile.android.common.utils.Const;
import kz.arta.synergy.workflow.mobile.android.common.utils.DateUtils;
import kz.arta.synergy.workflow.mobile.android.common.utils.Fonts;
import kz.arta.synergy.workflow.mobile.android.common.utils.UserSerializable;
import kz.arta.synergy.workflow.mobile.android.common.utils.Utils;
import kz.arta.synergy.workflow.mobile.android.users.activities.UserChooserActivity;
import kz.arta.synergy.workflow.mobile.android.users.activities.UserChooserMultiActivity;
import kz.arta.synergy.workflow.mobile.android.works.models.WorkItem;

/**
 * Created by neox on 29.05.15.
 */
public class FragmentCreateWork extends Fragment {

    /**
     * Константы для метода startActivityForResult
     */
    private static final int SELECT_RESPONSIBLE = 1;
    private static final int SELECT_AUTHOR = 2;
    private static final int SELECT_EXECUTORS = 3;
    private static final int ADD_PHOTO = 4;
    /**
     * Имеются ли в наличии поле "Исполнители"
     */
    public static boolean hasUsers = false;
    /**
     * Работа (только для редактирования)
     */
    private WorkItem work;

    /**
     * Информация о текущем диалоге
     */
    private List<DialogInfoItem.Components> dialogComponents;

    /**
     * Пользователь
     */
    private Person person;

    /**
     * UUID ответственного
     */
    private String responsibleID;

    /**
     * UUID автора
     */
    private String authorID;

    /**
     * Айдишники выбранных пользователей
     */
    private List<String> selectedUsers;

    /**
     * UUID формы завершения
     */
    private String formCompletionID;

    /**
     * Имя работы
     */
    private TextView nameWork;

    /**
     * Ответственный
     */
    private TextView responsible;

    /**
     * Автор
     */
    private TextView author;

    /**
     * Исполнители
     */
    private TextView users;

    /**
     * Чекбокс "Ответственный"
     */
    private CheckBox resCheckBox;

    /**
     * Комментарий
     */
    private TextView comment;

    /**
     * Дата начала
     */
    private TextView startDate;

    /**
     * Время начала
     */
    private TextView startTime;

    /**
     * Дата завершения
     */
    private TextView finishDate;

    /**
     * Время завершения
     */
    private TextView finishTime;

    /**
     * Список добавленных файлов
     */
    private List<String> fileNames = new ArrayList<>();

    /**
     * Леяут содержащий имена добавленных файлов
     */
    private LinearLayout addedFiles;

    /**
     * Имя файла добавленного с помощью камеры
     */
    private long photoFileName;

    /**
     * Приоритет работы (1 по умолчанию)
     */
    private String selectedPriority;

    /**
     * Имена приоритетов
     */
    private String[] priorityNames;

    /**
     * Айдишники приоритетов
     */
    private String[] priorityID;

    public static FragmentCreateWork newInstance(List<DialogInfoItem.Components> components, Person person, WorkItem work) {
        FragmentCreateWork pageFragment = new FragmentCreateWork();
        Bundle arguments = new Bundle();
        arguments.putSerializable(ActivityConst.DIALOG_COMPONENTS, (ArrayList<DialogInfoItem.Components>) components);
        arguments.putSerializable(ActivityConst.PERSON, person);
        arguments.putSerializable(ActivityConst.WORK, work);
        pageFragment.setArguments(arguments);
        return pageFragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        dialogComponents = (List<DialogInfoItem.Components>) getArguments().getSerializable(ActivityConst.DIALOG_COMPONENTS);
        person = (Person) getArguments().getSerializable(ActivityConst.PERSON);
        work = (WorkItem) getArguments().getSerializable(ActivityConst.WORK);
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_create_work, null);

        LinearLayout main = (LinearLayout) view.findViewById(R.id.fragment_create_work_main);

        LinearLayout nameLayout = (LinearLayout) main.findViewById(R.id.create_work_name_layout);

        LinearLayout responsibleLayout = (LinearLayout) main.findViewById(R.id.create_work_responsible_layout);

        LinearLayout authorLayout = (LinearLayout) main.findViewById(R.id.create_work_author_layout);

        LinearLayout usersLayout = (LinearLayout) main.findViewById(R.id.create_work_users_layout);

        LinearLayout periodLayout = (LinearLayout) main.findViewById(R.id.create_work_period_layout);

        LinearLayout priorityLayout = (LinearLayout) main.findViewById(R.id.create_work_priority_layout);

        LinearLayout formCompletionLayout = (LinearLayout) main.findViewById(R.id.create_work_form_completion_layout);

        LinearLayout commentLayout = (LinearLayout) main.findViewById(R.id.create_work_comment_layout);

        LinearLayout filesLayout = (LinearLayout) main.findViewById(R.id.create_work_files_layout);

        for (DialogInfoItem.Components component : dialogComponents) {
            switch (component.getType()) {
                case "NAME":
                    initNameLayout(nameLayout);
                    main.removeView(nameLayout);
                    main.addView(nameLayout);
                    break;
                case "RESPONSIBLE":
                    initResponsibleLayout(responsibleLayout);
                    main.removeView(responsibleLayout);
                    main.addView(responsibleLayout);
                    break;
                case "AUTHOR":
                    initAuthorLayout(authorLayout);
                    main.removeView(authorLayout);
                    main.addView(authorLayout);
                    break;
                case "USERS":
                    initUsersLayout(usersLayout);
                    main.removeView(usersLayout);
                    main.addView(usersLayout);
                    break;
                case "DATES":
                    initPeriodLayout(periodLayout);
                    main.removeView(periodLayout);
                    main.addView(periodLayout);
                    break;
                case "PRIORITY":
                    initPriorityLayout(priorityLayout);
                    main.removeView(priorityLayout);
                    main.addView(priorityLayout);
                    break;
                case "COMPLETION_FORM":
                    initFormCompletionLayout(formCompletionLayout);
                    main.removeView(formCompletionLayout);
                    main.addView(formCompletionLayout);
                    break;
                case "COMMENT":
                    initCommentLayout(commentLayout);
                    main.removeView(commentLayout);
                    main.addView(commentLayout);
                    break;
                case "ATTACH_FILE":
                    initFilesLayout(filesLayout);
                    main.removeView(filesLayout);
                    main.addView(filesLayout);
                    break;
            }
        }

        return view;
    }

    /**
     * Имя работы
     *
     * @param layout родитель
     */
    private void initNameLayout(LinearLayout layout) {
        layout.setVisibility(View.VISIBLE);
        nameWork = (EditText) layout.findViewById(R.id.create_work_text_work);
        if (work != null) {
            nameWork.setText(work.getName());
        }
    }

    /**
     * Ответственный
     *
     * @param layout родитель
     */
    private void initResponsibleLayout(LinearLayout layout) {
        layout.setVisibility(View.VISIBLE);
        resCheckBox = (CheckBox) layout.findViewById(R.id.create_work_check_box);
        resCheckBox.setTypeface(Fonts.getMedium(getActivity()));
        resCheckBox.setChecked(true);
        resCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (hasUsers) {
                    responsible.setText("");
                    responsibleID = null;
                } else {
                    resCheckBox.setChecked(true);
                }
            }
        });
        responsible = (TextView) layout.findViewById(R.id.create_work_responsible);
        responsible.setTypeface(Fonts.getMedium(getActivity()));
        responsible.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (resCheckBox.isChecked()) {
                    Intent intent = new Intent(getActivity(), UserChooserActivity.class);
                    intent.putExtra(ActivityConst.PERSON, person);
                    intent.putExtra(ActivityConst.SHOW_ALL, person.getSettings().getAllowResendWork());
                    intent.putExtra(ActivityConst.USER_ID, responsibleID);
                    intent.putExtra(ActivityConst.USER_NAME, responsible.getText());
                    startActivityForResult(intent, SELECT_RESPONSIBLE);
                }
            }
        });
        if (work != null) {
            // ответственный
            responsible.setText(work.getUser().getName());
            // uuid ответственного
            responsibleID = work.getUser().getID();
            // убираем чекбокс
            resCheckBox.setVisibility(View.GONE);
        }
    }

    /**
     * Автор
     *
     * @param layout родитель
     */
    private void initAuthorLayout(LinearLayout layout) {
        layout.setVisibility(View.VISIBLE);
        TextView authorTitle = (TextView) layout.findViewById(R.id.title_create_work_author);
        author = (TextView) layout.findViewById(R.id.create_work_author);
        author.setTypeface(Fonts.getMedium(getActivity()));
        author.setText(person.getUserName());
        author.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(getActivity(), UserChooserActivity.class);
                intent.putExtra(ActivityConst.PERSON, person);
                intent.putExtra(ActivityConst.SHOW_ALL, person.getSettings().getAllowResendWork());
                intent.putExtra(ActivityConst.USER_ID, responsibleID);
                intent.putExtra(ActivityConst.USER_NAME, responsible.getText());
                intent.putExtra(ActivityConst.AUTHOR, true);
                startActivityForResult(intent, SELECT_AUTHOR);
            }
        });
        if (work != null) {
            // цвет текста заголовка для автора
            authorTitle.setTextColor(getResources().getColor(R.color.disabled_title_all_activity));
            // отключааем возможность кликнуть по автору
            author.setEnabled(false);
            // автор
            author.setText(work.getAuthor().getName());
        }
        // uuid автора
        authorID = person.getUuid();
        // отображаем поле "автор" (если нужно)
        if (work != null) {
            author.setVisibility(View.VISIBLE);
            authorTitle.setVisibility(View.VISIBLE);
        } else if (person.getSettings().getDisplayAuthorInput().equals("true")) {
            author.setVisibility(View.VISIBLE);
            authorTitle.setVisibility(View.VISIBLE);
        } else {
            author.setVisibility(View.GONE);
            authorTitle.setVisibility(View.GONE);
        }
    }

    /**
     * Исполнители
     *
     * @param layout родитель
     */
    private void initUsersLayout(LinearLayout layout) {
        hasUsers = true;
        layout.setVisibility(View.VISIBLE);
        TextView usersTitle = (TextView) layout.findViewById(R.id.title_create_work_executors);
        users = (TextView) layout.findViewById(R.id.create_work_executors);
        users.setTypeface(Fonts.getMedium(getActivity()));
        users.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(getActivity(), UserChooserMultiActivity.class);
                intent.putExtra(ActivityConst.PERSON, person);
                if (person.getSettings().getAllowAddWorkResponsibles().equals("true")) {
                    intent.putExtra(ActivityConst.SHOW_ALL, person.getSettings().getAllowAddWorkResponsibles());
                } else if (person.getSettings().getSetWorkFromResponsible().equals("true")) {
                    intent.putExtra(ActivityConst.SHOW_ALL, person.getSettings().getSetWorkFromResponsible());
                } else {
                    intent.putExtra(ActivityConst.SHOW_ALL, "false");
                }
                if (person.getSettings().getSetWorkFromResponsible().equals("true")) {
                    intent.putExtra(ActivityConst.USER_ID, responsibleID);
                }
                if (selectedUsers != null && selectedUsers.size() != 0) {
                    intent.putExtra(ActivityConst.SELECTED, selectedUsers.toArray(new String[selectedUsers.size()]));
                }
                startActivityForResult(intent, SELECT_EXECUTORS);
            }
        });
        if (work != null || person.getSettings().getDocflowDemandSignBeforeAssign().equals("true")) {
            // отключение поля "Исполнители" (при редактировании не нужен)
            users.setVisibility(View.GONE);
            // отключение лейбла "Исполнители" (при редактировании не нужен)
            usersTitle.setVisibility(View.GONE);
            // отключение поля "Комментарий" (при редактировании не нужен)
        }
        if (person.getSettings().getDocflowDemandSignBeforeAssign().equals("true")) {
            users.setVisibility(View.GONE);
            usersTitle.setVisibility(View.GONE);
            resCheckBox.setEnabled(false);
            resCheckBox.setChecked(true);
        }
    }

    /**
     * Изменить период
     *
     * @param layout родитель
     */
    private void initPeriodLayout(LinearLayout layout) {
        layout.setVisibility(View.VISIBLE);
        startDate = (TextView) layout.findViewById(R.id.create_work_start_data);
        startDate.setTypeface(Fonts.getMedium(getActivity()));
        startDate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                showDatePicker(startDate);
            }
        });
        startTime = (TextView) layout.findViewById(R.id.create_work_start_time);
        startTime.setTypeface(Fonts.getMedium(getActivity()));
        startTime.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                showTimePicker(startTime);
            }
        });
        finishDate = (TextView) layout.findViewById(R.id.create_work_finish_data);
        finishDate.setTypeface(Fonts.getMedium(getActivity()));
        finishDate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                showDatePicker(finishDate);
            }
        });
        finishTime = (TextView) layout.findViewById(R.id.create_work_finish_time);
        finishTime.setTypeface(Fonts.getMedium(getActivity()));
        finishTime.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                showTimePicker(finishTime);
            }
        });
        if (work != null) {
            startDate.setText(DateUtils.parseData(work.getStart_date(),
                    DateUtils.DEFAULT_EDIT_TEXT_DATE, DateUtils.DEFAULT_DATE_FORMAT));
            startTime.setText(DateUtils.parseData(work.getStart_date(),
                    DateUtils.DEFAULT_EDIT_TEXT_TIME, DateUtils.DEFAULT_DATE_FORMAT));
            finishDate.setText(DateUtils.parseData(work.getFinish_date(),
                    DateUtils.DEFAULT_EDIT_TEXT_DATE, DateUtils.DEFAULT_DATE_FORMAT));
            finishTime.setText(DateUtils.parseData(work.getFinish_date(),
                    DateUtils.DEFAULT_EDIT_TEXT_TIME, DateUtils.DEFAULT_DATE_FORMAT));
        } else {
            startDate.setText(DateUtils.parseData(person.getDefaults().getStart_date(),
                    DateUtils.DEFAULT_EDIT_TEXT_DATE, DateUtils.DEFAULT_DATE_FORMAT));
            startTime.setText(DateUtils.parseData(person.getDefaults().getStart_date(),
                    DateUtils.DEFAULT_EDIT_TEXT_TIME, DateUtils.DEFAULT_DATE_FORMAT));
            finishDate.setText(DateUtils.parseData(person.getDefaults().getFinish_date(),
                    DateUtils.DEFAULT_EDIT_TEXT_DATE, DateUtils.DEFAULT_DATE_FORMAT));
            finishTime.setText(DateUtils.parseData(person.getDefaults().getFinish_date(),
                    DateUtils.DEFAULT_EDIT_TEXT_TIME, DateUtils.DEFAULT_DATE_FORMAT));
        }
    }

    /**
     * Приоритет
     *
     * @param layout родитель
     */
    private void initPriorityLayout(LinearLayout layout) {
        String priorityName = null;
        List<String> names = new ArrayList<>();
        List<String> id = new ArrayList<>();
        if (person.getSettings().getCurrentPriorities() != null) {
            for (PriorityItem priorityItem : person.getSettings().getCurrentPriorities()) {
                names.add(priorityItem.getName());
                id.add(priorityItem.getId());
                if (priorityItem.getBase().equals("true")) {
                    priorityName = priorityItem.getName();
                }
            }
        }
        priorityNames = new String[names.size()];
        priorityID = new String[id.size()];
        names.toArray(priorityNames);
        id.toArray(priorityID);
        layout.setVisibility(View.VISIBLE);
        final TextView priority = (TextView) layout.findViewById(R.id.create_work_priority);
        priority.setTypeface(Fonts.getMedium(getActivity()));
        priority.setText(priorityName);
        priority.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
                builder.setTitle(getString(R.string.choose_priority));
                builder.setItems(priorityNames, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int item) {
                        priority.setText(priorityNames[item]);
                        selectedPriority = String.valueOf(priorityID[item]);
                    }
                });
                builder.setCancelable(true);
                builder.show();
            }
        });
        if (work != null) {
            // текущий приоритет
            selectedPriority = work.getPriority();
            // поиск нужного приоритета (для отображения в поле)
            if (person.getCurrentPriorityItemHashMap().get(selectedPriority) == null) {
                if (person.getPriorityItemHashMap().get(selectedPriority) != null) {
                    priority.setText((person.getPriorityItemHashMap().get(selectedPriority).getName()));
                } else {
                    priority.setText("");
                }
                selectedPriority = null;
            } else {
                priority.setText(person.getCurrentPriorityItemHashMap().get(selectedPriority).getName());
            }
        } else {
            // приоритет по умолчанию
            selectedPriority = person.getDefaults().getPriority();
        }
    }

    /**
     * Форма завершения
     *
     * @param layout родитель
     */
    private void initFormCompletionLayout(LinearLayout layout) {
        layout.setVisibility(View.VISIBLE);
        final TextView formCompletion = (TextView) layout.findViewById(R.id.create_work_form_completion);
        formCompletion.setTypeface(Fonts.getMedium(getActivity()));
        formCompletion.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
                builder.setTitle(getString(R.string.choose_form_end));
                final CompletionFormItem[] completionForms = person.getSettings().getWorkCompletionForms();
                final String[] itemsWorkCompletion = new String[completionForms.length];
                for (int i = 0; i < itemsWorkCompletion.length; i++) {
                    itemsWorkCompletion[i] = completionForms[i].getName();
                }
                builder.setItems(Utils.parseFormCompletion(itemsWorkCompletion, getString(R.string.no)),
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int item) {
                                if (item == 0) {
                                    formCompletionID = null;
                                    formCompletion.setText(getString(R.string.no));
                                } else {
                                    formCompletionID = completionForms[item - 1].getId();
                                    formCompletion.setText(itemsWorkCompletion[item - 1]);
                                }
                            }
                        });
                builder.setCancelable(true);
                builder.show();
            }
        });
        if (work != null) {
            // uuid формы завершения
            formCompletionID = work.getCompletionFormID();
            // поиск нужной формы завершения (для отображения в поле)
            if (work.getCompletionFormID() != null && work.getCompletionFormID().length() != 0) {
                formCompletion.setText(Utils.getFormCompletion(work.getCompletionFormID(), person, getActivity(), false));
            } else {
                formCompletion.setText(getString(R.string.no));
            }
        }
    }

    /**
     * Комментарий
     *
     * @param layout родитель
     */
    private void initCommentLayout(LinearLayout layout) {
        layout.setVisibility(View.VISIBLE);
        comment = (EditText) layout.findViewById(R.id.create_work_enter_comment);
        TextView commentTitle = (TextView) layout.findViewById(R.id.create_work_enter_comment_title);
        if (work != null) {
            comment.setVisibility(View.GONE);
            // отключение лейбла "Исполнители" (при редактировании не нужен)
            commentTitle.setVisibility(View.GONE);
        }
    }

    /**
     * Добавить файл
     *
     * @param layout родитель
     */
    private void initFilesLayout(LinearLayout layout) {
        layout.setVisibility(View.VISIBLE);
        addedFiles = (LinearLayout) layout.findViewById(R.id.create_work_added_files);
        // кнопка сохранить
        final Button fromAndroid = (Button) layout.findViewById(R.id.create_work_button1);
        fromAndroid.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                final OpenFileDialog fileDialog = new OpenFileDialog(getActivity());
                fileDialog.setOpenDialogListener(new OpenFileDialog.OpenDialogListener() {
                    @Override
                    public void OnSelectedFile(String fileName) {
                        if (!fileNames.contains(fileName)) {
                            fileNames.add(fileName);
                            addedFiles.addView(addFileName(new File(fileName).getName()));
                        } else {
                            AppMsg.makeText(getActivity(), getString(R.string.filename_already_exists), AppMsg.STYLE_ALERT).show();
                        }
                    }
                });
                fileDialog.show();
            }
        });
        final Button fromCamera = (Button) layout.findViewById(R.id.create_work_button2);
        fromCamera.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                File file = new File(Environment.getExternalStorageDirectory() +
                        File.separator + Const.DIRECTORY_PHOTOS_NAME + File.separator);
                if (!file.exists()) {
                    file.mkdir();
                }
                photoFileName = System.currentTimeMillis();
                Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                Uri uriSavedImage = Uri.fromFile(new File(Environment.getExternalStorageDirectory() + File.separator +
                        Const.DIRECTORY_PHOTOS_NAME + File.separator + photoFileName + Const.DEFAULT_FILE_FORMAT));
                cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, uriSavedImage);
                startActivityForResult(cameraIntent, ADD_PHOTO);
            }
        });
    }

    /**
     * Отображения диаолга выбора даты
     *
     * @param edit - TextView
     */
    private void showDatePicker(final TextView edit) {
        DatePickerFragment date = new DatePickerFragment();
        Bundle args = new Bundle();
        args.putInt(DateUtils.YEAR, Integer.parseInt(DateUtils.parseData(edit.getText().toString(),
                "yyyy", DateUtils.DEFAULT_EDIT_TEXT_DATE)));
        args.putInt(DateUtils.MONTH, Integer.parseInt(DateUtils.parseData(edit.getText().toString(),
                "MM", DateUtils.DEFAULT_EDIT_TEXT_DATE)) - 1);
        args.putInt(DateUtils.DAY, Integer.parseInt(DateUtils.parseData(edit.getText().toString(),
                "dd", DateUtils.DEFAULT_EDIT_TEXT_DATE)));
        date.setArguments(args);
        date.setCallBack(new DatePickerDialog.OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker datePicker, int year, int monthOfYear, int dayOfMonth) {
                edit.setText(DateUtils.changePickerDialog(dayOfMonth) + " / " + DateUtils.changePickerDialog(monthOfYear + 1)
                        + " / " + String.valueOf(year));
            }
        });
        date.show(getActivity().getSupportFragmentManager(), "Date Picker");
    }

    /**
     * Отображения диаолга выбора времени
     *
     * @param edit - TextView
     */
    private void showTimePicker(final TextView edit) {
        TimePickerFragment date = new TimePickerFragment();
        Bundle args = new Bundle();
        args.putInt(DateUtils.HOUR, Integer.parseInt(DateUtils.parseData(edit.getText().toString(),
                "HH", DateUtils.DEFAULT_EDIT_TEXT_TIME)));
        args.putInt(DateUtils.MINUTES, Integer.parseInt(DateUtils.parseData(edit.getText().toString(),
                "mm", DateUtils.DEFAULT_EDIT_TEXT_TIME)));
        date.setArguments(args);
        date.setCallBack(new TimePickerDialog.OnTimeSetListener() {
            @Override
            public void onTimeSet(TimePicker timePicker, int hour, int minute) {
                edit.setText(DateUtils.changePickerDialog(hour) + ":" + DateUtils.changePickerDialog(minute));
            }
        });
        date.show(getActivity().getSupportFragmentManager(), "Time Picker");
    }

    /**
     * Добавление имени фалйа в леяут со списком добавленных вложений
     *
     * @param attachmentName - текст вложения
     * @return - TextView
     */
    private TextView addFileName(String attachmentName) {
        final int pixelMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, getResources().getDisplayMetrics());
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
                LinearLayout.LayoutParams.WRAP_CONTENT);
        params.setMargins(0, pixelMargin, 0, pixelMargin);
        TextView fName = new TextView(getActivity());
        fName.setText(attachmentName);
        fName.setTextColor(getResources().getColor(R.color.default_blue_color));
        fName.setTypeface(Fonts.getRoman(getActivity()));
        fName.setLayoutParams(params);
        fName.setTag(attachmentName);
        fName.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                removeAddedFile(v.getTag().toString());
                return true;
            }
        });
        return fName;
    }

    /**
     * Метод вызываетя при долгом нажатии (лонгтап) на добавленный ранее файл
     *
     * @param fileName имя файла
     */
    private void removeAddedFile(String fileName) {
        showRemoveFileDialogItem(fileName);
    }

    /**
     * Метод отображает диалог с одним единственным пунктом "Удалить"
     *
     * @param fileName имя файла
     */
    private void showRemoveFileDialogItem(final String fileName) {
        String[] items = {"Удалить"};
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle(getString(R.string.deleting_file));
        builder.setItems(items, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int item) {
                showRemoveFileDialog(fileName);
            }
        });
        builder.setCancelable(true);
        builder.show();
    }

    /**
     * Метод отображает диалог спрашивающий пользователя действительно ли он хочет удалить выбранный файл с двумя кнопками (да/нет)
     *
     * @param fileName имя файла
     */
    private void showRemoveFileDialog(final String fileName) {
        AlertDialog.Builder ad = new AlertDialog.Builder(getActivity());
        ad.setTitle(getString(R.string.deleting_file));  // заголовок
        ad.setMessage(getString(R.string.are_u_sure_deleting_file_question));
        ad.setPositiveButton(getString(R.string.yes), new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int arg1) {
                // удаление имени файла из леяута
                for (int i = 0; i < addedFiles.getChildCount(); i++) {
                    if (((TextView) addedFiles.getChildAt(i)).getText().toString().equals(fileName)) {
                        addedFiles.removeViewAt(i);
                        break;
                    }
                }
                // удаление имени файла из массива добавленных файлов
                Iterator<String> iterator = fileNames.iterator();
                while (iterator.hasNext()) {
                    String fPath = iterator.next();
                    String fName = fPath.substring(fPath.lastIndexOf("/") + 1, fPath.length());
                    if (fName.equals(fileName)) {
                        iterator.remove();
                        break;
                    }
                }
            }
        });
        ad.setNegativeButton(getString(R.string.no), null);
        ad.setCancelable(true);
        ad.show();
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        // ответственный
        if (requestCode == SELECT_RESPONSIBLE && resultCode != Activity.RESULT_CANCELED) {
            String userName = data.getStringExtra(ActivityConst.USER_NAME);
            responsibleID = data.getStringExtra(ActivityConst.USER_ID);
            responsible.setText(userName);
            if (users != null) {
                users.setText("");
                selectedUsers = null;
            }
        } else if (requestCode == SELECT_AUTHOR && resultCode != Activity.RESULT_CANCELED) {
            String userName = data.getStringExtra(ActivityConst.USER_NAME);
            authorID = data.getStringExtra(ActivityConst.USER_ID);
            author.setText(userName);
        } else if (requestCode == SELECT_EXECUTORS && resultCode != Activity.RESULT_CANCELED) {
            UserSerializable userSerializable = (UserSerializable) data.getSerializableExtra(ActivityConst.USERS_ID);
            List<String> names = userSerializable.getNames();
            selectedUsers = userSerializable.getUsersID();
            users.setText(names.toString().replace("[", "").replace("]", ""));
        } else if (requestCode == ADD_PHOTO && resultCode != Activity.RESULT_CANCELED) {
            final String filePathPhoto = Utils.getNewPhotoName(photoFileName, getActivity().getBaseContext());
            fileNames.add(Environment.getExternalStorageDirectory() + "/" + Const.DIRECTORY_PHOTOS_NAME + "/" + filePathPhoto);
            addedFiles.addView(addFileName(filePathPhoto));
        }
    }

    /**
     * Возвращает текст работы
     *
     * @return string
     */
    public String getName() {
        if (nameWork != null) {
            return nameWork.getText().toString();
        } else {
            return null;
        }
    }

    /**
     * Возвращает UUID выбранного ответственного
     *
     * @return string
     */
    public String getResponsibleID() {
        if (responsibleID != null) {
            return responsibleID;
        } else {
            return null;
        }
    }

    /**
     * Возвращает UUID выбранного автора
     *
     * @return string
     */
    public String getAuthorID() {
        return authorID;
    }

    /**
     * Возвращает UUID'ы выбранных исполнителей
     *
     * @return string
     */
    public List<String> getSelectedUsers() {
        return selectedUsers;
    }

    /**
     * Возвращает дату создания работы
     *
     * @return string
     */
    public String getStartDate() {
        if (startDate != null && startTime != null) {
            return DateUtils.parseData(startDate.getText().toString() + " " + startTime.getText().toString(),
                    DateUtils.DEFAULT_DATE_FORMAT, DateUtils.DEFAULT_EDIT_TEXT_DATE + " " + DateUtils.DEFAULT_EDIT_TEXT_TIME);
        } else {
            return null;
        }
    }

    /**
     * Возвращает дату завершения работы
     *
     * @return string
     */
    public String getFinishDate() {
        if (finishDate != null && finishTime != null) {
            return DateUtils.parseData(finishDate.getText().toString() + " " + finishTime.getText().toString(),
                    DateUtils.DEFAULT_DATE_FORMAT, DateUtils.DEFAULT_EDIT_TEXT_DATE + " " + DateUtils.DEFAULT_EDIT_TEXT_TIME);
        } else {
            return null;
        }
    }

    /**
     * Возвращает выбранный приоритет
     *
     * @return string
     */
    public String getPriority() {
        return selectedPriority;
    }

    /**
     * Возвращает UUID выбранной формы завершения
     *
     * @return string
     */
    public String getCompletionFormID() {
        return formCompletionID;
    }

    /**
     * Возвращает комментарий добавленный пользователем при создании работы
     *
     * @return string
     */
    public String getComment() {
        if (comment != null) {
            return comment.getText().toString();
        } else {
            return null;
        }
    }

    /**
     * Возвращает список путей добавленных файлов
     *
     * @return string
     */
    public List<String> getFiles() {
        return fileNames;
    }
}
