package com.unicorn.hgzero.meeting.infra.controller;

import com.unicorn.hgzero.common.dto.ApiResponse;
import com.unicorn.hgzero.meeting.infra.dto.response.TemplateListResponse;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 템플릿 관리API Controller
 * 고정된 템플릿 목록을 제공합니다
 */
@RestController
@RequestMapping("/api/meetings/templates")
@RequiredArgsConstructor
@Slf4j
@Tag(name = "Template", description = "템플릿 관리 API")
public class TemplateController {

    /**
     * 템플릿 목록 조회 (고정 데이터 반환)
     * GET /api/templates
     */
    @GetMapping
    @Operation(summary = "템플릿 목록 조회", description = "사용 가능한 템플릿 목록을 조회합니다")
    @ApiResponses(value = {
            @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "조회 성공"),
            @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "잘못된 요청"),
            @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "401", description = "인증 실패")
    })
    public ResponseEntity<ApiResponse<TemplateListResponse>> getTemplateList(
            @RequestHeader("X-User-Id") String userId,
            @RequestHeader("X-User-Name") String userName) {

        log.info("템플릿 목록 조회 요청 - userId: {}", userId);

        try {
            // 고정된 템플릿 데이터 생성
            List<TemplateListResponse.TemplateItem> templateItems = createFixedTemplates();

            TemplateListResponse response = TemplateListResponse.builder()
                    .templateList(templateItems)
                    .totalCount(templateItems.size())
                    .build();

            log.info("템플릿 목록 조회 성공 - count: {}", templateItems.size());
            return ResponseEntity.ok(ApiResponse.success(response));

        } catch (Exception e) {
            log.error("템플릿 목록 조회 실패", e);
            return ResponseEntity.badRequest()
                    .body(ApiResponse.errorWithType("템플릿 목록 조회에 실패했습니다"));
        }
    }

    /**
     * 고정된 템플릿 데이터 생성
     */
    private List<TemplateListResponse.TemplateItem> createFixedTemplates() {
        List<TemplateListResponse.TemplateItem> templates = new ArrayList<>();
        
        // 일반 회의 템플릿
        templates.add(TemplateListResponse.TemplateItem.builder()
                .templateId("general")
                .name("일반 회의")
                .description("기본 회의록 형식")
                .category("meeting")
                .icon("📋")
                .isActive(true)
                .usageCount(0)
                .createdAt(LocalDateTime.now())
                .lastUsedAt(null)
                .createdBy("system")
                .sections(Arrays.asList(
                        createSectionInfo("회의 개요", "회의 기본 정보", 1, true),
                        createSectionInfo("논의 사항", "주요 논의 내용", 2, true),
                        createSectionInfo("결정 사항", "회의에서 결정된 사항", 3, true),
                        createSectionInfo("액션 아이템", "향후 진행할 작업", 4, true)
                ))
                .build());
        
        // 스크럼 회의 템플릿
        templates.add(TemplateListResponse.TemplateItem.builder()
                .templateId("scrum")
                .name("스크럼 회의")
                .description("데일리 스탠드업 형식")
                .category("agile")
                .icon("🏃")
                .isActive(true)
                .usageCount(0)
                .createdAt(LocalDateTime.now())
                .lastUsedAt(null)
                .createdBy("system")
                .sections(Arrays.asList(
                        createSectionInfo("어제 한 일", "지난 작업일에 완료한 작업", 1, true),
                        createSectionInfo("오늘 할 일", "오늘 진행할 예정 작업", 2, true),
                        createSectionInfo("블로커/이슈", "진행을 방해하는 요소", 3, false)
                ))
                .build());
        
        // 킥오프 회의 템플릿
        templates.add(TemplateListResponse.TemplateItem.builder()
                .templateId("kickoff")
                .name("킥오프 회의")
                .description("프로젝트 시작 회의")
                .category("project")
                .icon("🚀")
                .isActive(true)
                .usageCount(0)
                .createdAt(LocalDateTime.now())
                .lastUsedAt(null)
                .createdBy("system")
                .sections(Arrays.asList(
                        createSectionInfo("프로젝트 개요", "프로젝트 기본 정보", 1, true),
                        createSectionInfo("목표 및 범위", "프로젝트 목표와 범위", 2, true),
                        createSectionInfo("역할 및 책임", "팀원별 역할과 책임", 3, true),
                        createSectionInfo("일정 및 마일스톤", "프로젝트 일정", 4, true)
                ))
                .build());
        
        // 주간 회의 템플릿
        templates.add(TemplateListResponse.TemplateItem.builder()
                .templateId("weekly")
                .name("주간 회의")
                .description("주간 리뷰 및 계획")
                .category("review")
                .icon("📅")
                .isActive(true)
                .usageCount(0)
                .createdAt(LocalDateTime.now())
                .lastUsedAt(null)
                .createdBy("system")
                .sections(Arrays.asList(
                        createSectionInfo("지난주 성과", "지난주 달성한 성과", 1, true),
                        createSectionInfo("이번주 계획", "이번주 진행할 계획", 2, true),
                        createSectionInfo("주요 이슈", "해결이 필요한 이슈", 3, false),
                        createSectionInfo("다음 액션", "다음 주 액션 아이템", 4, true)
                ))
                .build());
        
        return templates;
    }

    /**
     * 템플릿 섹션 정보 생성 헬퍼 메서드
     */
    private TemplateListResponse.TemplateSectionInfo createSectionInfo(
            String title, String description, int orderIndex, boolean isRequired) {
        return TemplateListResponse.TemplateSectionInfo.builder()
                .title(title)
                .description(description)
                .orderIndex(orderIndex)
                .isRequired(isRequired)
                .build();
    }
}