package com.unicorn.hgzero.notification.controller;

import com.unicorn.hgzero.notification.domain.NotificationSetting;
import com.unicorn.hgzero.notification.dto.request.UpdateSettingsRequest;
import com.unicorn.hgzero.notification.dto.response.SettingsResponse;
import com.unicorn.hgzero.notification.repository.NotificationSettingRepository;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

/**
 * 알림 설정 API Controller
 *
 * 사용자별 알림 설정 조회 및 업데이트 API 제공
 * 채널 활성화, 알림 유형, 방해 금지 시간대 관리
 *
 * @author 준호 (Backend Developer)
 * @version 1.0
 * @since 2025-10-23
 */
@Slf4j
@RestController
@RequestMapping("/notifications/settings")
@RequiredArgsConstructor
@Tag(name = "Notification Settings", description = "알림 설정 API")
public class NotificationSettingsController {

    private final NotificationSettingRepository settingRepository;

    /**
     * 알림 설정 조회
     *
     * @param userId 사용자 ID
     * @return 알림 설정 정보
     */
    @Operation(summary = "알림 설정 조회", description = "사용자의 알림 설정을 조회합니다")
    @ApiResponses(value = {
        @ApiResponse(
            responseCode = "200",
            description = "조회 성공",
            content = @Content(schema = @Schema(implementation = SettingsResponse.class))
        ),
        @ApiResponse(responseCode = "404", description = "설정을 찾을 수 없음"),
        @ApiResponse(responseCode = "500", description = "서버 오류")
    })
    @GetMapping
    public ResponseEntity<SettingsResponse> getSettings(
        @Parameter(description = "사용자 ID", required = true)
        @RequestParam String userId
    ) {
        log.info("알림 설정 조회 - UserId: {}", userId);

        NotificationSetting setting = settingRepository.findByUserId(userId)
            .orElseGet(() -> {
                // 설정이 없으면 기본 설정 생성
                log.info("알림 설정이 없어 기본 설정 생성 - UserId: {}", userId);
                NotificationSetting defaultSetting = NotificationSetting.builder()
                    .userId(userId)
                    .build();
                return settingRepository.save(defaultSetting);
            });

        SettingsResponse response = SettingsResponse.from(setting);

        log.info("알림 설정 조회 완료 - UserId: {}", userId);
        return ResponseEntity.ok(response);
    }

    /**
     * 알림 설정 업데이트
     *
     * @param userId 사용자 ID
     * @param request 업데이트할 설정 정보
     * @return 업데이트된 알림 설정 정보
     */
    @Operation(summary = "알림 설정 업데이트", description = "사용자의 알림 설정을 업데이트합니다")
    @ApiResponses(value = {
        @ApiResponse(
            responseCode = "200",
            description = "업데이트 성공",
            content = @Content(schema = @Schema(implementation = SettingsResponse.class))
        ),
        @ApiResponse(responseCode = "400", description = "잘못된 요청"),
        @ApiResponse(responseCode = "500", description = "서버 오류")
    })
    @PutMapping
    public ResponseEntity<SettingsResponse> updateSettings(
        @Parameter(description = "사용자 ID", required = true)
        @RequestParam String userId,

        @Parameter(description = "업데이트할 설정 정보", required = true)
        @Valid @RequestBody UpdateSettingsRequest request
    ) {
        log.info("알림 설정 업데이트 - UserId: {}", userId);

        NotificationSetting setting = settingRepository.findByUserId(userId)
            .orElseGet(() -> {
                // 설정이 없으면 새로 생성
                log.info("알림 설정이 없어 신규 생성 - UserId: {}", userId);
                NotificationSetting newSetting = NotificationSetting.builder()
                    .userId(userId)
                    .build();
                return newSetting;
            });

        // 설정 업데이트
        setting.setEmailEnabled(request.getEmailEnabled());
        setting.setSmsEnabled(request.getSmsEnabled());
        setting.setPushEnabled(request.getPushEnabled());
        setting.setInvitationEnabled(request.getInvitationEnabled());
        setting.setTodoAssignedEnabled(request.getTodoAssignedEnabled());
        setting.setTodoReminderEnabled(request.getTodoReminderEnabled());
        setting.setMeetingReminderEnabled(request.getMeetingReminderEnabled());
        setting.setMinutesUpdatedEnabled(request.getMinutesUpdatedEnabled());
        setting.setTodoCompletedEnabled(request.getTodoCompletedEnabled());
        setting.setDndEnabled(request.getDndEnabled());
        setting.setDndStartTime(request.getDndStartTime());
        setting.setDndEndTime(request.getDndEndTime());

        NotificationSetting savedSetting = settingRepository.save(setting);

        SettingsResponse response = SettingsResponse.from(savedSetting);

        log.info("알림 설정 업데이트 완료 - UserId: {}", userId);
        return ResponseEntity.ok(response);
    }
}
