package com.project.whatsappchatbot.model;

import lombok.Data;
import lombok.Getter;
import lombok.Setter;

import javax.persistence.*;
import java.sql.Date;
import java.sql.Timestamp;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

@Entity
@Data
@Getter
@Setter
@Table(name = "orders")
public class Order {
    private static Map<String, Long> status2ToStatusIdMap = new HashMap<>();
    private static Map<Long, String> statusIdToStatus2Map = new HashMap<>();


    static {
        status2ToStatusIdMap.put("Confirmed", 2L);
        status2ToStatusIdMap.put("Progress", 5L);
        status2ToStatusIdMap.put("Complete", 6L);
        status2ToStatusIdMap.put("Cancelled", 8L);

        statusIdToStatus2Map.put(2L, "Confirmed");
        statusIdToStatus2Map.put(5L, "Progress");
        statusIdToStatus2Map.put(6L, "Complete");
        statusIdToStatus2Map.put(8L, "Cancelled");
    }


    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String description;
    private String paymentStatus;
    private String paymentMode;
    private String paymentMethod;
    private String paymentIdentifier;
    @OneToOne
    @JoinColumn(name = "status_id")
    private Status status;
    private Integer isPaid;
    @Column(name = "require_pickup", nullable = false)
    private Integer requirePickup;
    @Column(name = "service_id", nullable = false)
    private Long serviceId;
    @OneToOne
    @JoinColumn(name = "vehicle_id")
    private Vehicle vehicle;
    @OneToOne
    @JoinColumn(name = "address_id")
    private Address address;
    @Column(name = "coupon_id")
    private Long couponId;
    private Date date;
    private String time;
    @Column(name = "total_price")
    private String totalPrice;
    @Column(name = "device_platform")
    private String devicePlatform;
    @OneToOne
    @JoinColumn(name = "order_cancellation_reason_id")
    private OrderCancellationReason orderCancellationReason;
    @OneToOne
    @JoinColumn(name = "user_id")
    private Customer user;
    private Long createdBy;
    @Column(name = "created_at")
    private Timestamp createdAt;
    @Column(name = "updated_at")
    private Timestamp updatedAt;
    @OneToOne
    @JoinColumn(name = "invoiceid")
    private Invoice invoice;
    private Long mechanicId;
    @Column(name = "created_by_bot")
    private Integer createdByBot;

    public String getStatus2() {
        return status.getTitle();
    }

    public String getDateAndTime() {
        return String.format("Date %s and time %s", date.toString(), time);
    }

    @Override
    public boolean equals(Object o) {
        if (o == null || getClass() != o.getClass()) return false;
        Order order = (Order) o;
        return Objects.equals(id, order.id);
    }

    @Override
    public int hashCode() {
        return Objects.hashCode(id);
    }

    @Override
    public String toString() {
        return "Order{" +
                "id=" + id +
                ", description='" + description + '\'' +
                ", paymentStatus='" + paymentStatus + '\'' +
                ", paymentMode='" + paymentMode + '\'' +
                ", paymentMethod='" + paymentMethod + '\'' +
                ", paymentIdentifier='" + paymentIdentifier + '\'' +
                ", statusId=" + status +
                ", isPaid=" + isPaid +
                ", requirePickup=" + requirePickup +
                ", serviceId=" + serviceId +
                ", vehicle=" + vehicle +
                ", address=" + address +
                ", couponId=" + couponId +
                ", date=" + date +
                ", time='" + time + '\'' +
                ", totalPrice='" + totalPrice + '\'' +
                ", devicePlatform='" + devicePlatform + '\'' +
                ", orderCancellationReason=" + orderCancellationReason +
                ", user=" + user +
                ", createdBy=" + createdBy +
                ", createdAt=" + createdAt +
                ", updatedAt=" + updatedAt +
                ", invoice=" + invoice +
                ", mechanicId=" + mechanicId +
                '}';
    }

    @PrePersist
    protected void onCreate() {
        createdAt = new Timestamp(System.currentTimeMillis());
    }

    @PreUpdate
    protected void onUpdate() {
        updatedAt = new Timestamp(System.currentTimeMillis());
    }

    public void setDateAndTime(String dateTime) {

    }
}
