package incheon.ags.ias.linkData.web.dto;

import incheon.ags.ias.linkData.vo.LinkDataVO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;

import javax.validation.constraints.NotBlank;
import java.time.LocalDateTime;
import java.util.List;

@Getter
@Setter
@ToString
public class LinkDataRequestDTO {

    @Schema(description = "연계 ID", example = "LINK_001", required = true)
    @NotBlank(message = "연계ID는 필수 항목입니다.")
    private String linkId;

    @Schema(description = "연계 그룹 코드", example = "인천LDAP")
    private String linkGroupNm;

    @Schema(description = "연계명", example = "사용자정보연계", required = true)
    @NotBlank(message = "연계명은 필수 항목입니다.")
    private String linkNm;

    @Schema(description = "연계 유형 코드", example = "API", required = true)
    @NotBlank(message = "연계 유형 코드는 필수 항목입니다.")
    private String linkTypeCd;

    @Schema(description = "제공 기관명", example = "행정안전부")
    private String pvsnInstNm;

    @Schema(description = "제공 시스템명", example = "시도LDAP시스템", required = true)
    @NotBlank(message = "제공 시스템명은 필수 항목입니다.")
    private String pvsnSysNm;

    @Schema(description = "주기 코드", example = "DD", required = true)
    @NotBlank(message = "주기 코드는 필수 항목입니다.")
    private String cycleCd;

    @Schema(description = "최종 연계 상태 코드", example = "SUCCESS")
    private String lastLinkStcd;

    @Schema(description = "이용 시스템명", example = "공간정보 행정포털,나의지도레시피,공간정보포털")
    private String utztnSysNm;

    @Schema(description = "사용 여부", example = "Y", required = true)
    @NotBlank(message = "사용 여부는 필수 항목입니다.")
    private String useYn;

    @Schema(description = "연계 방향 코드", example = "RECV")
    private String linkDrcCd;

    @Schema(description = "연결 방식 코드", example = "HTTPS")
    private String lnkgMthCd;

    @Schema(description = "연결 주소", example = "https://api.ldap.go.kr", required = true)
    @NotBlank(message = "연결 주소는 필수 항목입니다.")
    private String lnkgAddr;

    @Schema(description = "인증명", example = "Bearer token")
    private String certNm;

    @Schema(description = "연결 대상명", example = "/v1/user/info")
    private String lnkgTrgtNm;

    @Schema(description = "비고 내용", example = "일일 호출 제한 10,000회, 인증토큰 월 1회 갱신 필요")
    private String rmrkCn;

    @Schema(description = "수동 가능 여부", example = "Y", required = true)
    @NotBlank(message = "호출 가능 여부는 필수 항목입니다.")
    private String hoprPsbltyYn;

    @Schema(description = "수동 유형 코드", example = "REST")
    private String hoprTypeCd;

    @Schema(description = "최초 등록자 ID", example = "ADMIN")
    private String frstRegId;

    @Schema(description = "최초 등록 일시", example = "2025-01-15T09:00:00")
    @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
    private LocalDateTime frstRegDt;

    @Schema(description = "최종 수정자 ID", example = "ADMIN")
    private String lastMdfcnId;

    @Schema(description = "파일ID")
    private String atchFileId;

    @Schema(description = "최종 수정 일시", example = "2025-01-16T10:00:00")
    @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
    private LocalDateTime lastMdfcnDt;

    @Schema(description = "METADATA 목록 (create, update, delete)")
    private MetadataCUD metadata;

    @Schema(description = "API 데이터 목록 (create, update, delete)")
    private ApiDataCUD apiData;


    // 내부 클래스: Metadata CUD 구조
    @Getter
    @Setter
    @ToString
    public static class MetadataCUD {
        private List<MetadataItem> create;
        private List<MetadataItem> update;
        private List<String> delete;
    }
    
    // 내부 클래스: Metadata 항목
    @Getter
    @Setter
    @ToString
    public static class MetadataItem {
        private String linkId;
        private String metdataSn;
        private String sortSeq;
        private String metdataNm;
        private String metdataPhysNm;
        private String metdataExpln;
        private String metdataTyNm;
        private String metdataLenCnt;
        private String metdataEsntlYn;
        private String metdataDfltNm;
    }
    
    // 내부 클래스: API Data CUD 구조
    @Getter
    @Setter
    @ToString
    public static class ApiDataCUD {
        private List<ApiDataItem> create;
        private List<ApiDataItem> update;
        private List<String> delete;
    }
    
    // 내부 클래스: API Data 항목
    @Getter
    @Setter
    @ToString
    public static class ApiDataItem {
        private String linkId;
        private String linkMetdataDmndSn;
        private String dmndTypeCd;
        private String dmndKeyNm;
        private String dmndVlNm;
        private String dmndTyNm;
        private String dmndEsntlYn;
    }

    public LinkDataVO toEntity() {
        LinkDataVO vo = new LinkDataVO();
        vo.setLinkId(this.linkId);
        vo.setLinkGroupNm(this.linkGroupNm);
        vo.setLinkNm(this.linkNm);
        vo.setLinkTypeCd(this.linkTypeCd);
        vo.setPvsnInstNm(this.pvsnInstNm);
        vo.setPvsnSysNm(this.pvsnSysNm);
        vo.setCycleCd(this.cycleCd);
        vo.setLastLinkStcd(this.lastLinkStcd);
        vo.setUtztnSysNm(this.utztnSysNm);
        vo.setUseYn(this.useYn);
        vo.setLinkDrcCd(this.linkDrcCd);
        vo.setLnkgMthCd(this.lnkgMthCd);
        vo.setLnkgAddr(this.lnkgAddr);
        vo.setCertNm(this.certNm);
        vo.setLnkgTrgtNm(this.lnkgTrgtNm);
        vo.setRmrkCn(this.rmrkCn);
        vo.setHoprPsbltyYn(this.hoprPsbltyYn);
        vo.setHoprTypeCd(this.hoprTypeCd);
        vo.setAtchFileId(this.atchFileId);
        vo.setFrstRegId(this.frstRegId);
        vo.setLastMdfcnId(this.lastMdfcnId);
        return vo;
    }
}
