package com.hepl.tunefortwo.dto;

import java.time.Clock;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;

import org.springframework.web.multipart.MultipartFile;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.hepl.tunefortwo.config.jackson.ForceStringDeserializer;
import com.hepl.tunefortwo.utils.ValidPhoneNumber;

import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.media.Schema.AccessMode;
import jakarta.validation.constraints.FutureOrPresent;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;
import jakarta.validation.constraints.Size;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
@Builder
//@JsonInclude(value = Include.NON_NULL)
public class FormRequestDto {
    @Schema(accessMode = AccessMode.READ_ONLY)
    private String id;
    @NotBlank(message = "{validation.user.usernameCannotBeEmpty}")
    @Size(max = 60, message = "{validation.user.usernameMustBeMaximumOf_60Characters}")
    @Pattern(regexp = "^[a-zA-Z\\s]*$", message = "{validation.user.usernameCannotContainSpecialCharacters}")
    @Schema(accessMode = AccessMode.READ_WRITE)
	private String name;
    @Schema(requiredMode = Schema.RequiredMode.REQUIRED,accessMode = AccessMode.READ_WRITE)
    @Pattern(regexp = "^[a-z0-9]{1,25}(?:[._+][a-z0-9]+)*@[a-z0-9.-]+\\.[a-z]{2,}$", message = "{validation.user.emailIsInvalid}")
	private String mail;
    @NotBlank(message = "{validation.user.mobileCannotBeEmpty}")
//    @Pattern(regexp = "^[+]*[(]?\\d{1,4}[)]?[-\\s\\./0-9]{10,15}$", message = "{validation.user.mobileNoIsInvalid}")
    @Schema(requiredMode = Schema.RequiredMode.REQUIRED, description = "Encrypt data using AES/GCM")
    @JsonDeserialize(using = ForceStringDeserializer.class)
//    @ValidPhoneNumber
	private String phonenumber;
    @Schema(requiredMode = Schema.RequiredMode.REQUIRED)
	private String instrument;
    @Schema(requiredMode = Schema.RequiredMode.REQUIRED)
	private String mood;
    @Schema(requiredMode = Schema.RequiredMode.REQUIRED)
	private String lanuage;	
    @Schema(requiredMode = Schema.RequiredMode.REQUIRED)
	private String artist;
    @Schema(requiredMode = Schema.RequiredMode.REQUIRED)
	private String songto;
    @Schema(requiredMode = Schema.RequiredMode.REQUIRED)
	private String songfrom;
    @Schema(requiredMode = Schema.RequiredMode.REQUIRED)
	private String occasion;
    @Schema(requiredMode = Schema.RequiredMode.REQUIRED)
    @Size(min = 0, max = 750,  message = "{validation.user.userstoryMustBeMaximumOf_750Characters}")
	private String story;
	@Schema(accessMode = AccessMode.WRITE_ONLY, description = "Clip file MP3 format", required = false)
    @NotNull(message = "Clip file must be provided")
	private MultipartFile clip;
	@Schema(accessMode = AccessMode.READ_WRITE)
	private Double clipDuration ;
    @Schema(accessMode = AccessMode.READ_ONLY)
    private String clipPath;
    @Schema(accessMode = AccessMode.READ_ONLY)
    private String orderNumber;
    @Schema(accessMode = AccessMode.READ_ONLY)
	private String screenshot;
    @Schema(accessMode = AccessMode.READ_ONLY)
	private LocalDateTime createdDate;
    @Schema(accessMode = AccessMode.WRITE_ONLY)
    private MixtureMaster masterRequest;
    @Schema(accessMode = AccessMode.READ_ONLY)
    private String status;
    @Schema(accessMode=AccessMode.READ_WRITE)
    @FutureOrPresent(message = "{validation.user.usercustomerDeliveryDateShouldBeInPresentorFuture}")
    private LocalDate customerDeliveryDate;
    @Schema(accessMode = AccessMode.READ_ONLY)
    @FutureOrPresent(message =  "{validation.user.userDeliveryDateShouldBeInPresentorFuture}")
	private LocalDate deliveryDate;
    @Schema(accessMode = AccessMode.READ_ONLY)
    private List<OrderTrackerDto> orderPosition;
    @Schema(accessMode=AccessMode.READ_ONLY)
    private String durationInMMSS;
    @Schema(accessMode = AccessMode.READ_ONLY)
    @Size(min = 0, max = 750,  message = "{validation.user.usercommentsMustBeMaximumOf_750Characters}")
    private String comments;
    @Schema(accessMode = AccessMode.READ_ONLY)
    private String mixtureMaster;
    @Schema(accessMode = AccessMode.READ_ONLY)
    private String rating;
    @Schema(accessMode = AccessMode.READ_ONLY)
    @Size(min = 0, max = 750,  message = "{validation.user.userreviewMustBeMaximumOf_750Characters}")
    private String review;
    @Schema(accessMode = AccessMode.READ_ONLY)
    private List<String> images;
    @Schema(accessMode = AccessMode.READ_ONLY)
    private String adminClipPath;
    @Schema(accessMode = AccessMode.READ_ONLY)
    private String videoPath;
    @Schema(accessMode = AccessMode.READ_WRITE)
    private Double orderTotal;
    @Schema(accessMode = AccessMode.READ_ONLY)
    private String activeStatus;
    @Schema(accessMode = AccessMode.READ_ONLY)
    private String paymentId;
    @Schema(accessMode = AccessMode.READ_ONLY)
    private String paymentStatus;
    @Schema(accessMode = AccessMode.READ_ONLY)
    private String paymentOrderId;
}
