package com.example.todolist.form;

import java.sql.Date;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;

import org.springframework.context.i18n.LocaleContextHolder;

import com.example.todolist.entity.Todo;
import lombok.Data;
import java.util.List;
import javax.validation.Valid;
import com.example.todolist.common.Utils;
import com.example.todolist.entity.AttachedFile;
import com.example.todolist.entity.Category;
import com.example.todolist.entity.Groups;
import com.example.todolist.entity.Task;
import java.util.ArrayList;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
public class TodoData {
	private Integer id;
	private Integer ownerId;

	@NotBlank
	private String title;

	@NotNull
	private Integer importance;

	@Min(value = 0)
	private Integer urgency;

	private String deadline;
	private String done;

	@Min(value = 1)
	private String categoryCode;

	@Valid
	private List<TaskData> taskList;

	private Integer groupsId;
	private Integer completedTasks = 0;
	private Integer version = 0;
	
	private TaskData newTask;

	private List<AttachedFileData> attachedFileList;

	// ToDo入力画面(todoForm.html)に入力された内容からTodoエンティティを作成
	public Todo toEntity() {
		Todo todo = new Todo();
		// ToDo部分
		todo.setId(id);
		todo.setOwnerId(ownerId);
		todo.setTitle(title);
		todo.setImportance(importance);
		todo.setUrgency(urgency);
		todo.setDone(done);
		String locale = LocaleContextHolder.getLocale().toString();
		todo.setCategory(new Category(categoryCode, locale));
		todo.setGroups(new Groups(groupsId));
		todo.setCompletedTasks(completedTasks);
		todo.setVersion(version);
		todo.setIsDeleted("N"); // 追加
		
		SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy-MM-dd");
		long ms;
		try {
			ms = sdFormat.parse(deadline).getTime();
			todo.setDeadline(new Date(ms));
		} catch (ParseException e) {
			todo.setDeadline(null);
		}

		// Task部分
		Date date;
		Task task;
		if (taskList != null) {
			for (TaskData taskData : taskList) {
				date = Utils.str2dateOrNull(taskData.getDeadline());
				task = new Task(taskData.getId(), 
						null, 
						taskData.getTitle(), 
						date, 
						taskData.getDone(),
						taskData.getAssignedTo(),
						Integer.parseInt(taskData.getProgress()),
						taskData.getVersion(),
						"N"); // 追加
				// Todoと関連付け
				todo.addTask(task);
			}
		}

		return todo;
	}

	// Todo/AttachedFileエンティティからToDo入力画面(todoForm.html)へ渡すTodoDataを作成
	public TodoData(Todo todo, List<AttachedFile> attachedFiles) {
		// Todo部分
		this.id = todo.getId();
		this.ownerId = todo.getOwnerId();
		this.title = todo.getTitle();
		this.importance = todo.getImportance();
		this.urgency = todo.getUrgency();
		this.deadline = Utils.date2str(todo.getDeadline());
		this.done = todo.getDone();
		this.categoryCode = todo.getCategory().getPkey().getCode();
		this.groupsId = todo.getGroups().getId();
		this.completedTasks = todo.getCompletedTasks();
		this.version = todo.getVersion();
		
		// 登録済Task一覧
		this.taskList = new ArrayList<>();
		String dt;
		for (Task task : todo.getTaskList()) {
			dt = Utils.date2str(task.getDeadline());
			this.taskList.add(
				new TaskData(task.getId(), 
					task.getTitle(), 
					dt, 
					task.getDone(),
					task.getAssignedTo(),
					"" + task.getProgress(),
					task.getVersion()));

		}

		// 新規登録用Task
		newTask = new TaskData();

		// 添付ファイル
		attachedFileList = new ArrayList<>();
		String fileName;
		String fext;
		String contentType;
		boolean isOpenNewWindow;
		for (AttachedFile af : attachedFiles) {
			// ファイル名
			fileName = af.getFileName();
			// 拡張子
			fext = fileName.substring(fileName.lastIndexOf(".") + 1);
			// Content-Type
			contentType = Utils.ext2contentType(fext);
			// 別Windowで表示するか？
			isOpenNewWindow = contentType.equals("") ? false : true;
			attachedFileList.add(new AttachedFileData(af.getId(), fileName, af.getNote(), isOpenNewWindow));
		}
	}

	// ToDo入力画面(todoForm.html)新規タスク入力行の内容からエンティティを作成
	public Task toTaskEntity() {
		Task task = new Task();
		task.setId(newTask.getId());
		task.setTitle(newTask.getTitle());
		task.setDone(newTask.getDone());
		task.setDeadline(Utils.str2date(newTask.getDeadline()));
		task.setAssignedTo(newTask.getAssignedTo());
		task.setProgress(Integer.parseInt(newTask.getProgress()));
		task.setVersion(newTask.getVersion());
		task.setIsDeleted("N"); // 追加
		
		return task;
	}

}
