package kr.co.zioinfo.web.controller;

import kr.co.zioinfo.web.model.CompanyHistory;
import kr.co.zioinfo.web.model.Faq;
import kr.co.zioinfo.web.model.Inquiry;
import kr.co.zioinfo.web.model.News;
import kr.co.zioinfo.web.repository.CompanyHistoryRepository;
import kr.co.zioinfo.web.repository.FaqRepository;
import kr.co.zioinfo.web.repository.RecruitRepository;
import kr.co.zioinfo.web.service.InquiryService;
import kr.co.zioinfo.web.service.NewsService;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.*;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import jakarta.validation.Valid;
import java.util.*;

@RestController
@RequestMapping("/api")
@RequiredArgsConstructor
public class ApiController {

    private final NewsService newsService;
    private final InquiryService inquiryService;
    private final RecruitRepository recruitRepo;
    private final CompanyHistoryRepository historyRepo;
    private final FaqRepository faqRepo;

    // ── 회사 정보 ────────────────────────────────────────────────
    @GetMapping("/company")
    public ResponseEntity<Map<String, Object>> getCompanyInfo() {
        Map<String, Object> info = new LinkedHashMap<>();
        info.put("name", "(주)지오정보기술");
        info.put("ceo", "대표이사");
        info.put("founded", "2000년");
        info.put("address", "서울특별시");
        info.put("phone", "02-000-0000");
        info.put("email", "info@zioinfo.co.kr");
        info.put("business", Arrays.asList(
            Map.of("name", "GUARDiA ITSM", "desc", "AI 기반 레거시 인프라 자율 운영 플랫폼"),
            Map.of("name", "ERP 솔루션", "desc", "기업 자원관리 시스템"),
            Map.of("name", "SI 구축", "desc", "정보화사업 시스템 통합"),
            Map.of("name", "IT 인프라", "desc", "인프라 구축 및 운영")
        ));
        return ResponseEntity.ok(info);
    }

    // ── 연혁 (DB 기반) ───────────────────────────────────────────
    @GetMapping("/history")
    public ResponseEntity<List<Map<String, Object>>> getHistory() {
        List<CompanyHistory> rows = historyRepo.findByVisibleTrueOrderByYearDescSortOrderAsc();

        // 연도별 그룹핑
        Map<String, List<String>> grouped = new LinkedHashMap<>();
        for (CompanyHistory h : rows) {
            grouped.computeIfAbsent(h.getYear(), k -> new ArrayList<>()).add(h.getContent());
        }

        List<Map<String, Object>> result = new ArrayList<>();
        for (Map.Entry<String, List<String>> e : grouped.entrySet()) {
            Map<String, Object> m = new LinkedHashMap<>();
            m.put("year", e.getKey());
            m.put("items", e.getValue());
            result.add(m);
        }
        return ResponseEntity.ok(result);
    }

    // ── GUARDiA 솔루션 정보 ───────────────────────────────────────
    @GetMapping("/solutions/guardia")
    public ResponseEntity<Map<String, Object>> getGuardiaInfo() {
        Map<String, Object> g = new LinkedHashMap<>();
        g.put("name", "GUARDiA ITSM");
        g.put("tagline", "AI 기반 레거시 인프라 자율 운영 플랫폼");
        g.put("description",
            "1,000개 이상 관공서 레거시 인프라를 대상으로 하는 AI 기반 통합 ChatOps 오케스트레이션 플랫폼. " +
            "메신저 한 줄 명령으로 에이전트리스 배포·운영을 자동화합니다.");
        g.put("keyFeatures", Arrays.asList(
            Map.of("icon", "🤖", "title", "AI 에이전트 자동화",
                "desc", "Ollama 온프레미스 sLLM 기반 자연어 명령 → 자동 배포·운영"),
            Map.of("icon", "🔧", "title", "에이전트리스 아키텍처",
                "desc", "대상 서버에 소프트웨어 설치 없이 SSH/SFTP만으로 관리"),
            Map.of("icon", "💬", "title", "ChatOps 메신저 통합",
                "desc", "카카오워크·네이버웍스·슬랙 등 메신저에서 직접 인프라 제어"),
            Map.of("icon", "📊", "title", "통합 ITSM 대시보드",
                "desc", "SR·인시던트·변경관리·SLA·CMDB 전체를 하나의 플랫폼에서"),
            Map.of("icon", "🔒", "title", "엔터프라이즈 보안",
                "desc", "AES-256-GCM 암호화, MFA, PAM, 불변 감사로그, Zero Trust"),
            Map.of("icon", "🏗️", "title", "PMS (프로젝트 관리)",
                "desc", "WBS·산출물·일주월 보고서 자동 생성, 이슈·위험 관리")
        ));
        g.put("editions", Arrays.asList(
            Map.of("name", "COMMUNITY", "price", "무료", "target", "소규모 기관",
                "features", List.of("기본 SR 관리", "CMDB", "대시보드")),
            Map.of("name", "STANDARD", "price", "협의", "target", "중형 기관",
                "features", List.of("전체 ITSM", "AI 에이전트", "LDAP/MFA", "SLA")),
            Map.of("name", "ENTERPRISE", "price", "협의", "target", "대형 관공서",
                "features", List.of("무제한", "취약점 스캔", "Scouter APM", "FinOps", "전담 지원"))
        ));
        g.put("techStack", Map.of(
            "backend", "Python 3.11 / FastAPI",
            "ai", "Ollama (온프레미스 sLLM, 외부 API 완전 금지)",
            "infra", "paramiko SSH/SFTP (에이전트리스)",
            "db", "PostgreSQL / SQLite",
            "frontend", "React.js / PWA"
        ));
        return ResponseEntity.ok(g);
    }

    // ── 소식 목록 ────────────────────────────────────────────────
    @GetMapping("/news")
    public ResponseEntity<Page<News>> getNews(
            @RequestParam(defaultValue = "0") int page,
            @RequestParam(defaultValue = "6") int size,
            @RequestParam(required = false) String category) {
        Pageable pageable = PageRequest.of(page, size, Sort.by("createdAt").descending());
        return ResponseEntity.ok(newsService.findAll(category, pageable));
    }

    @GetMapping("/news/{id}")
    public ResponseEntity<News> getNewsDetail(@PathVariable Long id) {
        return newsService.findById(id)
            .map(ResponseEntity::ok)
            .orElse(ResponseEntity.notFound().build());
    }

    // ── 문의 접수 ────────────────────────────────────────────────
    @PostMapping("/inquiry")
    public ResponseEntity<Map<String, String>> submitInquiry(@Valid @RequestBody Inquiry inquiry) {
        inquiryService.save(inquiry);
        return ResponseEntity.ok(Map.of(
            "message", "문의가 접수되었습니다. 빠른 시일 내에 연락드리겠습니다.",
            "status", "SUCCESS"
        ));
    }

    // ── 채용공고 (공개) ───────────────────────────────────────────
    @GetMapping("/recruits")
    public ResponseEntity<?> getRecruits() {
        return ResponseEntity.ok(recruitRepo.findByActiveTrueOrderByCreatedAtDesc());
    }

    // ── FAQ (공개) ────────────────────────────────────────────────
    @GetMapping("/faq")
    public ResponseEntity<?> getFaq() {
        var items = faqRepo.findByVisibleTrueOrderByOrderNumAscCategoryAscCreatedAtAsc();
        // category별 그룹핑
        var grouped = new java.util.LinkedHashMap<String, java.util.List<Map<String,Object>>>();
        for (var f : items) {
            grouped.computeIfAbsent(f.getCategory(), k -> new java.util.ArrayList<>())
                   .add(Map.of("id", f.getId(), "q", f.getQuestion(), "a", f.getAnswer()));
        }
        var result = new java.util.ArrayList<>();
        grouped.forEach((cat, list) -> result.add(Map.of("cat", cat, "items", list)));
        return ResponseEntity.ok(result);
    }

    // ── 메뉴 구조 ────────────────────────────────────────────────
    @GetMapping("/menu")
    public ResponseEntity<List<Map<String, Object>>> getMenu() {
        return ResponseEntity.ok(List.of(
            Map.of("id", "company", "label", "회사소개",
                "children", List.of(
                    Map.of("id", "greeting",     "label", "CEO 인사말",  "path", "/company/greeting"),
                    Map.of("id", "history",      "label", "연혁",         "path", "/company/history"),
                    Map.of("id", "organization", "label", "조직도",       "path", "/company/organization"),
                    Map.of("id", "ci",           "label", "CI 소개",      "path", "/company/ci"),
                    Map.of("id", "location",     "label", "오시는 길",    "path", "/company/location")
                )),
            Map.of("id", "solution", "label", "솔루션",
                "children", List.of(
                    Map.of("id", "guardia", "label", "GUARDiA ITSM",  "path", "/solution/guardia", "badge", "NEW"),
                    Map.of("id", "erp",     "label", "ERP",            "path", "/solution/erp"),
                    Map.of("id", "crm",     "label", "CRM",            "path", "/solution/crm"),
                    Map.of("id", "bi",      "label", "BI",             "path", "/solution/bi")
                )),
            Map.of("id", "business", "label", "사업실적",
                "children", List.of(
                    Map.of("id", "reference", "label", "구축 레퍼런스", "path", "/business/reference"),
                    Map.of("id", "partner",   "label", "파트너",        "path", "/business/partner")
                )),
            Map.of("id", "support", "label", "고객지원",
                "children", List.of(
                    Map.of("id", "notice",  "label", "공지사항",  "path", "/support/notice"),
                    Map.of("id", "faq",     "label", "FAQ",        "path", "/support/faq"),
                    Map.of("id", "catalog", "label", "카탈로그",   "path", "/support/catalog"),
                    Map.of("id", "contact", "label", "문의하기",   "path", "/support/contact")
                )),
            Map.of("id", "recruit", "label", "채용",
                "children", List.of(
                    Map.of("id", "jobs",    "label", "채용공고",   "path", "/recruit/jobs"),
                    Map.of("id", "welfare", "label", "복리후생",   "path", "/recruit/welfare"),
                    Map.of("id", "apply",   "label", "지원하기",   "path", "/recruit/apply")
                )),
            Map.of("id", "news", "label", "뉴스",
                "children", List.of(
                    Map.of("id", "newsroom", "label", "뉴스룸",     "path", "/news/newsroom"),
                    Map.of("id", "blog",     "label", "기술 블로그", "path", "/news/blog")
                ))
        ));
    }
}
